如何在Elasticsearch中查询不含指定匹配嵌套对象的文档?
Elasticsearch 查询满足条件的文档
针对你需要筛选「不含SR_Middle_Name对象,或该对象值不为Aron」的文档需求,我们可以通过nested查询结合bool逻辑来实现——因为details是数组类型,Elasticsearch默认会扁平化存储数组内的对象,只有用nested查询才能正确关联数组中每个对象的id和value字段。
完整查询语句
{ "query": { "bool": { "should": [ { "must_not": { "nested": { "path": "details", "query": { "term": { "details.id": { "value": "SR_Middle_Name" } } } } } }, { "nested": { "path": "details", "query": { "bool": { "must": [ { "term": { "details.id": "SR_Middle_Name" } }, { "bool": { "must_not": { "term": { "details.value": "Aron" } } } } ] } } } } ], "minimum_should_match": 1 } } }
逻辑拆解
- 第一个
should条件:通过must_not + nested查询,确保文档中完全不存在id为SR_Middle_Name的对象。 - 第二个
should条件:先匹配存在id为SR_Middle_Name的对象,再通过must_not排除该对象value等于Aron的情况。 minimum_should_match: 1:表示只要满足两个条件中的任意一个,文档就会被命中。
注意事项
如果你的details字段还没有设置为nested类型,需要先更新字段映射,否则上述查询无法正确工作。示例映射如下:
{ "mappings": { "properties": { "details": { "type": "nested", "properties": { "id": { "type": "keyword" }, "value": { "type": "keyword" } } } } } }
内容的提问来源于stack exchange,提问作者Юра Вусач
相关产品推荐
相关产品推荐

