我使用solr.TextField而不是solr.DateField来存储日期值。
假设我有" date" field value =" 20/10 / 2014,20 / 5/2015",我正在尝试搜索" 20/10 / 2014"为了得到这个记录。但它不起作用。
我的查询如下:q=*:*&fq=date:20/10/2014
请帮助我如何配置字段或查询以获取记录。
<field name="date" type="text_general" indexed="true" stored="true"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
答案 0 :(得分:1)
首先:请使用正确的字段类型来存储日期,因为这样可以让您以合适的方式实际处理日期,包括索引,分面,在间隔内检索记录等。
整个问题源于您的字段定义,根本不适合日期处理。将TextField与StandardTokenizer一起使用会对您提供的格式的内容产生奇怪的影响,并且您将拥有太短而无法用于索引的令牌。将LowerCasing和StopFiltering应用于日期也不是一个好主意。
如果您确实想要避免使用正确的类型,并希望将其实现为TextField,那么您必须使其符合您要编制索引的内容类型。您似乎有一个由,
分隔的日期列表,因此您最好使用PatternTokenizer
- 将每个日期拆分为单独的令牌,然后再对其执行任何操作。
The example on the wiki用于解析此格式(由可选空格和,
分隔的标记):
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*" />
由于令牌的其余部分是您想要查询字段的一部分,因此您不希望应用任何过滤器(并且无需为索引和查询提供相同的标记器和过滤器序列,如果它们'相同)。