Elasticsearch Nested Query:排除含特定子文档的父文档方法
解决Elasticsearch嵌套文档的排除问题
这个问题我之前也碰到过,核心是要理解嵌套查询的匹配逻辑——默认只要有一个子文档符合条件就会返回父文档,但你需要的是完全排除所有包含特定子文档的父文档。
问题根源
你之前的查询逻辑是:匹配包含company.name: Elastic且current: false的子文档的父文档。但因为John Doe的文档里确实存在这样的子文档(CEO那个),所以它会被返回,这和你想要排除所有包含current: true且company.name: Elastic子文档的父文档的需求不符。
正确的查询写法
你需要用must_not结合嵌套查询,检查父文档中是否存在任何一个满足current: true且company.name: Elastic的jobs子文档。只要存在这样的子文档,整个父文档就会被排除:
{ "query": { "bool": { "must_not": [ { "nested": { "path": "jobs", "query": { "bool": { "must": [ { "term": { "jobs.current": true } }, { "term": { "jobs.company.name": "Elastic" } } ] } } } } ] } } }
逻辑解释
must_not:表示不满足以下条件的父文档才会被返回nested:指定查询的嵌套字段路径为jobs- 内部的
bool.must:要求子文档同时满足current: true和company.name: Elastic两个条件
这样一来,John Doe的文档因为包含一个符合条件的子文档(Vice President那个),就会被这个must_not规则排除,不会出现在查询结果里。
额外说明
如果你的需求是“排除所有存在Elastic公司的current=true子文档,同时保留那些只有Elastic公司current=false子文档的父文档”,上面的查询完全可以满足。如果还有其他过滤条件,直接在外层的bool里添加filter或must即可。
内容的提问来源于stack exchange,提问作者mrmbr007
相关产品推荐
相关产品推荐

