Elasticsearch nested类型数据多条件排除查询实现方案求助
问题分析
你当前的DSL存在布尔逻辑错误:
你要判断「元素不满足(id=1且amount=0)」,根据德摩根定律等价于「id≠1 或 amount≠0」,但你现有DSL的must_not下并列两个term,是逻辑与的关系,要求元素同时满足id≠1且amount≠0才会匹配,和需求逻辑不符。
另外你的字面规则描述和预期结果存在冲突:
- 按字面规则「存在至少一个不满足id=1且amount=0的元素就保留」,你的第二个示例文档存在
{id:2,amount:1}符合保留条件,也应该被返回 - 结合你给出的保留原因和预期结果,你的真实需求应为:存在至少一个id=1且amount≠0的list元素时保留文档,否则排除
对应查询DSL
1. 符合字面规则的DSL(会返回两个示例文档)
{ "query": { "bool": { "must": [ { "nested": { "path": "list", "query": { "bool": { "must_not": [ { "bool": { "must": [ {"term": {"list.id": 1}}, {"term": {"list.amount": 0}} ] } } ] } } } } ] } } }
2. 符合你预期结果的DSL(仅返回第一个示例文档)
如果仅需要匹配id=1且amount不等于0的场景,写法如下:
{ "query": { "bool": { "must": [ { "nested": { "path": "list", "query": { "bool": { "must": [ {"term": {"list.id": 1}}, {"bool": {"must_not": {"term": {"list.amount": 0}}}} ] } } } } ] } } }
内容的提问来源于stack exchange,提问作者yang
相关产品推荐
相关产品推荐

