Elasticsearch嵌套文档查询问题:匹配主文档与嵌套子文档
解决方案
要同时返回独立产品文档和包含目标子产品的根文档,得用bool查询的should子句,把两种匹配逻辑组合起来:一是匹配文档自身的字段,二是匹配嵌套的children字段内容。
通用查询示例
以查询product_id:6690-2为例,你可以直接把查询值换成关键词(比如"Leuko")或类别名称,同时根据实际字段调整fields列表:
{ "query": { "bool": { "should": [ // 匹配独立产品的自身字段 { "multi_match": { "query": "6690-2", "fields": ["product_id", "name", "category"] // 替换成你实际用的字段 } }, // 匹配包含目标子产品的根文档 { "nested": { "path": "children", "query": { "multi_match": { "query": "6690-2", "fields": ["children.product_id", "children.name", "children.category"] // 嵌套字段的完整路径 } }, "inner_hits": { // 可选:返回根文档中匹配的具体子产品详情 "_source": ["children.product_id", "children.name"] } } } ], "minimum_should_match": 1 // 满足任一条件就返回 } } }
关键点解释
bool.should:用来并列两个查询分支,只要满足其中一个分支的条件,文档就会被检索出来- 第一个分支:直接匹配当前文档的字段,对应独立产品的情况
- 第二个分支:用
nested查询指定children路径,专门在嵌套文档里匹配目标条件,对应包含子产品的根文档 inner_hits:可选配置,会在返回结果里附带根文档中匹配的子产品信息,方便你确认具体是哪个子产品触发了匹配- 如果是做全文搜索关键词(比如"Leuko"),只要把
query的值换成关键词,确保fields里的字段是text类型就行
场景化调整
- 精确匹配product_id:如果不需要模糊匹配,可以把
multi_match换成term查询,性能更好:
// 独立产品的精确匹配 { "term": { "product_id": "6690-2" } } // 嵌套子产品的精确匹配 { "nested": { "path": "children", "query": { "term": { "children.product_id": "6690-2" } } } }
- 多条件组合查询:如果要同时匹配关键词和类别,可以在每个分支里再嵌套
bool.must组合条件。
内容的提问来源于stack exchange,提问作者Juan Manuel Rodulfo Salcedo
相关产品推荐
相关产品推荐

