提问者:小点点

Solr文本搜索不起作用


我使用solr. TextField而不是solr.DateField来存储日期值。假设我有一条记录,其中“date”字段值=“20/10/2014,20/5/2015”,我正在尝试搜索“20/10/2014”以获取此记录。但它不起作用。我的查询就像:q=*:*

<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个答案

匿名用户

首先:请使用适当的字段类型来存储日期,因为这将允许您以适当的方式实际处理它们,包括索引、分面、在间隔内检索记录等。

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

如果您真的非常非常想避免使用正确的类型,并希望将其实现为TextField,则必须使其适合您正在索引的内容类型。似乎您有一个由分隔的日期列表,因此您最好使用PatternTokenizer来代替-将每个日期拆分为单独的标记,然后不再使用它。

wiki上的示例是为了解析这种格式(由可选空格和分隔的标记):

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

由于令牌的其余部分是您想要查询该字段的方式的一部分,因此您不想应用任何过滤器(如果它们相同,则无需为索引和查询提供相同序列的令牌生成器和过滤器)。