两种区间聚合
range 聚合按显式给出的边界分桶,histogram 按固定步长切分数值。前者适合按业务定义的档位统计(价格带、时长段),后者适合等宽分布观察(每 50 元一档)。两者都属于分桶聚合,桶里可以继续挂指标聚合,也可以再嵌套一层分桶。
边界口径要注意什么
range 的区间是左闭右开:from 含端点、to 不含端点,因此相邻档写成 to:50 与 from:50 不会重复计数。histogram 从 0 起按 interval 平移分桶,负值落在 0 以下的桶里。浮点边界在数据密集处容易出现看似重计的现象,核对时把各档 doc_count 加总与总命中数比对最直接。
基本信息
| range | ranges 数组给出 from/to 边界,to 为开区间 |
|---|---|
| histogram | interval 固定步长,min_doc_count 控制空桶 |
| keyed | keyed: true 时用区间名作为桶键返回 |
| 桶内指标 | 可挂 sum、avg、value_count 等 |
| 适用版本 | Elasticsearch 5.x 起接口稳定 |
示例
示例
GET /products/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": { "field": "price", "keyed": true,
"ranges": [ { "to": 50 }, { "from": 50, "to": 100 }, { "from": 100 } ] },
"aggs": { "avg_qty": { "avg": { "field": "qty" } } }
},
"price_hist": {
"histogram": { "field": "price", "interval": 50, "min_doc_count": 1 }
}
}
}典型使用场景
- 价格带分析:按 0-50、50-100、100 以上观察销量分布
- 时长分档:请求耗时落在各秒级区间的占比
- 等宽直方图:观察指标整体分布是否偏斜或有断层
- 区间内再统计:每个价格档里算平均客单或转化率
- 报表对齐:让聚合结果直接匹配业务的分档定义
参数与边界含义
| 参数 | 含义 | 注意 |
|---|---|---|
| ranges[].from | 区间下界(含) | 不写表示负无穷 |
| ranges[].to | 区间上界(不含) | 不写表示正无穷 |
| keyed | 用区间名作为桶键 | 便于按名字取值,适合固定档位 |
| interval | histogram 步长 | 太小会产生海量桶 |
| min_doc_count | 最小文档数 | 设为 0 会返回空桶 |
区间边界左闭右开,相邻档位不要重复设置同一端点,否则会出现肉眼可见的漏计或重复计数;统计前先想清楚边界归属再下发查询,报表口径里也要写清每一档是否包含端点。
histogram 的 interval 过小会产生大量空桶,聚合的响应体积与内存开销都会上升;用 min_doc_count 过滤空桶,或根据数据分布调大步长。