指标聚合算什么
指标聚合对数值字段做计算: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 越高越准、成本越大 |
| stats | count/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 或超时;先缩小查询时间范围,或改用更高精度的近似方案。