Skip to content

聚合入门

什么是聚合?

聚合(Aggregation) 用于对数据进行统计、分组、计算,可类比 SQL 里的 GROUP BYCOUNTSUMAVG 等。聚合可以和查询组合:先按 query 过滤,再对过滤结果做 aggs;也可以不写 query,对全索引做聚合。


聚合的三种类型

类型作用
桶聚合(Bucket)把文档分到不同“桶”里,相当于分组
指标聚合(Metric)对文档做计算:计数、求和、平均、最大最小等
管道聚合(Pipeline)对其它聚合的结果再做聚合(如求移动平均)

本节主要讲桶聚合指标聚合


常用桶聚合

terms:按字段值分组

按某个字段的值分组,每个值一个桶(常用于 keyword 或 keyword 子字段):

http
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "by_author": {
      "terms": {
        "field": "author",
        "size": 10
      }
    }
  }
}
  • size: 0:不返回 hits,只返回聚合结果,节省流量。
  • terms.field:分组字段,一般用 keyword 类型。
  • terms.size:返回前 N 个桶(默认 10)。

返回中 aggregations.by_author.buckets 为桶数组,每项有 key(分组值)和 doc_count(文档数)。

date_histogram:按时间间隔分组

按时间间隔(如按天、按小时)分桶,适合时序数据:

http
GET /logs/_search
{
  "size": 0,
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "day"
      }
    }
  }
}

range:按数值范围分组

按给定区间分桶:

http
"aggs": {
  "price_ranges": {
    "range": {
      "field": "price",
      "ranges": [
        { "to": 50, "key": "0-50" },
        { "from": 50, "to": 200, "key": "50-200" },
        { "from": 200, "key": "200+" }
      ]
    }
  }
}

filter:单桶

只保留满足条件的文档到一个桶,常与子聚合配合:

http
"aggs": {
  "high_price": {
    "filter": { "range": { "price": { "gte": 100 } } },
    "aggs": {
      "avg_price": { "avg": { "field": "price" } }
    }
  }
}

常用指标聚合

  • value_count:非空值个数。
  • sum / avg / min / max:求和、平均、最小、最大。
  • stats:一次性得到 count、sum、min、max、avg。
  • extended_stats:在 stats 基础上加方差、标准差等。
  • cardinality:去重计数,类似 SQL 的 COUNT(DISTINCT field)

示例:按作者分组,并求每组的平均年份和文档数:

http
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "by_author": {
      "terms": { "field": "author" },
      "aggs": {
        "avg_year": { "avg": { "field": "year" } }
      }
    }
  }
}

每个 by_author 的桶里会多一个 avg_year 对象,包含 value(平均值)。


聚合 + 查询

先过滤再聚合:在请求里同时写 queryaggs,ES 会先执行 query,再对命中文档做聚合:

http
GET /my_index/_search
{
  "size": 0,
  "query": {
    "range": { "year": { "gte": 2023 } }
  },
  "aggs": {
    "by_author": {
      "terms": { "field": "author" }
    }
  }
}

聚合结果解读

  • aggregations.聚合名.buckets:桶列表,每项通常有 keydoc_count
  • 子聚合会出现在对应桶的同名键下,如 avg_year.value
  • 指标聚合(如 avg、sum)直接给出 value

掌握 terms、date_histogram、range、filter 以及 sum/avg/cardinality,就足以完成大部分统计需求;更复杂的可查阅官方 Aggregations 文档。