Elasticsearch 7.x祖孙文档索引查询无结果问题求助
问题分析与修复方案
嘿,我帮你排查出问题所在啦!你现在查询返回空结果的核心原因是Join字段名称不匹配,再加上几个细节问题,导致Elasticsearch根本没识别出文档间的祖孙关系,自然查不到数据。下面一步步给你拆解:
1. 最致命的问题:Join字段名不对应
你在mapping里明明定义的Join字段是my_join_field,但插入所有文档的时候,用的却是relationship这个字段名!Elasticsearch只会认mapping里声明的那个Join字段,这个自定义的relationship字段对它来说就是个普通字段,完全起不到关联父子文档的作用。
修正后的文档插入示例
比如插入美国这个国家文档:
PUT map/_doc/1?refresh { "country.id": 1, "country.countryName": "US", "my_join_field": { "name": "country" } }
插入洛杉矶这个省份文档(注意routing必须和父文档ID一致,这里父文档是ID=1的美国,所以routing=1):
PUT map/_doc/3?routing=1&refresh { "province.id": 3, "province.provinceName": "losangeles", "my_join_field": { "name": "province", "parent": "1" } }
所有城市文档也一样,把relationship全部替换成my_join_field就好。
2. 次要但该注意的问题:数据类型不匹配
你的mapping里把country.id、province.id、city.id都定义成了integer类型,但插入的时候却传了字符串(比如"country.id": "1")。虽然Elasticsearch会自动做类型转换,但规范起见还是改成数字类型比较稳妥,避免后续出现奇怪的问题。
3. 查询DSL的逻辑是对的
等你把前面的问题都修正后,现在的查询DSL逻辑没问题:它是要找包含子文档province,且该province又包含名为maanshan的city子文档的country文档,修正后应该能返回ID为2的CHINA文档。
修复步骤总结
- 把所有插入文档里的
relationship字段统一替换成my_join_field,和mapping保持一致 - 把所有ID字段的值从字符串改成数字(比如
"country.id": "1"改成"country.id": 1) - 删除现有索引里的所有文档,或者直接重建索引后重新插入修正后的文档
- 再次执行你的查询DSL,就能得到正确的结果啦!
内容的提问来源于stack exchange,提问作者xuelai
相关产品推荐
相关产品推荐

