Apache Solr模糊搜索距离参数为2匹配异常及千万级索引配置问题
Solr模糊搜索异常问题排查与解决方案
环境说明
- Java版本:11.0.12 2021-07-20 LTS
- Solr版本:8.9.0
初始问题排查
我将带name字段的CSV文件导入Solr,Name字段类型配置为text_general,模糊搜索使用波浪号~语法,默认编辑距离为2。
初始错误查询
最开始使用的查询语句加了单引号包裹搜索词:
http://localhost:8983/solr/startsolr/select?indent=on&wt=json&q=(Name:'Ellyse~') AND (Name:'Perry~')&sort=field(Name) asc
该查询仅返回Ellysea Perry、Ellys Perry两个结果,未返回符合编辑距离要求的Elly Perry(Ellyse删除2个字符即可得到Elly,符合最大编辑距离2的规则)。
字段配置信息
Name字段配置:
<field name="Name" type="text_general" multiValued="false" indexed="true" stored="true" required="true"/>
text_general类型配置:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
初始问题根因与解决
单引号在Solr标准查询解析器中是短语查询的标识,包裹Ellyse~后,解析器会将整个Ellyse~作为普通字符串匹配,不会识别波浪号的模糊搜索语法。去掉单引号后即可正常匹配,修改后查询语句:
http://localhost:8983/solr/startsolr/select?indent=on&wt=json&q=(Name:Ellyse~) AND (Name:Perry~)&sort=field(Name) asc
大数据量下模糊搜索失效解决方案
索引1600万条记录后,出现特定关联4万条记录的token模糊搜索失效、其余场景正常的问题,是因为Solr为了控制模糊搜索的性能,默认设置了候选term扩展上限,需要调整solrconfig.xml中的相关参数:
失效根因
Solr模糊查询默认最多只扩展匹配前50个符合编辑距离的候选term,你遇到问题的token属于高频term,符合编辑距离要求的候选term数量超过了默认上限,需要的匹配结果被截断。
参数调整方案
- 首先可以在查询URL中临时加参数验证,添加
&fuzzyMaxExpansions=500测试是否能正常返回结果,确认是扩展上限问题后再修改配置永久生效。 - 编辑
solrconfig.xml,找到标准查询解析器的配置节点,调整fuzzyMaxExpansions参数,可根据场景调整到500~1000(不要设置过高避免性能损耗):
<queryParser name="standard" class="org.apache.solr.search.StandardQParserPlugin"> <int name="fuzzyMaxExpansions">500</int> <!-- 可选优化:设置模糊查询前缀长度为1,要求第一个字符完全匹配,减少候选term数量提升性能 --> <int name="fuzzyPrefixLength">1</int> </queryParser>
如果使用的是EDisMax查询解析器,对应调整参数为fuzzy.maxExpansions。
3. 配置修改完成后重启Solr节点生效,集群环境需所有节点同步修改后重启。
内容的提问来源于stack exchange,提问作者Kamal Vijay
相关产品推荐
相关产品推荐

