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

相关推荐
Elasticsearch19 小时前
没有小到无法记录的日志文件:Elastic Agent 如何跟踪低于 1 KiB 阈值的文件
elasticsearch
Elasticsearch1 天前
使用 Elasticsearch 和 Jina 进行 AI 视频搜索:精准找到你需要的视频片段秒数
elasticsearch
Hrain-AI1 天前
AI 爬虫三档授权工程落地:搜索放行、训练拦截、Agent 分层(附脚本)
人工智能·elasticsearch·milvus
智搜广告1 天前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
jonyleek2 天前
企业文档私有化实践:基于JVS数字底座的可控协同架构设计与落地要点
elasticsearch·私有化部署·springcloud·微服务架构·信创适配·jvs·企业文档
深海鱼肝油ya2 天前
向量数据库Elasticsearch(二)介绍&安装&常用操作
人工智能·elasticsearch·kibana·向量数据库·文档操作·索引操作·域的属性
汽车网络安全爱好者2 天前
AI应用(四)之 AI 编程全流程
大数据·人工智能·elasticsearch
Elasticsearch3 天前
jina-ocr-v1:一个支持布局、表格、数学公式和 100 多种语言的 OCR 模型
elasticsearch
先吃饱再说3 天前
为什么 MySQL 的 LIKE 查询这么慢?Elasticsearch 倒排索引完全解析
elasticsearch·agent
Elastic 中国社区官方博客3 天前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎