Solr空查询无法获取数据,括号为何影响'-filed:*'查询结果?
Solr查询括号影响负查询结果的原因解析
- 该差异由Lucene/Solr默认查询解析器的负查询子句解析规则导致,核心和括号的作用域绑定逻辑相关。
- 基础语法规则说明:单独的负查询(以
-开头的子句)无法独立返回有效结果集,它必须依附于至少一个正向匹配的查询子句才能生效,作用是从正向子句匹配到的结果集中排除对应文档。 - 带括号的错误查询逻辑:
你写的(-projectMaintainUserIds:*) AND (-leadsStatus:12)中,括号会强制把内部的子句作为独立单元计算结果。第一个括号内的-projectMaintainUserIds:*是没有正向条件的独立负查询,本身返回空结果集;第二个括号内的-leadsStatus:12同样是独立负查询,返回结果集也为空;两个空集做AND运算后结果还是空,所以整个过滤条件没有匹配到任何文档,最终查询返回空。 - 去掉括号后的正确查询逻辑:
没有括号限制的-projectMaintainUserIds:* AND -leadsStatus:12不会被拆分为两个独立负查询单元,而是直接附加到当前请求的主正向查询(即q参数的status:1)上,整体逻辑为:先匹配所有status=1的文档,再从该结果集中排除projectMaintainUserIds字段不存在的文档,同时排除leadsStatus=12的文档,返回结果就符合预期。
额外补充:如果确实需要用括号包裹负查询,只需要在括号内补充全量正向匹配条件即可,比如写成
(*:* AND -projectMaintainUserIds:*) AND (*:* AND -leadsStatus:12)也能得到正确结果,只是写法不如去掉括号简洁。
内容的提问来源于stack exchange,提问作者JD.Tian
相关产品推荐
相关产品推荐

