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
相关产品推荐
相关产品推荐

