ElasticSearch问题:多AND组合OR的查询仅返回后半部分结果
解决Elasticsearch查询逻辑不生效的问题
嘿,我一眼就发现问题所在了!你写的JSON查询里有个关键错误——在should数组的单个对象里重复使用了bool键。JSON对象中相同的键会被后面的覆盖,所以第一个bool条件直接被第二个覆盖了,这就是为什么只有后半部分查询生效的原因。
修正后的查询语句
你需要把两个逻辑分支拆成should数组里的两个独立元素,每个元素对应一个bool查询,这样就能正确实现(A && !B) || (C && !D)的逻辑了:
{ "query": { "bool": { "should": [ { "bool": { "must": [{"term": {"field1": "1"}}], "must_not": [{"term": {"field2": "a"}}] } }, { "bool": { "must": [{"term": {"field3": "2"}}], "must_not": [{"term": {"field4": "b"}}] } } ] } } }
逻辑对应说明
should数组里的两个元素分别对应你需求中的两个OR分支:- 第一个
bool对象:must确保field1 == 1,must_not确保field2 != a,组合起来就是field1 == 1 && field2 != a - 第二个
bool对象:must确保field3 == 2,must_not确保field4 != b,组合起来就是field3 == 2 && field4 != b
- 第一个
- Elasticsearch的
bool查询中,should默认要求至少匹配其中一个分支(如果没有must约束的话),正好符合你OR的需求。
另外注意你原来的查询里field3写的是3,我已经修正成了你需求里的2,如果是笔误的话记得核对哦!
内容的提问来源于stack exchange,提问作者A Crav
相关产品推荐
相关产品推荐

