You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch嵌套文档数组分组求和查询构建求助

正确实现Elasticsearch嵌套数组的分组求和

首先咱们得搞明白问题出在哪:你的文档里data是数组字段,Elasticsearch默认会把数组扁平化处理——这就导致你用普通的terms+sum聚合时,同一个文档里所有的amount值会被错误关联到每个id上,最终算出的总和完全偏离预期。

先回顾下你的原始文档结构:

{ "xid": "1234567", "time": "12/5/12 5:49 AM", "data": [ { "id": "abc", "amount": 400 }, { "id": "def", "amount": 200 } ] }
{ "xid": "1234568", "time": "13/5/12 7:23 AM", "data": [ { "id": "abc", "amount": 400 }, { "id": "ghi", "amount": 300 } ] }

要解决这个问题,你需要用nested聚合——它能让Elasticsearch把数组里的每个元素当作独立的子文档处理,保证每个id只和对应的amount关联求和。

下面是正确的查询语句:

{
  "aggs": {
    "nested_data": {
      "nested": {
        "path": "data"
      },
      "aggs": {
        "group_by_id": {
          "terms": {
            "field": "data.id.keyword"
          },
          "aggs": {
            "total_amount": {
              "sum": {
                "field": "data.amount"
              }
            }
          }
        }
      }
    }
  }
}

简单拆解下逻辑:

  • 外层的nested聚合指定路径为data,告诉Elasticsearch要单独处理这个数组里的每个元素
  • 嵌套聚合内部用terms聚合按data.id.keyword分组(必须用keyword类型,避免分词干扰)
  • 最后在每个分组里用sum聚合计算对应amount的总和

执行这个查询后,就能得到你预期的结果:

{
  "aggregations": {
    "nested_data": {
      "group_by_id": {
        "buckets": [
          { "key": "abc", "doc_count": 2, "total_amount": { "value": 800 } },
          { "key": "def", "doc_count": 1, "total_amount": { "value": 200 } },
          { "key": "ghi", "doc_count": 1, "total_amount": { "value": 300 } }
        ]
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者Rakesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:04