首页/数据/NoSQL 速查/terms 聚合:按字段分组统计
Elasticsearch89 条

terms 聚合:按字段分组统计

terms 聚合按字段值分桶计数,字段必须是 keyword 或数值(text 会因 fielddata 关闭而报错);size 控制返回桶数量,结果含误差提示字段。

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

terms 聚合是什么

terms 聚合按字段值分桶计数,是最常用的分组统计:字段必须是 keyword 或数值类型,text 字段因 fielddata 默认关闭会直接报错。size 控制返回的桶数量,排序默认按文档数降序,也可以按子聚合的指标排序。结果中的误差提示字段反映被裁掉的桶,多个分片时前 N 名并不保证精确。

基本信息

用法"aggs": { "名称": { "terms": { "field": "字段", "size": 10 } } }
排序order 可指定 _count、_key 或子聚合指标
误差字段doc_count_error_upper_bound 与 sum_other_doc_count
常用参数size、shard_size、missing、min_doc_count、include/exclude
结构search 的 size 设为 0 可只取聚合结果
适用版本Elasticsearch 7.x / 8.x

典型使用场景

  • 按状态、渠道、地区统计订单分布
  • 按用户统计下单次数,做 TOP 榜
  • 桶内再挂指标聚合,算每组的平均金额
  • 嵌套时间直方图,观察分组随时间的变化
  • 统计日志中错误类型的占比,定位主要问题
  • 统计热门搜索词,为运营提供依据

示例

示例
GET /orders/_search
{
  "size": 0,                                        # 不返回命中文档,只要聚合
  "aggs": {
    "by_status": {
      "terms": {
        "field": "status",
        "size": 10,
        "missing": "unknown",                        # 缺失字段归到一个桶
        "order": { "total_amount": "desc" }          # 按子聚合指标排序
      },
      "aggs": { "total_amount": { "sum": { "field": "amount" } } }
    }
  }
}

关键参数读法

参数作用注意点
size返回桶数量过大会增加协调开销
shard_size每个分片预取的桶数提高可提升结果精度
missing字段缺失时的归类值避免 null 桶难以理解
min_doc_count桶的最小文档数过滤长尾小桶
include/exclude按正则或前缀筛选桶只影响返回不影响统计
order桶排序方式可指定子聚合指标

聚合实践要点

  • 对 text 字段聚合前先确认有 keyword 子字段
  • 排序字段用完整字段名,聚合指标排序要写成嵌套路径
  • 桶数量按需收敛,几百个以上的桶会让响应明显变大
  • 需要精确排名时提高 shard_size,或先把数据落到单分片索引
  • 分页取全部桶用 composite 聚合,它能稳定续取且内存友好
  • 组合统计时注意桶数与子聚合相乘,容易触发桶上限

结果判读要点

  • doc_count 是桶内文档数,_key 是分组值
  • sum_other_doc_count 不为零说明还有桶没返回
  • doc_count_error_upper_bound 大于 0 说明排名可能存在误差
  • 桶内子聚合的 value 为 null 时通常是没有匹配的数值文档
  • 对空值桶要结合 missing 参数判断是否符合业务预期
  • 落库前先确认桶统计口径与业务口径是否一致
search 体里把 size 设为 0 可以跳过 hits 返回,只取聚合结果,减少无用序列化;聚合分析场景几乎都该这么写。
返回桶数量受 size 与 shard_size 影响,多分片时前 N 名可能不精确,需要严格排名时要提高 shard_size 或改用 composite 聚合。
对 text 字段直接聚合会报 fielddata is disabled,改用 keyword 子字段或在映射里事先定义好合适的类型。
桶数量有上限(search.max_buckets,默认 10000),嵌套聚合会把桶数相乘,超限后聚合直接失败,粒度和 size 都要提前估算。

统计口径核对

  • 先加 query 限定时间与状态范围,再看聚合结果
  • 核对 doc_count 与业务系统的口径是否一致
  • sum 的 value 为 null 表示桶内没有数值文档,不等于 0
  • 排名误差用 doc_count_error_upper_bound 判断
  • 需要精确全量排名时提高 shard_size 或先改用 composite 聚合
  • 关键聚合结果与明细抽样比对,避免口径漂移
聚合只统计匹配 query 的文档:忘记加范围条件会把全量历史数据一起算进来,报表数字会明显偏大。
桶默认按文档数降序排序;按 _key 排序适合输出按名称排列的清单,按子聚合指标排序时要写完整的指标路径。

易错点

  • 返回桶数量受 size 与 shard_size 影响,多分片时前 N 名可能不精确,需要精确排名时提高 shard_size
  • 对 text 字段直接聚合报 Fielddata is disabled,先确认字段是不是 keyword 类型
  • 把聚合和大量 hits 一起返回会拖慢响应,聚合场景应把 search 的 size 设为 0
  • 嵌套聚合的桶数相乘后可能超过 max_buckets 上限导致失败,粒度和 size 要一起估算
  • min_doc_count 默认会过滤空桶,统计占比时若忽略这点,分母口径会与预期不同

数据来源与参考

  • Elasticsearch Guide: Terms aggregation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌