solr负查询失效
方案1失败原因分析
查询结构为 *:* AND (-series:[* TO *] OR -name:[* TO *] OR -stock:[* TO *] OR -brand:[* TO *])
,存在以下问题:
- 括号内表达式为纯负查询的OR组合,缺少正查询基础
- Solr 4.6.1解析器优先处理括号内容时,无法独立评估纯负条件
- 即使外层存在
*:*
作为正查询,查询优化器可能先处理无效的负条件组合
方案2成功原因解析
查询结构为 (*:* -series:[* TO *]) OR (*:* -name:[* TO *]) OR (*:* -stock:[* TO *]) OR (*:* -brand:[* TO *])
,具有以下优势:
- 每个子句都是独立完整的正负组合查询
*:* -field:[* TO *]
构成合法的查询单元- OR连接的每个分支都满足Solr必须包含正查询的原则
- 查询引擎可以独立评估每个子句后再合并结果
Solr查询核心原则
负查询必须依附于正查询存在,以下两种形式等效:
field:value -otherfield:value // 显式正查询
*:* -requiredfield:[* TO *] // 通配正查询
避免出现(-a OR -b)
这种纯负逻辑组合,必须转换为(*:* -a) OR (*:* -b)
形式。