Solr过滤查询:如何匹配整/长整数字段不存在或值为0
Solr 字段不存在或值为0的过滤查询实现
原写法失效原因
最初尝试的-field_i:[* TO *] OR field_i:0不生效,核心原因有两点:
- 字段名错误:实际目标字段为
myfield_l,语句中误用了field_i,字段名不匹配会直接导致逻辑失效 - 纯否定子句的执行逻辑限制:Solr 中不带正向匹配上下文的
-前缀否定子句无法独立召回文档——这类子句默认仅会对其他正向条件命中的结果做排除,没有全量匹配的基础时,-myfield_l:[* TO *]无法返回所有字段缺失的文档,最终结果只会返回字段值为0的内容,甚至返回空集。
正确查询语句
全版本兼容写法
所有Solr版本都可以使用的通用写法,给否定子句绑定全量匹配条件*:*,确保字段缺失的逻辑在全量文档范围内执行:
(*:* NOT myfield_l:[* TO *]) OR myfield_l:0
逻辑拆解:
*:*:匹配索引中所有文档(*:* NOT myfield_l:[* TO *]):从全量文档中排除所有存在myfield_l字段的文档,得到字段缺失的文档集合myfield_l:0:匹配所有myfield_l值为0的文档集合- 两个集合通过
OR取并集,完全覆盖要求的两个命中规则。
高版本简洁写法
Solr 4.0及以上版本支持exists判断函数,可以用更简洁的写法实现相同逻辑:
NOT exists(myfield_l) OR myfield_l:0
使用提示
上述语句直接作为fq(过滤查询)参数传入即可正常生效;如果作为q(主查询)参数使用,注意检查最小匹配mm配置,避免配置强制要求所有子句匹配导致结果不符合预期。
内容的提问来源于stack exchange,提问作者Nicholas DiPiazza
相关产品推荐
相关产品推荐

