ElasticSearch 1.7.5嵌套对象OR查询:获取缺失指定ID字段的文档
你的查询无法正确实现需求,问题及修正方案如下
嘿,你的这个查询语句存在几个关键问题,导致它没法准确匹配到所有未分配coordinator.id或participant.id的文档,我给你拆解下:
问题点
- Nested查询的path参数不支持多路径:Elasticsearch 1.7的
nested查询要求path只能指定单个嵌套对象的路径,你写成"coordinator, participant"是不合法的,ES会无法识别这个路径。 - Nested内部的字段路径错误:当使用
nested查询时,内部的字段应该是相对于path的相对路径。比如path设为coordinator时,字段应该写id而非coordinator.id——因为nested查询已经限定了当前的路径范围。 - 未覆盖嵌套对象本身不存在的情况:你的原始查询只会匹配那些存在
coordinator或participant嵌套对象,但id缺失的文档。但如果某个文档本身就没有coordinator这个嵌套对象,那这个查询根本不会命中它,而这其实也属于“未分配coordinator.id”的场景。 - Filter中的
or不规范:在ES 1.7中,虽然过滤器里的or语法可能生效,但更推荐使用bool查询的should子句来实现逻辑或,这样更符合ES的查询规范,也更清晰。
正确的查询语句
{ "query": { "bool": { "should": [ // 匹配coordinator不存在 或 coordinator.id缺失的文档 { "bool": { "should": [ { "missing": { "field": "coordinator" } }, { "nested": { "path": "coordinator", "query": { "constant_score": { "filter": { "missing": { "field": "id" } } } } } } ], "minimum_should_match": 1 } }, // 匹配participant不存在 或 participant.id缺失的文档 { "bool": { "should": [ { "missing": { "field": "participant" } }, { "nested": { "path": "participant", "query": { "constant_score": { "filter": { "missing": { "field": "id" } } } } } } ], "minimum_should_match": 1 } } ], "minimum_should_match": 1 } } }
逻辑说明
这个查询通过多层bool should来覆盖所有符合需求的场景:
- 外层
bool should实现“coordinator相关缺失”或“participant相关缺失”的逻辑或,只要满足其中一类条件就会匹配文档。 - 每个内部的
bool should处理两类子情况:要么嵌套对象本身不存在(用missing过滤器检测整个coordinator/participant字段),要么嵌套对象存在但id字段缺失(用nested查询结合missing过滤器)。 minimum_should_match:1确保每个bool块中只要满足一个子条件就会被匹配。
另外补充:ES 1.7中的missing过滤器会自动匹配字段不存在、字段值为null或空字符串的情况,刚好符合你“未分配id”的需求。
内容的提问来源于stack exchange,提问作者kolurbo
相关产品推荐
相关产品推荐

