ElasticSearch查询:筛选仅含指定状态的嵌套数组记录
ElasticSearch 查询仅包含特定状态的嵌套数组记录
要实现仅返回submittedJobs数组中**所有元素状态均为"PendingPM"**的文档,需要结合嵌套查询的正向匹配与反向排除逻辑,具体方案如下:
解决方案查询
{ "query": { "bool": { "filter": [ // 确保文档至少包含一条状态为PendingPM的提交记录 { "nested": { "path": "submittedJobs", "query": { "term": { "submittedJobs.status.keyword": "pendingpm" } } } } ], "must_not": [ // 排除包含任何非PendingPM状态的文档 { "nested": { "path": "submittedJobs", "query": { "bool": { "must_not": [ { "term": { "submittedJobs.status.keyword": "pendingpm" } } ] } } } } ] } } }
关键逻辑说明
- 正向匹配:通过
filter中的嵌套查询,确保文档至少存在一条状态为PendingPM的提交记录(对应需求中数组非空且全为目标状态的前提)。 - 反向排除:通过
must_not中的嵌套查询,彻底排除任何包含非PendingPM状态提交记录的文档——只要数组里有一个元素状态不符合,整个文档就会被过滤掉。
注意事项
根据字段映射,submittedJobs.status.keyword使用了lowercase_normalizer,意味着存储时状态值会被转成小写,因此查询时必须使用小写的"pendingpm"才能匹配成功,否则会出现匹配不到的情况。
结果验证
- 示例中的document #2,所有
submittedJobs元素的状态均为PendingPM,会被正常返回; - document #1包含
PendingClient状态的元素,会被must_not条件排除,不会出现在结果中。
内容的提问来源于stack exchange,提问作者Murtaza Multan
相关产品推荐
相关产品推荐

