Elasticsearch 6.5.4中has_parent查询无结果问题求助
从你的描述和索引映射来看,我帮你梳理几个可能导致查询无结果的关键点,按优先级排查:
1. 先明确 has_parent 的查询逻辑
首先要确认你对 has_parent 的理解是否正确:这个查询返回的是子文档——也就是那些父文档匹配你指定查询条件的子文档。而你的 join 关系是 threat 作为 date 的父类型,所以:
- 父文档的
hierarchy字段值是{"name": "threat"} - 子文档的
hierarchy字段必须包含{"name": "date", "parent": "<父文档ID>"}
如果你的实际需求是查询父文档本身(比如找 type 为 ip 的 threat 类型文档),那 has_parent 就用错了,应该直接查询父文档类型,比如:
GET my_index*/_search { "query": { "bool": { "must": [ {"term": {"hierarchy.name": "threat"}}, {"term": {"type.keyword": "ip"}} ] } } }
2. 检查是否存在符合条件的父文档
如果你的需求确实是找子文档,那第一步要确认:有没有父文档(threat 类型)满足 type.keyword: ip 的条件?
先执行这个查询验证:
GET my_index/_search { "query": { "bool": { "must": [ {"term": {"hierarchy.name": "threat"}}, {"term": {"type.keyword": "ip"}} ] } } }
如果这个查询返回 0 结果,那 has_parent 自然不会有子文档返回——因为根本没有匹配的父文档。
3. 验证子文档是否正确关联父文档
即使有符合条件的父文档,还要确认子文档是否正确设置了父关联:
执行这个查询查看所有子文档的关联情况:
GET my_index/_search { "query": { "term": {"hierarchy.name": "date"} }, "_source": ["hierarchy"] }
检查返回结果的 hierarchy 字段:
- 必须包含
parent字段 parent的值必须是存在的父文档 ID
如果子文档没有设置 parent,或者 parent 对应的父文档不存在/不满足条件,has_parent 也不会匹配到。
4. 确认索引范围是否正确
你的查询用了 my_index*,但映射显示的是 my_index。先确认所有匹配 my_index* 的索引是否都包含你需要的子文档,且映射一致:
GET _cat/indices/my_index*
如果子文档实际存在于其他索引(比如按日期分片的 my_index-2024.05),但该索引的映射没有正确配置 join 字段,也会导致查询无结果。
5. 检查字段值的精确匹配问题
term 查询是精确匹配,要注意:
type.keyword的值是否确实是小写的ip?有没有大小写差异(比如IP)?- 字段值有没有多余的空格或特殊字符?
可以先用 match 查询模糊验证:
GET my_index/_search { "query": { "match": {"type": "ip"} } }
如果这个查询能返回父文档,说明 type.keyword 的值和你查询的 ip 不匹配,需要调整查询值或检查字段存储的实际内容。
内容的提问来源于stack exchange,提问作者Luis ER

