为何Elasticsearch多层嵌套查询中跨路径查询仍返回正确结果?
Elasticsearch嵌套查询路径行为解析
索引结构
{ "obj1": { "type": "nested", "properties": { "A": { "type": "keyword" } } }, "obj3": { "type": "nested", "properties": { "B": { "type": "keyword" } } } }
问题场景
如上述结构所示,obj1.A是嵌套在obj1下的字段,obj3.B则是完全独立于obj1的另一个嵌套字段。但执行以下嵌套查询时,即便将obj3的查询嵌套在obj1的path范围内,依然能正确匹配到obj3.B的内容:
查询语句
{ "query": { "nested": { "path": "obj1", "query": { "bool": { "must": [ { "match": { "obj1.A": "value1" } }, { "nested": { "path": "obj3", "query": { "bool": { "must": [ { "match": { "obj3.B": "value1" } } ] } }, "score_mode": "avg" } } ] } }, "score_mode": "avg" } } }
原因解析
核心原因是:Elasticsearch中嵌套查询的path参数始终是基于文档根节点的全局路径,不受外层嵌套查询的路径范围限制。
当你在一个嵌套查询内部再嵌套另一个nested查询时,内层的path依然会直接指向文档根下的对应嵌套对象,而不是相对于外层嵌套的path。也就是说,外层的obj1嵌套查询只是限定了它自身的查询上下文是obj1的嵌套文档,但内层的obj3嵌套查询会重新切换到obj3的嵌套上下文,和外层的path没有相对路径的关联。
这种设计是为了让嵌套查询可以灵活组合不同的嵌套对象,不需要考虑层级嵌套的相对位置,每个nested子查询都独立指定自己要操作的全局嵌套路径。
内容的提问来源于stack exchange,提问作者beatrice
相关产品推荐
相关产品推荐

