ElasticSearch 6.8如何实现两个range查询满足任一条件即匹配文档
Elasticsearch 6.8 实现两字段OR逻辑range查询方案
错误原因
之前查询结果不符合预期,核心是没搞清楚bool查询should子句的默认匹配规则:
- 当
bool查询内不存在must或filter子句时,should中的条件默认要求至少匹配1个 - 当
bool查询内存在must或filter子句时,should中的条件仅参与相关性算分,不做强制匹配要求,因此会返回不满足任一should条件的文档 - 直接将两个range条件放入
must属于AND逻辑,要求两个条件同时成立,不符合「任一匹配即可」的OR需求
正确查询语句
将两个range条件放入内层bool的should数组,显式设置minimum_should_match: 1强制要求至少匹配一个条件,再将这个内层bool放入外层的filter上下文(无算分需求时filter性能更优),完整代码:
{ "query": { "bool": { "filter": [ { "bool": { "should": [ { "range": { "discount_a": { "gte": 10 } } }, { "range": { "discount_b": { "gte": 15 } } } ], "minimum_should_match": 1 } } ], "must": [], "should": [], "must_not": [] } }, "from": 0, "size": 500 }
注意点
- 显式声明
minimum_should_match: 1是兼容性最好的写法,不会因为bool结构调整、ES版本差异出现逻辑偏差 filter上下文不会计算文档相关性得分,查询速度更快,支持结果缓存,适合这类不需要按匹配度排序的过滤场景- 该查询会覆盖三类符合预期的文档:仅满足discount_a≥10、仅满足discount_b≥15、同时满足两个条件
内容的提问来源于stack exchange,提问作者billrichards
相关产品推荐
相关产品推荐

