Elasticsearch 6.8 nested类型字段SQL查询结果不符合预期问题咨询
问题根因
你遇到的匹配错误是SQL转ES DSL的解析引擎逻辑缺陷导致的,和nested类型本身的设计无关:
- nested类型的核心规则是:所有针对同一个嵌套对象内部字段的关联过滤条件,必须放在同一个
nested查询块内,ES才会校验这些条件是否命中同一个嵌套对象。 - 你当前转换得到的DSL把
product_nested_field.codeset的过滤条件、两个product_nested_field.code的过滤条件拆成了三个独立的nested查询,三个查询各自匹配不同的嵌套对象就可以通过校验:- 第一个
nested查询匹配到了你记录里codeset: category1, code:444的嵌套对象 - 第二个
nested查询匹配到了你记录里codeset: category2, code:1234的嵌套对象
最终整条记录被判定为符合条件,效果和普通object类型完全一致,没有用到nested类型的特性。
- 第一个
为什么条件会被拆分
你使用的SQL转ES工具没有识别到product_nested_field.code和product_nested_field.codeset属于同一个nested字段的内部属性,没有把逻辑上关联的组合条件封装到同一个nested查询内部,而是为每个字段的过滤条件单独生成了独立的nested查询,这是解析逻辑的实现缺陷,不是ES本身的行为。
正确的查询写法
如果你要实现「同一个嵌套对象同时满足codeset为category1,且code为1234或444」的逻辑,正确的DSL结构如下:
{ "bool": { "must": [ { "nested": { "path": "product_nested_field", "query": { "bool": { "must": [ {"term": {"product_nested_field.codeset": "category1"}}, {"terms": {"product_nested_field.code": ["1234", "444"]}} ] } } } }, {"terms": {"role_name": ["user", "admin"]}} ] } }
使用这个结构查询时,你的测试记录没有任何一个嵌套对象同时满足两个条件,就不会被误匹配了。
内容的提问来源于stack exchange,提问作者yaroslav prokipchyn
相关产品推荐
相关产品推荐

