Solr文本搜索不起作用

时间:2014-09-04 04:13:21

标签: solr

我使用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>

1 个答案:

答案 0 :(得分:1)

首先:请使用正确的字段类型来存储日期,因为这样可以让您以合适的方式实际处理日期,包括索引,分面,在间隔内检索记录等。

整个问题源于您的字段定义,根本不适合日期处理。将TextField与StandardTokenizer一起使用会对您提供的格式的内容产生奇怪的影响,并且您将拥有太短而无法用于索引的令牌。将LowerCasing和StopFiltering应用于日期也不是一个好主意。

如果您确实想要避免使用正确的类型,并希望将其实现为TextField,那么您必须使其符合您要编制索引的内容类型。您似乎有一个由,分隔的日期列表,因此您最好使用PatternTokenizer - 将每个日期拆分为单独的令牌,然后再对其执行任何操作。

The example on the wiki用于解析此格式(由可选空格和,分隔的标记):

<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*" />

由于令牌的其余部分是您想要查询字段的一部分,因此您不希望应用任何过滤器(并且无需为索引和查询提供相同的标记器和过滤器序列,如果它们'相同)。