【Elasticsearch】Bucket Selector Aggregation

Elasticsearch 的Bucket Selector Aggregation是一种强大的管道聚合功能,用于根据条件过滤聚合结果中的桶(buckets)。它允许用户通过编写脚本来动态决定哪些桶应该被保留,哪些应该被过滤掉。以下是对Bucket Selector Aggregation的详细说明:

1.基本概念

Bucket Selector Aggregation 是一种父级管道聚合,这意味着它依赖于其父级聚合生成的桶。它通过执行一个脚本,根据脚本返回的布尔值来决定是否保留当前桶。如果脚本返回`true`,则保留该桶;如果返回`false`,则过滤掉该桶。

2.主要用途

• 数据筛选:在聚合结果中根据特定条件筛选出符合要求的桶。例如,只保留销售额超过某个阈值的月份。

• 动态过滤:根据动态计算的值(如平均值、总和等)进行过滤。

• 数据清洗:在分析数据时,排除不符合业务逻辑的数据桶。

3.关键组件

3.1buckets_path

`buckets_path`是一个映射,用于定义脚本中变量与父级聚合生成的桶路径之间的关系。它告诉 Elasticsearch 如何从父级聚合中提取数据供脚本使用。

• 格式:

```json

"buckets_path": {

"variable_name": "path_to_metric"

}

```

• 示例:

```json

"buckets_path": {

"totalSales": "total_sales"

}

```

在这个例子中,`totalSales`是脚本中使用的变量名,`total_sales`是父级聚合中某个指标的路径。

3.2script

`script`是一个脚本,用于定义桶是否应该被保留的逻辑。脚本可以是内联脚本、文件脚本或索引脚本。

• 脚本语言:支持多种脚本语言,如`painless`和`expression`。

• 返回值:脚本必须返回一个布尔值。如果脚本语言是`expression`,则允许返回数值,`0.0`被视为`false`,其他值被视为`true`。

• 示例:

```json

"script": "params.totalSales > 200"

```

这个脚本表示只有当`totalSales`大于 200 时,桶才会被保留。

3.3gap_policy

`gap_policy`是一个可选参数,用于定义在数据中存在缺口时的处理策略。缺口是指某些桶中缺少某些指标值。

• 默认值:`skip`,表示跳过缺失数据的桶。

• 其他选项:

• `insert_zeros`:在缺失数据的地方插入零值。

• 示例:

```json

"gap_policy": "insert_zeros"

```

4.执行顺序

Bucket Selector Aggregation 是在所有其他兄弟聚合执行之后才执行的。这意味着它不会节省聚合的执行时间,但可以在返回结果时过滤掉不符合条件的桶。

5.示例

以下是一个完整的示例,展示如何使用 Bucket Selector Aggregation 来筛选每月销售额超过 200 的月份。

5.1查询示例

```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_filter": {

"bucket_selector": {

"buckets_path": {

"totalSales": "total_sales"

},

"script": "params.totalSales > 200"

}

}

}

}

}

}

```

5.2响应示例

```json

{

"took": 11,

"timed_out": false,

"_shards": ...,

"hits": ...,

"aggregations": {

"sales_per_month": {

"buckets": [

{

"key_as_string": "2015/01/01 00:00:00",

"key": 1420070400000,

"doc_count": 3,

"total_sales": {

"value": 550.0

}

},

{

"key_as_string": "2015/03/01 00:00:00",

"key": 1425168000000,

"doc_count": 2,

"total_sales": {

"value": 375.0

}

}

]

}

}

}

```

在这个响应中,`2015/02/01`的桶被移除了,因为其总销售额低于 200。

6.注意事项

• 性能影响:由于 Bucket Selector Aggregation 是在所有其他聚合执行之后才运行的,因此它不会减少聚合的执行时间。

• 脚本安全:使用脚本时需要注意安全性和性能问题,避免复杂的脚本逻辑导致性能下降。

• 数据完整性:在使用`gap_policy`时,需要根据业务需求选择合适的策略,以确保数据的完整性。

7.总结

Bucket Selector Aggregation 是 Elasticsearch 中一个非常有用的工具,它允许用户根据动态条件过滤聚合结果中的桶。通过合理使用`buckets_path`、`script`和`gap_policy`,可以实现复杂的数据筛选和清洗逻辑,从而更好地满足数据分析需求。

相关推荐
Elasticsearch12 小时前
平衡尺度:利用权重使倒数排序融合 (RRF) 更加智能
elasticsearch
muyun28001 天前
Docker 下部署 Elasticsearch 8 并集成 Kibana 和 IK 分词器
elasticsearch·docker·容器
在未来等你2 天前
Elasticsearch面试精讲 Day 17:查询性能调优实践
大数据·分布式·elasticsearch·搜索引擎·面试
在未来等你2 天前
Elasticsearch面试精讲 Day 18:内存管理与JVM调优
大数据·分布式·elasticsearch·搜索引擎·面试
Elasticsearch2 天前
在 Elastic Observability 中使用 Discover 的追踪获取更深入的应用洞察
elasticsearch
婲落ヽ紅顏誶2 天前
测试es向量检索
大数据·elasticsearch·搜索引擎
咖啡Beans3 天前
Docker安装ELK(Elasticsearch + Logstash + Kibana)
后端·elasticsearch·docker
一勺菠萝丶3 天前
Jenkins 构建 Node 项目报错解析与解决——pnpm lockfile 问题实战
elasticsearch·servlet·jenkins
小花鱼20253 天前
Elasticsearch (ES)相关
大数据·elasticsearch
阿里嘎多哈基米3 天前
ES——(三)DSL高级查询
elasticsearch·搜索引擎·全文检索·kibana·倒排索引