聚合基础
在 Elasticsearch 中,聚合(Aggregation)是一种强大的数据分析工具,允许用户对数据进行分组、计算和汇总。通过聚合,用户可以从大量数据中提取有用的统计信息、趋势和见解。聚合是搜索请求的一部分,可以在搜索结果中包含聚合的结果,而不影响实际的文档返回。
1. 聚合的基本概念
- 聚合:将数据分组并对每个组进行统计计算的过程。
- 桶聚合(Bucket Aggregation):将文档分组到不同的桶中,每个桶包含满足某些条件的文档。
- 度量聚合(Metric Aggregation):计算单个数字值(如平均值、总和、最大值等)来描述数据。
- 管道聚合(Pipeline Aggregation):对聚合结果进行进一步处理,例如计算百分比或生成复杂的度量。
2. 常见的聚合类型
桶聚合(Bucket Aggregation)
桶聚合用于将文档分组到不同的桶中。每个桶代表一组满足某些条件的文档。桶聚合常用于数据分组和分类。
terms聚合:按字段的唯一值对文档进行分组。range聚合:按字段值的范围对文档进行分组。histogram聚合:按字段值的固定区间对文档进行分组。date_histogram聚合:按日期字段的时间区间对文档进行分组。
度量聚合(Metric Aggregation)
度量聚合用于计算数据的统计信息。常见的度量聚合包括:
avg聚合:计算字段的平均值。sum聚合:计算字段的总和。min和max聚合:计算字段的最小值和最大值。stats聚合:提供字段的总数、平均值、最大值、最小值和标准差。percentiles聚合:计算字段的百分位数。
管道聚合(Pipeline Aggregation)
管道聚合用于处理已计算的聚合结果。它对聚合的结果进行进一步的处理和计算。例如:
bucket_script聚合:对桶聚合结果应用脚本计算自定义度量。bucket_sort聚合:对桶进行排序。
3. 示例查询
计算字段的平均值
POST /products/_search
{
"size": 0,
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
}
}
}
在这个示例中,avg 聚合用于计算 price 字段的平均值。
按类别分组并计算每个类别的平均价格
POST /products/_search
{
"size": 0,
"aggs": {
"by_category": {
"terms": {
"field": "category.keyword"
},
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
在这个示例中,terms 聚合用于按 category 字段进行分组,并对每个类别计算 price 字段的平均值。
按价格范围分组
POST /products/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 50 },
{ "from": 50, "to": 100 },
{ "from": 100 }
]
}
}
}
}
在这个示例中,range 聚合用于按 price 字段的指定范围对文档进行分组。
4. 总结
- 桶聚合:用于将文档分组到不同的桶中,根据字段值、范围、直方图等进行分组。
- 度量聚合:用于计算字段的统计信息,如平均值、总和、最小值、最大值等。
- 管道聚合:对已计算的聚合结果进行进一步处理和计算。
聚合功能使得 Elasticsearch 不仅能进行复杂的搜索,还能在搜索结果中提供强大的数据分析能力。通过合理使用不同类型的聚合,可以从大数据集中提取出有价值的信息和趋势。