首页/数据/NoSQL 速查/range 与 histogram 区间聚合
Elasticsearch89 条

range 与 histogram 区间聚合

range 聚合按显式区间分桶(自定义边界),histogram 按固定步长切分数值;两者都能让统计结果按业务价位、时长等区间展示。

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

两种区间聚合

range 聚合按显式给出的边界分桶,histogram 按固定步长切分数值。前者适合按业务定义的档位统计(价格带、时长段),后者适合等宽分布观察(每 50 元一档)。两者都属于分桶聚合,桶里可以继续挂指标聚合,也可以再嵌套一层分桶。

边界口径要注意什么

range 的区间是左闭右开:from 含端点、to 不含端点,因此相邻档写成 to:50 与 from:50 不会重复计数。histogram 从 0 起按 interval 平移分桶,负值落在 0 以下的桶里。浮点边界在数据密集处容易出现看似重计的现象,核对时把各档 doc_count 加总与总命中数比对最直接。

基本信息

rangeranges 数组给出 from/to 边界,to 为开区间
histograminterval 固定步长,min_doc_count 控制空桶
keyedkeyed: 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用区间名作为桶键便于按名字取值,适合固定档位
intervalhistogram 步长太小会产生海量桶
min_doc_count最小文档数设为 0 会返回空桶
区间边界左闭右开,相邻档位不要重复设置同一端点,否则会出现肉眼可见的漏计或重复计数;统计前先想清楚边界归属再下发查询,报表口径里也要写清每一档是否包含端点。
histogram 的 interval 过小会产生大量空桶,聚合的响应体积与内存开销都会上升;用 min_doc_count 过滤空桶,或根据数据分布调大步长。

易错点

  • 浮点区间边界在数据密集处容易显得漏计或重计,验证时用各档 doc_count 加总与总命中数交叉核对
  • histogram 的 interval 过小会产生海量空桶,响应体积与聚合开销明显上升
  • range 的 to 是开区间,把它当成包含值会漏掉正好等于边界的那批文档
  • 多个聚合用同一个名字会互相覆盖,range 与 histogram 两组结果要分别命名

数据来源与参考

  • Elasticsearch Guide: Range aggregation
  • Elasticsearch Guide: Histogram aggregation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌