Elasticsearch 的`bucket_sort`聚合是一种管道聚合,用于对父多桶聚合(如`terms`、`date_histogram`、`histogram`等)的桶进行排序。以下是关于`bucket_sort`的详细说明:
1.基本功能
`bucket_sort`聚合可以对父聚合返回的桶进行排序,支持以下排序依据:
• `_key`:基于桶的键值(例如时间戳或词项)。
• `_count`:基于桶中的文档数量。
• 子聚合结果:基于子聚合的计算结果(例如`sum`、`avg`等)。
此外,`bucket_sort`还可以通过`from`和`size`参数截断结果,只返回部分桶。
2.参数说明
`bucket_sort`聚合的主要参数包括:
• `sort`:指定排序字段和顺序(升序或降序)。
• `from`:跳过前`N`个桶。
• `size`:返回的桶数量。
• `gap_policy`:当数据中存在缺口时的处理策略,默认为`skip`。
3.使用场景
3.1按子聚合结果排序
假设有一个`sales`索引,包含交易数据,我们希望按月统计销售额,并返回销售额最高的 3 个月:
```json
POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"sales_bucket_sort": {
"bucket_sort": {
"sort": [
{
"total_sales": {
"order": "desc"
}
}
],
"size": 3
}
}
}
}
}
}
```
此查询将返回销售额最高的 3 个月。
3.2仅截断结果
如果不进行排序,仅截断结果,可以省略`sort`参数。例如,仅返回第 2 个桶:
```json
POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"bucket_truncate": {
"bucket_sort": {
"from": 1,
"size": 1
}
}
}
}
}
}
```
此查询将仅返回第 2 个桶。
4.与其他聚合结合使用
`bucket_sort`可以与多种聚合结合使用,例如:
• `date_histogram`:按时间间隔分桶并排序。
• `histogram`:按数值间隔分桶并排序。
5.注意事项
• `bucket_sort`是管道聚合,执行顺序在非管道聚合之后。
• 排序和截断操作仅对父聚合返回的桶生效。
通过以上方式,`bucket_sort`聚合可以灵活地对聚合结果进行排序和截断,满足多种数据分析需求。