Elasticsearch中如何结合multi_terms聚合与nested字段?
正确结合multi_terms与nested聚合的解决方案
问题出在你没有在嵌套上下文里正确引用嵌套字段,或者聚合层级结构有误。以下是具体解决方法和示例:
先明确索引结构(示例)
假设你的索引包含根级字段category,以及嵌套字段comments(内部包含author字段),对应的mapping如下:
PUT /my_index { "mappings": { "properties": { "category": { "type": "keyword" }, "comments": { "type": "nested", "properties": { "author": { "type": "keyword" } } } } } }
正确的聚合查询
要统计category(根字段)和comments.author(嵌套字段)的字段对计数,需先通过nested聚合进入嵌套文档上下文,再在其中使用multi_terms,且嵌套字段必须写完整路径:
POST /my_index/_search { "size": 0, "aggs": { // 第一步:进入嵌套字段的上下文 "nested_comments_context": { "nested": { "path": "comments" }, "aggs": { // 第二步:在嵌套上下文中使用multi_terms统计字段对 "category_author_pairs": { "multi_terms": { "terms": [ { "field": "category" }, // 根字段可直接引用 { "field": "comments.author" } // 嵌套字段必须写完整路径 ] } } } } } }
关键注意事项
- 必须先通过
nested聚合指定嵌套字段的路径(比如示例中的comments),否则Elasticsearch无法识别嵌套字段的上下文 multi_terms中的嵌套字段必须写完整路径(比如comments.author),不能只写author,否则会在根级上下文查找该字段,导致找不到数据返回空桶- 根级字段可以在嵌套上下文中直接引用,因为嵌套聚合允许访问根文档的字段
常见错误示例
如果你的查询是下面这样,就会返回空桶:
// 错误:嵌套字段未写完整路径 POST /my_index/_search { "size": 0, "aggs": { "nested_comments": { "nested": { "path": "comments" }, "aggs": { "wrong_pairs": { "multi_terms": { "terms": [ { "field": "category" }, { "field": "author" } // 缺少comments.前缀,导致找不到字段 ] } } } } } }
内容的提问来源于stack exchange,提问作者kplatis
相关产品推荐
相关产品推荐

