Solr Ngram过滤器后通过Pattern replacement filter为token追加*方案咨询
实现方案
你可以直接使用Solr内置的PatternReplaceFilterFactory完成需求,无需开发自定义插件,仅需要调整现有查询分析器的过滤器顺序即可。
修改后的完整配置
<analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="1"/> <filter class="solr.LengthFilterFactory" min="2" max="100" /> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt" /> <filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="30" /> <!-- 新增以下过滤器,给所有NGram生成的token末尾加* --> <filter class="solr.PatternReplaceFilterFactory" pattern="(.*)" replacement="$1*" replace="all" /> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer>
配置说明
- 新增的过滤器放在
NGramFilterFactory之后、RemoveDuplicatesTokenFilterFactory之前,确保只处理NGram生成的所有token,不会影响前面环节的处理结果 - 正则规则
(.*)会完整匹配每个token的内容,$1*表示保留原token内容不变,同时在末尾追加*符号 replace="all"参数保证所有符合匹配规则的token都被处理,没有遗漏
注意事项
- 修改配置后需要重启Solr节点,或者重载对应Collection的配置才能生效
- 如果后续还有其他针对token的处理逻辑,需要确认带的token不会被后续过滤器误处理,比如被特殊字符清理规则删除符号
内容的提问来源于stack exchange,提问作者Karthick S
相关产品推荐
相关产品推荐

