【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`,可以实现复杂的数据筛选和清洗逻辑,从而更好地满足数据分析需求。

相关推荐
ice___Cpu27 分钟前
Git - 1( 14000 字详解 )
大数据·git·elasticsearch
tebukaopu1481 小时前
官方 Elasticsearch SQL NLPChina Elasticsearch SQL
大数据·sql·elasticsearch
jiedaodezhuti8 小时前
ElasticSearch重启之后shard未分配问题的解决
笔记·elasticsearch
jiedaodezhuti9 小时前
为什么elasticsearch配置文件JVM配置31G最佳
大数据·jvm·elasticsearch
white.tie10 小时前
Docker部署单节点Elasticsearch
elasticsearch·docker·jenkins
胡小禾10 小时前
ES常识7:ES8.X集群允许4个 master 节点吗
大数据·elasticsearch·搜索引擎
胡小禾12 小时前
ES常识8:ES8.X如何实现热词统计
大数据·elasticsearch·jenkins
Luck_ff081017 小时前
Elasticsearch 快速入门指南
大数据·elasticsearch·搜索引擎
言之。18 小时前
Makefile 在 Go 项目中的实践
开发语言·elasticsearch·golang
好吃的肘子21 小时前
ElasticSearch进阶
大数据·开发语言·分布式·算法·elasticsearch·kafka·jenkins