Elasticsearch中是否有类似subquery的功能?嵌套文档查询问题
Elasticsearch实现多嵌套对象匹配的解决方法
你遇到的问题核心是错误地将多个条件放在同一个nested查询中,导致Elasticsearch尝试在单个human嵌套对象里同时匹配name=adrian和name=simon,这自然找不到结果。正确的做法是给每个name条件单独创建一个nested查询,再用bool must组合它们,这样就能匹配到包含两个不同human对象的文档。
步骤1:确认索引mapping(确保nested类型正确)
首先你的test_index的mapping应该正确设置human为nested类型:
PUT /test_index { "mappings": { "properties": { "human": { "type": "nested", "properties": { "name": { "type": "keyword" } } } } } }
步骤2:插入测试文档
比如插入包含adrian和simon的目标文档:
POST /test_index/_doc/1 { "human": [ { "name": "adrian" }, { "name": "simon" }, { "name": "lisa" } ] }
步骤3:正确的查询DSL
用多个独立的nested查询包裹每个name条件,再通过bool must组合:
POST /test_index/_search { "query": { "bool": { "must": [ { "nested": { "path": "human", "query": { "term": { "human.name": "adrian" } } } }, { "nested": { "path": "human", "query": { "term": { "human.name": "simon" } } } } ] } } }
原理说明
- 每个
nested查询会独立遍历文档中的所有human对象,只要找到一个匹配的对象就算满足该条件。 bool must要求所有nested查询都匹配成功,也就是文档中必须同时存在name=adrian的human对象和name=simon的human对象,不管它们是不是同一个。
这样就能正确返回包含这两个名字的文档了。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

