Appearance
聚合入门
什么是聚合?
聚合(Aggregation) 用于对数据进行统计、分组、计算,可类比 SQL 里的 GROUP BY、COUNT、SUM、AVG 等。聚合可以和查询组合:先按 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(平均值)。
聚合 + 查询
先过滤再聚合:在请求里同时写 query 和 aggs,ES 会先执行 query,再对命中文档做聚合:
http
GET /my_index/_search
{
"size": 0,
"query": {
"range": { "year": { "gte": 2023 } }
},
"aggs": {
"by_author": {
"terms": { "field": "author" }
}
}
}聚合结果解读
- aggregations.聚合名.buckets:桶列表,每项通常有 key、doc_count。
- 子聚合会出现在对应桶的同名键下,如
avg_year.value。 - 指标聚合(如 avg、sum)直接给出 value。
掌握 terms、date_histogram、range、filter 以及 sum/avg/cardinality,就足以完成大部分统计需求;更复杂的可查阅官方 Aggregations 文档。