Solr5.5在q/fq中指定字段查询时synonymFilterFactory同义词不生效问题
问题根因排查
你遇到的指定字段查询同义词不生效的问题,是由分析链过滤器的执行顺序错误导致的,核心问题有两个:
- 同义词过滤器放在了词干提取过滤器之后
你配置的PorterStemFilterFactory会把单词还原为词干形式,editor经过词干提取后会变为edit,proofreader会变为proofread,这两个词干完全匹配不到你同义词表中配置的editor,proofreader原词规则,导致同义词扩展逻辑根本没有触发。 - 索引阶段的同义词过滤器放在了EdgeNGram过滤器之后
EdgeNGramFilterFactory会把完整单词拆成3-15位的字符片段,拆完之后再执行同义词匹配,根本不可能匹配到完整的原词同义词规则,完全无法生效。
你之前用q=editor能返回所有匹配结果,是因为默认搜索走的是Solr默认的全局搜索字段(通常是配置了正确同义词规则的copyField聚合字段),匹配到了其他字段中包含proofreader的文档,并不是title字段的同义词配置生效了。
修复方案
调整text_suggest_stem的过滤器执行顺序,正确的执行顺序逻辑是:先做同义词扩展,再做词干提取、ngram拆分这类改变原词形态的处理。修改后的配置如下:
<fieldType name="text_suggest_stem" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protectwords.txt"/> <!-- 同义词放在词干、ngram之前执行 --> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.PorterStemFilterFactory"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protectwords.txt"/> <!-- 同义词放在词干之前执行 --> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.PorterStemFilterFactory"/> <!-- 查询阶段不需要加EdgeNGramFilter,避免无效匹配 --> </analyzer> </fieldType>
注意:修改配置后需要全量重新导入数据,索引阶段的配置修改才会生效,再测试
title:editor即可返回title字段包含proofreader的文档。
内容的提问来源于stack exchange,提问作者bo-ni
相关产品推荐
相关产品推荐

