我运行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”等,以及正确的记录。
是否有一种方法可以消除这些错误的记录而无需重新编制索引?
答案 0 :(得分:1)
否,您必须重新索引,并且必须具有一个字段类型才能产生所需的匹配项。如果您仅对完全匹配,区分大小写和全部感兴趣,则使用string
字段就可以了(然后使用copyField
指令将相同内容复制到这两个字段,因此您不必修改索引代码。
如果您不希望搜索区分大小写,请使用带有KeywordTokenizer
和LowerCaseFilterFactory
的TextField作为链中唯一的过滤器。
如果您考虑索引了John Jepson
,则可以显示必须重新索引的原因。此文本将由您的空白令牌生成器分为John
和Jepson
。然后,仅使用John
发出查询时,Lucene将查找存在令牌John
的任何文档。由于您的索引端处理已为John
创建了单独的令牌,因此它将匹配名称中有John
的任何内容。