Elasticsearch能否在单次请求中查询按name分组的多个avg平均值结果
结论
该需求完全可以在Elasticsearch中实现,仅需一次查询即可返回所有name对应的DO字段平均值,无需循环发起多次请求。
实现方案
你需要使用terms聚合先按name字段分组,再在每个分组内嵌套avg聚合计算DO字段的平均值即可。
注意:如果你的
name字段是text类型,需要使用它的keyword子字段(通常为name.keyword)做聚合,否则terms聚合无法正常执行。
优化后的查询语句
POST test_entry/_search { "query": { "bool": { "filter": [ { "range": { "Timestamp": { "lte":"now/d" } } } ] } }, "size": 0, "aggs": { "group_by_name": { "terms": { "field": "name.keyword", "size": 1000 // 调整为你的name总数量,默认仅返回前10条结果 }, "aggs": { "DoAvg": { "avg": { "field": "DO" } } } } } }
返回结果示例
返回结果结构和你期望的第一种格式匹配,示例如下:
"aggregations" : { "group_by_name" : { "buckets" : [ { "key" : "name1", "doc_count" : 100, "DoAvg" : { "value" : 7.037004702415825 } }, { "key" : "name2", "doc_count" : 89, "DoAvg" : { "value" : 8.33212312312312 } } ] } }
注意事项
- terms聚合默认仅返回匹配数最高的前10个分组,如果你的name总数量超过10,需要手动调整
terms下的size参数到大于等于总name数,才能拿到全部结果。 - 如果
DO字段是text类型,需要先为它开启字段类型为数值的子字段,才能做平均值聚合。
内容的提问来源于stack exchange,提问作者yeho
相关产品推荐
相关产品推荐

