Solr eDisMax多字段分别配置mm参数查询结果不符合预期问题
问题根因
原有查询语句存在3个核心错误,导致结果不符合预期:
- 重复传递同名请求参数:先后传入了2次
q、defType、mm参数,Solr处理URL参数时默认保留最后一次传入的同名参数值,前面配置的name字段检索规则、75%的mm阈值直接被覆盖,实际生效的只有author字段的OR查询,mm值为最后传入的70%。 - 未添加inStock字段的过滤规则,且直接用OR拼接单字段模糊词的写法,无法实现不同字段独立配置mm阈值的需求——原生eDisMax的mm参数默认作用于全局查询词,无法直接给单个字段单独设置最小匹配要求。
- 模糊匹配写法不严谨:
关键词~的写法默认使用编辑距离2,短词使用默认编辑距离容易出现过度匹配的问题,短词模糊匹配建议设置编辑距离为1,即关键词~1。
正确实现方案
使用Solr嵌套查询+局部参数(LocalParams)能力,给每个字段的检索逻辑单独指定eDisMax解析器、mm阈值、模糊匹配规则,再通过布尔逻辑强制所有条件同时满足,库存过滤条件放到fq参数中提升查询性能,具体语句如下:
curl -G http://$solrIp:8983/solr/testCore2/select \ --data-urlencode "q=+_query_:\"{!edismax qf='name' mm='75%' v='Game~1 Thrones~1 Clash~1'}\" +_query_:\"{!edismax qf='author' mm='70%' v='George~1 R.R.~1 Martin~1'}\"" \ --data-urlencode "fq=inStock:true" \ --data-urlencode "sort=books_id asc"
参数说明:
- 前缀
+表示对应子查询必须命中,即name字段匹配规则、author字段匹配规则需要同时满足 _query_是Solr标准嵌套查询语法,包裹的{!edismax ...}为局部参数声明,为每个子查询单独配置规则:qf限定当前子查询仅在指定字段检索mm为当前子查询单独设置最小匹配阈值,实现两个字段独立的匹配度要求v传入当前子查询的检索词,每个词后缀~1表示开启编辑距离为1的模糊匹配,避免短词过度模糊导致误命中
fq=inStock:true将库存过滤逻辑放到过滤查询中,不参与相关性打分,还可复用Solr过滤器缓存,查询性能更优
调优说明
如果测试时发现mm阈值计算不符合预期(比如name字段3个检索词要求至少命中2个),可微调对应子查询的mm值,例如将name子查询的mm改为67%即可满足3个词至少命中2个的要求。可在请求中追加debug=results参数,查看每个文档在对应子查询中的实际命中词数,确认阈值生效情况。
该语句执行后会排除author字段仅命中1个词(匹配度33%,低于70%要求)的0553573405,仅返回符合要求的2条数据。
内容的提问来源于stack exchange,提问作者user595014
相关产品推荐
相关产品推荐

