首页/数据/NoSQL 速查/指标聚合:avg/sum/stats 等数值计算
Elasticsearch89 条

指标聚合:avg/sum/stats 等数值计算

指标聚合对数值字段做统计:avg、sum、min、max、value_count 返回单值,stats、extended_stats 一次返回均值方差等多个指标。

NoSQL 速查数据更新于 2026-10-13

指标聚合算什么

指标聚合对数值字段做计算:avg、sum、min、max、value_count 各返回一个数;stats、extended_stats 一次给出均值、极值、方差等一组数。它既可以放在查询顶层做全局统计,也可以作为子聚合挂在 terms、date_histogram 下面,实现「先分组再算指标」。

基本信息

适用版本Elasticsearch 7.x / 8.x
单值指标avg / sum / min / max / value_count / cardinality
多值指标stats、extended_stats、percentiles
适用字段数值型字段(依赖 doc_values)
最简写法"aggs": { "a": { "avg": { "field": "price" } } }

典型使用场景

  • 订单金额总体统计:一次 stats 拿到 count/sum/min/max/avg,省掉多次请求
  • 按天分组算指标:date_histogram 下挂 avg/sum,得到每日均值与日销量曲线
  • 按品类分组对比:terms 下挂 stats,快速找出异常品类
  • 波动与离群判断:extended_stats 的标准差或 percentiles 的 P95/P99
  • 去重计数:cardinality 估算当日活跃用户数,成本远低于精确去重

示例

示例
GET /orders/_search
{
  "size": 0,                                         # 只要聚合结果,不带回命中文档
  "query": { "range": { "ts": { "gte": "now-7d/d" } } },
  "aggs": {
    "sales_stats": { "stats": { "field": "price" } },
    "avg_qty":     { "avg": { "field": "quantity", "missing": 0 } },   # 缺失字段按 0 计入
    "p95_amount":  { "percentiles": { "field": "amount", "percents": [95, 99] } },
    "by_category": {
      "terms": { "field": "category", "size": 10 },
      "aggs": { "avg_price": { "avg": { "field": "price" } } }        # 分组内再算指标
    }
  }
}

常用指标对照

指标返回内容注意点
avg平均值缺失该字段的文档不计入分母
sum合计值浮点数为近似累加,精度敏感时用整型分数或 scaled_float
value_count值出现次数多值字段一个文档可能贡献多个值,不等于文档数
cardinality去重后的基数估计近似算法,precision_threshold 越高越准、成本越大
statscount/sum/min/max/avg 一次返回最省请求的组合,日常统计优先用它
extended_stats在 stats 基础上加方差与标准差用于波动分析,字段为空时部分值可能为 null
percentiles指定百分位(默认 1/5/25/50/75/95/99)近似计算,长尾分布的解读要谨慎
指标聚合会忽略缺失该字段的文档:avg 的分母、sum 的加数里都没有它们。口径要求覆盖全量时,要么用 missing 参数补默认值,要么先用 exists 查询核对有多少文档没这个字段。
聚合结果与命中列表互相独立,只统计时把 size 设为 0,可以避免把匹配到的文档一并传回,显著减小响应体。
对高基数字段做 cardinality 或大 terms 聚合,会在协调节点汇总大量桶,容易触发 circuit breaker 或超时;先缩小查询时间范围,或改用更高精度的近似方案。

易错点

  • 字段被映射成 keyword 的数字串不能直接做数值聚合,需要改映射或建运行时字段转换类型
  • sum 对浮点数做近似累加,金额类场景会积累误差 → 用整型分或 scaled_float 存储
  • cardinality 是近似去重,直接当精确值写进报表会与明细对不上 → 需要精确值时用 terms 聚合兜底
  • 缺失字段被静默忽略,导致 sum/avg 口径偏小却看不出来 → 用 missing 参数或 exists 查询核对
  • 忘了设 size:0,聚合查询顺带把命中文档全传回来,响应体成倍膨胀

数据来源与参考

  • Elasticsearch Guide: Metrics aggregations
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌