升级SOLR 4.7至8.9后*:*与(*:*)查询结果不同是什么原因?
Solr版本升级后
q=(*:*)与q=*:*结果数不一致的原因 1. eDisMax解析器的分组查询处理逻辑变更
- Solr 4.7版本中,括号仅作为普通的查询分组符号使用,
q=(*:*)会被直接解析为全匹配查询,和q=*:*的语义完全一致,返回结果数量相同。 - Solr 5.0及后续版本(包括你使用的8.9版本)对eDisMax的解析逻辑做了调整:被括号包裹的查询会被识别为独立的布尔子句,会参与全局查询匹配规则的计算,不再和无括号的全匹配查询等价。
2. 最小匹配数(mm)参数的约束影响
eDisMax的mm(Minimum Should Match)参数默认会根据查询子句数量动态调整匹配要求:
- 无括号的
q=*:*会被识别为全局全匹配语句,直接跳过mm校验,返回索引中所有符合过滤条件的文档。 - 带括号的
q=(*:*)会被拆分为独立的子句参与mm计算,如果你的查询同时配置了qf(查询字段)、pf(短语字段)等隐式子句,mm规则会过滤掉不符合匹配要求的文档,最终返回的结果数少于q=*:*。
3. 空文档匹配逻辑差异
如果你的索引中存在没有任何可索引字段值的空文档:
q=*:*默认会匹配所有文档,包括这类空文档。- 带括号的
(*:*)在新版Lucene/Solr的解析逻辑中,会要求至少存在一个有值的字段匹配*:*规则,会自动排除空文档,也会导致结果数出现差异。
验证方式
你可以通过以下操作快速确认根因:
- 在查询请求中添加
mm=0%参数,重新对比两种查询的结果数,如果结果一致则说明是mm参数约束导致的差异。 - 添加
debug=query参数查看查询解析日志,对比两种语句实际生成的Lucene查询结构,可直接看到语法解析差异。
内容的提问来源于stack exchange,提问作者mdawg
相关产品推荐
相关产品推荐

