Solr精确匹配过滤

时间:2018-09-05 14:11:10

标签: solr

我运行Solr 5.3.1,字段 firstname 具有 firstnametype

<fieldType name="firstnametype" class="solr.TextField" omitNorms="true" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords-firstname.txt" enablePositionIncrements="true" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

现在,我只想查询名字为“ John Jepson”,“ John J”或仅仅是“ John”的记录。

我尝试添加过滤器:

fq=(firstname:"John Jepson" OR firstname:"John J" OR firstname:"John")

但是结果记录包含名字中的“ John Francis”,“ Avram John”,“ Frederich John”等,以及正确的记录。

是否有一种方法可以消除这些错误的记录而无需重新编制索引?

1 个答案:

答案 0 :(得分:1)

否,您必须重新索引,并且必须具有一个字段类型才能产生所需的匹配项。如果您仅对完全匹配,区分大小写和全部感兴趣,则使用string字段就可以了(然后使用copyField指令将相同内容复制到这两个字段,因此您不必修改索引代码。

如果您不希望搜索区分大小写,请使用带有KeywordTokenizerLowerCaseFilterFactory的TextField作为链中唯一的过滤器。

如果您考虑索引了John Jepson,则可以显示必须重新索引的原因。此文本将由您的空白令牌生成器分为JohnJepson。然后,仅使用John发出查询时,Lucene将查找存在令牌John的任何文档。由于您的索引端处理已为John创建了单独的令牌,因此它将匹配名称中有John的任何内容。