Solr含冒号字符串搜索异常 完整词查询无结果问题排查
问题根因
这个问题是字段类型的N-gram分词配置参数错误导致的,具体逻辑:
- 从字段名
tcngramm_*可以判断,这两个字段用的是前缀N-gram(EdgeNGram)分词策略,这种策略会把输入的单词从首字符开始,依次切出不同长度的前缀分词项存入倒排索引。 - 你当前配置的
maxGram(最大生成分词项长度)阈值刚好是25:- 能搜到的关键词
ontwikkelingsdoelstelling字符长度恰好是25,索引中存在对应长度的分词项,所以可以命中 - 搜不到的
ontwikkelingsdoelstellinge长度为26、ontwikkelingsdoelstellingen长度为27,索引阶段切分前缀时最长只切到25位,不会生成26、27位长度的分词项
- 能搜到的关键词
- 你的查询分析链没有对输入的搜索词做和索引端一致的截断/切分处理,直接拿完整长度的搜索词去匹配倒排索引,自然找不到对应分词项,返回无结果。
- 标题字段值末尾的冒号属于标点符号,会被分词器的标点过滤规则处理,不影响这个问题的核心逻辑;长描述字段出现完全相同的现象,也是同一个配置问题导致的——截断到25位长度的词能匹配上索引里的25位前缀分词项,完整长词匹配不上。
修复方法
- 找到这两个字段对应的字段类型配置,把EdgeNGram分词器/过滤器的
maxGram参数调大,一般设置为35~40就可以覆盖绝大多数荷兰语常用长词,你也可以根据自己业务的实际语料调整到合适值 - 检查查询阶段的分析配置,保证和索引阶段的预处理逻辑对齐:比如索引阶段做了小写转换、标点过滤,查询阶段也要加相同的处理器;如果索引用了N-gram切分,查询端要么复用相同的N-gram切分逻辑,要么做对应的适配,避免两边生成的分词项不匹配
- 配置修改完成后,对所有相关字段做全量索引重建,让存量文档的长词生成符合新长度规则的分词项,之后再查询就可以正常命中了。
内容的提问来源于stack exchange,提问作者Sidra Sultana
相关产品推荐
相关产品推荐

