ElasticSearch - Bucket Script 使用指南

文章目录

  • 官方文档
  • Bucket Script 官文
  • 1. 什么是 ElasticSearch 中的 Bucket Script?
  • 2. 适用场景
  • 3. Bucket Script 的基本结构
  • 4. 关键参数详解
  • 5. 示例
    • 官方示例:计算每月 T 恤销售额占总销售额的比率百分比
    • 示例计算:点击率 (CTR)
  • 6. 注意事项与限制
  • 7. 最佳实践

在这里插入图片描述


官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

在这里插入图片描述在这里插入图片描述


Bucket Script 官文

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-script-aggregation.html

在这里插入图片描述在这里插入图片描述
在这里插入图片描述


  1. 介绍 Bucket Script 的概念和作用
  2. 展示基本使用场景,帮助理解其核心原理
  3. 通过实例展示如何实现 Bucket Script
  4. 总结关键要点与最佳实践

1. 什么是 ElasticSearch 中的 Bucket Script?

Bucket Script 是 ElasticSearch 中一种强大的管道聚合(pipeline aggregation),允许你基于已有的聚合结果执行数学计算。 它用于对多个 桶(buckets) 内的数据进行后处理,适合在聚合结果上进行进一步计算,比如计算比率、加权平均等。


2. 适用场景

  • 计算字段的 百分比(如收入增长率)
  • 生成两个字段之间的 比值(如点击率 CTR)
  • 在聚合结果中求得更复杂的 数学表达式
  • 处理基于时间序列的数据分析,例如 同比、环比 增长计算

3. Bucket Script 的基本结构

Bucket Script 聚合的基本结构如下:

{"aggs": {"sales_per_month": {"date_histogram": {"field": "order_date","calendar_interval": "month"},"aggs": {"total_sales": {"sum": {"field": "sales"}},"total_units": {"sum": {"field": "units_sold"}},"sales_per_unit": {"bucket_script": {"buckets_path": {"sales": "total_sales","units": "total_units"},"script": "params.sales / params.units"}}}}}
}
  1. sales_per_month:使用 date_histogram 按月份进行分桶。
  2. total_salestotal_units:分别计算总销售额和总售出单位数。
  3. sales_per_unit:使用 bucket_script 在每个桶内计算销售额与售出单位的比值。

4. 关键参数详解

  • buckets_path:指定需要参与计算的聚合结果路径,路径指向的聚合必须出现在当前或上层的桶中。
  • script:定义计算逻辑,使用 Painless 脚本语言 编写。

5. 示例

官方示例:计算每月 T 恤销售额占总销售额的比率百分比

PUT /sales
{"mappings": {"properties": {"type": {"type": "keyword"},"price": {"type": "float"},"date": {"type": "date"}}}
}POST /sales/_bulk
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 19.99, "date": "2024-01-05" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 25.50, "date": "2024-01-15" }
{ "index": { "_index": "sales" } }
{ "type": "jeans", "price": 49.99, "date": "2024-01-20" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 15.99, "date": "2024-02-01" }
{ "index": { "_index": "sales" } }
{ "type": "shoes", "price": 75.00, "date": "2024-02-10" }
{ "index": { "_index": "sales" } }
{ "type": "t-shirt", "price": 29.99, "date": "2024-02-15" }POST sales/_searchPOST /sales/_search
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"total_sales": {"sum": {"field": "price"}},"t-shirts": {"filter": {"term": {"type": "t-shirt"}},"aggs": {"sales": {"sum": {"field": "price"}}}},"t-shirt-percentage": {"bucket_script": {"buckets_path": {"tShirtSales": "t-shirts>sales","totalSales": "total_sales"},"script": "params.tShirtSales / params.totalSales * 100"}}}}}
}

此查询的目的是:

  1. 统计每个月的总销售额
  2. 计算“T-shirt”类型商品的销售额
  3. 计算“T-shirt”销售额占总销售额的百分比

  1. “size”: 0

    • 表示这次查询不返回任何文档,仅返回聚合结果。
  2. 聚合:sales_per_month

    • 使用 date_histogram 来按月对销售数据进行分桶:
      "date_histogram": {"field": "date","calendar_interval": "month"
      }
      
    • 字段 date 决定销售的日期。calendar_interval 设置为 "month",意味着每个月作为一个桶。
  3. 聚合:total_sales

    • 计算每个月的总销售额
      "total_sales": {"sum": {"field": "price"}
      }
      
    • 字段 price 表示商品价格,通过 sum 聚合计算总和。
  4. 过滤聚合:t-shirts

    • 使用 filter 过滤出类型为 t-shirt 的销售:
      "filter": {"term": {"type": "t-shirt"}
      }
      
    • 嵌套的sum聚合 计算T-shirt类型商品的销售额:
      "sales": {"sum": {"field": "price"}
      }
      
  5. 桶脚本聚合:t-shirt-percentage

    • 计算T-shirt销售额占总销售额的百分比
      "bucket_script": {"buckets_path": {"tShirtSales": "t-shirts>sales","totalSales": "total_sales"},"script": "params.tShirtSales / params.totalSales * 100"
      }
      
    • buckets_path 用于从其他聚合中引用路径:
      • "tShirtSales" 引用的是 t-shirts>sales 聚合。
      • "totalSales" 引用的是 total_sales 聚合。
    • script 执行的逻辑是:T-shirt销售额 / 总销售额 * 100,计算百分比。

查询结果格式

{"took" : 6,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 6,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"sales_per_month" : {"buckets" : [{"key_as_string" : "2024-01-01T00:00:00.000Z","key" : 1704067200000,"doc_count" : 3,"total_sales" : {"value" : 95.48000144958496},"t-shirts" : {"doc_count" : 2,"sales" : {"value" : 45.489999771118164}},"t-shirt-percentage" : {"value" : 47.64348458366713}},{"key_as_string" : "2024-02-01T00:00:00.000Z","key" : 1706745600000,"doc_count" : 3,"total_sales" : {"value" : 120.97999954223633},"t-shirts" : {"doc_count" : 2,"sales" : {"value" : 45.97999954223633}},"t-shirt-percentage" : {"value" : 38.00628179551602}}]}}
}

这个结果表示:

  • 2024年1月的总销售额为 ** 95.48**。
  • 其中 45.48 元来自于 T-shirt。
  • T-shirt 的销售占比为 ** 47.6%**。


示例计算:点击率 (CTR)

假设有个广告展示量和点击量的聚合,想计算每个广告的点击率:

{"aggs": {"ads": {"terms": {"field": "ad_id"},"aggs": {"impressions": {"sum": {"field": "impression_count"}},"clicks": {"sum": {"field": "click_count"}},"ctr": {"bucket_script": {"buckets_path": {"clicks": "clicks","impressions": "impressions"},"script": "params.clicks / params.impressions"}}}}}
}

逻辑:

  • 使用 terms 聚合按广告 ID 分组
  • 分别计算广告的展示量 (impressions) 和点击量 (clicks)
  • 使用 bucket_script 聚合计算 点击率(CTR) = 点击量 / 展示量

6. 注意事项与限制

  1. 性能影响:由于 Bucket Script 在已有聚合结果上执行计算,处理大量桶时可能会导致性能下降。
  2. 路径依赖buckets_path 必须引用当前层级内或父层级的聚合结果,不能跨层级引用。
  3. 脚本限制:ElasticSearch 默认使用 Painless 脚本, 确保脚本逻辑高效,否则可能导致查询超时。
  4. 溢出处理:注意在脚本中处理除零异常或数据溢出。

7. 最佳实践

  • 数据过滤:提前过滤无关数据,减少参与计算的桶数。
  • 逐步聚合:将复杂计算分解为多个简单的管道聚合,以提高可读性和维护性。
  • 性能调优:如果计算复杂,可以限制返回结果的桶数(例如通过 size 限制 top-N 结果)。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464048.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端:JAVA、Solon、easyExcel、FastJson2 前端:vue2.js、js、HTML 模式1:合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…

【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)

文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot,AWS实例存储 学习内容: 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数…

适用于 c++ 的 wxWidgets框架源码编译SDK-windows篇

本文章记录了下载wxWidgets源码在windows 11上使用visual Studio 2022编译的全过程,讲的不详细请给我留言,让我知道错误并改进。 本教程是入门级。有更深入的交流可以留言给我。 如今互联网流行现在大家都忘记了这块桌面的开发,我认为桌面应用还是有用武之地,是WEB无法替代…

Pycharm贪吃蛇小游戏后续2

前文中我们提到用面向对象去编写贪吃蛇 目前功能实现贪吃蛇吃食物,身体加长,其次可以按下-(键盘上右分大小写的-,不是数字的-)来改变speed,终端可以看到速度,后续将陆续实现撞墙死亡&#xff0…

你丢失的数据,10款数据恢复软件帮你找!!

现实与虚拟的交错,互联网的进步,加大了我们之间交流的效率,而且便便捷了许许多多的事,比如信息保存;今天咱们来聊聊数据恢复这个话题。你是不是会一不小心删除了重要文件?硬盘出了问题,数据不见…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要:本文涵盖了GIS软件操作的多方面内容,包括地图文档的新建、打开、保存及版本兼容性处理;错误与警告的查阅及帮助文档的使用技巧;地图打印比例尺的调整与地图信息的完善;图层操作的撤销与恢复,界面元素的…

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤: 状态表示:由经验和题目要求得出,这个确实有点抽象,下面的题目会带大家慢慢感受状态标识状态转移方程初始化:避免越界访问 dp 表,所以在进行填表之前我们要预先填…

【学习】软件测试中的过程管理为何如此重要

在软件世界的繁华盛景之中,无数代码编织成了璀璨的星空,而每一颗闪烁的星点背后,都离不开精心的过程管理来确保其光华不减。正如一座摩天大楼需要稳固的地基与精细的设计图一样,软件的成功问世同样依赖于严谨、系统的流程管控。本…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架:从入门到精通的全面指南 引言 在数据驱动的时代,网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架,专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用,从基础知识到…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

Postgresql源码(137)执行器参数传递与使用

参考 《Postgresql源码(127)投影ExecProject的表达式执行分析》 0 总结速查 prepare p_04(int,int) as select b from tbl_01 where a $1 and b $2为例。 custom计划中,在表达式计算中使用参数的值,因为custom计划会带参数值&…

自适应对话式团队构建,提升语言模型代理的复杂任务解决能力

人工智能咨询培训老师叶梓 转载标明出处 如何有效利用多个大模型(LLM)代理解决复杂任务一直是一个研究热点。由美国南加州大学、宾夕法尼亚州立大学、华盛顿大学、早稻田大学和谷歌DeepMind的研究人员联合提出了一种新的解决方案——自适应团队构建&…

GitHub上传自己的项目

目录 一、安装Git插件 1)下载 2)安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user],下次可以直接用 一、安装Git插件 1)下载 下载地址&#x…

SpringBoot整合EasyExcel加Vue

EasyExcel好处是什么? EasyExcel 是一个基于 Apache POI 的 Java Excel 处理库,主要用于高效地读写 Excel 文件。它的主要好处包括: 高性能:EasyExcel 在内存管理和读取速度上进行了优化,适合处理大规模 Excel 文件。 简洁易用…

VisionPro —— CogPatInspectTool对比工具

一、CogPathInspectTool工具简介 CogPathInspectTool是VisionPro重要的工具,主要用于缺陷检测,通过将当前图像与“训练图像”对比,获取“原始差异图像”,再将“原始差异图像”与“阈值图像”进行对比,进而获取“阈值差…

css实现antd丝带效果

先上效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

BFV/BGV全同态加密方案浅析

本文主要为翻译内容&#xff0c;原文地址&#xff1a;Introduction to the BFV encryption scheme、https://www.inferati.com/blog/fhe-schemes-bgv 之前的一篇博客我们翻译了CKKS全同态加密方案的内容&#xff0c;但该篇上下文中有一些知识要点&#xff0c;作者在BFV/BGV中已…

占地1.1万平,2亿投资的智能仓储系统:高架库、AGV、码垛机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 我国调味料市场近年来展现出惊人的增长潜力&#xff0c;各大品牌纷纷加大投入&#xff0c;力求在竞争中脱颖而出。 广东美味鲜调味食品有限公司&#xff0c;作为行业内的佼佼者&#…

EJEAS S2滑雪对讲机全球发布会圆满举办,为滑雪市场注入新活力

时光向新&#xff0c;步履向前。站在冰雪运动与科技创新的交汇点&#xff0c;深圳爱骑仕智能科技有限公司&#xff08;以下简称“EJEAS”&#xff09;于2024年11月2日在新疆阿勒泰可可托海成功举办S2滑雪对讲机全球发布会。现场汇聚了来自全国各地的两三百名嘉宾&#xff0c;包…