Elasticsearch 7.13:用must_not实现OR逻辑的查询需求
Elasticsearch 查询实现方案
需求回顾
- 强制过滤条件:
district_id = 123456 - 筛选规则:保留不满足条件A(
district_name不匹配"Mydist")或不满足条件B(state_id不等于123)的记录,即排除同时满足A和B的记录。
问题分析
你最初的查询中,must_not 数组内的多个条件是AND逻辑,即要求记录同时不满足A和B才会被保留,这和需求的OR逻辑不符。要实现需求,需要将A和B用bool.must组合后放入must_not,这样就能排除那些同时满足A和B的记录,剩下的就是符合要求的结果。
正确查询代码
{ "query": { "bool": { "filter": [ { "term": { "district_id": { "value": 123456 } } } ], "must_not": [ { "bool": { "must": [ { "match": { "district_name": { "query": "Mydist" } } }, { "term": { "state_id": { "value": 123 } } } ] } } ] } } }
逻辑说明
filter部分:确保所有返回记录都满足district_id=123456,这部分不参与评分,仅做数据过滤。must_not部分:内部嵌套的bool.must要求记录同时满足A和B,而must_not会排除这类记录,最终保留的就是:- 满足A但不满足B的记录
- 满足B但不满足A的记录
- 既不满足A也不满足B的记录
完全符合你需求中的“不满足A或不满足B”的筛选规则。
内容的提问来源于stack exchange,提问作者Irfan Ulla
相关产品推荐
相关产品推荐

