首页/新闻资讯/正文详情

[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合

发布时间:2026/9/23 8:50:39 来源:云帆数科 栏目:资讯中心
[ELK实战] Elasticsearch 聚合查询二: Bucketing/桶聚合
简介目前在官方文档有4种聚合(Aggregations )方式分别是Metric (指标聚合):最常用的聚合方式例如 平均值,求和等等Bucketing (桶聚合):就是常说的分组聚合Matrix (矩阵聚合) :在多个字段上操作并根据从请求的文档字段提取的值生成矩阵结果的聚合族。与度量聚合和桶聚合不同此聚合族尚不支持脚本。Pipeline (管道聚合):由于每个 bucket 有效地定义了一个文档集(属于 bucket 的所有文档) 因此可以潜在地在 bucket 级别上关联聚合并且这些聚合将在 bucket 的上下文中执行。这就是聚合的真正威力所在: 聚合可以被嵌套方法 / 步骤一 简介并加入测试数据1.1 聚合相关参数指标聚合有参数有range / date_range / terms / histogram / date_histogram / …聚合类型聚合参数简介BucketingRange Aggregation- 范围聚合查询BucketingDate Range Aggregation- 时间范围聚合查询BucketingTerms Aggregation- 分组统计BucketingHistogram Aggregation- 直方图统计BucketingDate histogram aggregation- 时间直方图统计1.2 DSL 查询格式aggregations:{aggregation_name:{aggregation_type:{aggregation_body}[,meta:{[meta_data_body]}]?[,aggregations:{[sub_aggregation]}]?}[,aggregation_name_2:{...}]*}1.3 插入批量测试数据POST/staff/_bulk{index:{_id:1}}{name:zs,realname:张三,age:10,birthday:2018-12-27,salary:1000.0,address:北京市北海公园}{index:{_id:2}}{name:ls,realname:李四,age:20,birthday:2017-10-20,salary:2000.0,address:北京市京东大峡谷}{index:{_id:3}}{name:ww,realname:王五,age:30,birthday:2016-03-15,salary:3000.0,address:北京市陶然亭}{index:{_id:4}}{name:zl,realname:赵六,age:40,birthday:2003-04-19,salary:4000.0,address:北京市玉渊潭}{index:{_id:5}}{name:tq,realname:田七,age:50,birthday:2001-08-11,salary:5000.0,address:北京市圆明园}插入完成后查看索引数据GET/staff/_search二: 常规查询2.1 Range Aggregation / 返回聚合每个范围表示一个桶。在聚合过程中将根据每个bucket范围和相关/匹配文档的“bucket”检查从每个文档提取的值。如 统计0-20岁20-40岁40~60岁各个区间段的用户人数POST/staff/_search {aggs: {age_ranges_count: {range: {field:age,ranges:[{from:0,to:20},{from:20,to:40},{from:40,to:60}]} } } }返回内容.....aggregations: {age_ranges_count: {buckets:[{key:0.0-20.0,from:0.0,to:20.0,doc_count:1},{key:20.0-40.0,from:20.0,to:40.0,doc_count:2},{key:40.0-60.0,from:40.0,to:60.0,doc_count:2}]} }.....如果第一个区间开始值和最后一个区间结束值不想指定的话可以不用写from和to如下POST/staff/_search {aggs: {age_ranges_count: {range: {field:age,ranges:[{to:20},{from:20,to:40},{from:40,to:60}]} } } }返回内容....aggregations: {age_ranges_count: {buckets:[{key:*-20.0,to:20.0,doc_count:1},{key:20.0-40.0,from:20.0,to:40.0,doc_count:2},{key:40.0-60.0,from:40.0,to:60.0,doc_count:2}]} }....2.2 Date Range Aggregation / 时间范围聚合此聚合与Range Aggregation常规范围聚合的主要区别在于可以用日期数学表达式表示from和to值而且还可以指定返回from和to响应字段的日期格式。注意此聚合包含每个范围的from值并排除to值。now10y表示从现在开始的第10年。now10M表示从现在开始的第10个月。1990-01-10||20y表示从1990-01-01开始后的第20年即2010-01-01。now/y表示在年位上做舍入运算。如 统计生日在2017年、2018年、2019年的用户now/y当前年的1月1日now当前时间now/y-1y当前年上一年的1月1日POST /staff/_search{aggs:{birthday_count:{date_range:{field:birthday,format:yyyy-MM-dd,ranges:[{from:now/y-1y,to:now/y},{from:now/y-2y,to:now/y-1y},{from:now/y-3y,to:now/y-2y}]}}}}返回数据aggregations:{birthday_count:{buckets:[{key:2019-01-01-2020-01-01,from:1.5463008E12,from_as_string:2019-01-01,to:1.5778368E12,to_as_string:2020-01-01,doc_count:0},{key:2020-01-01-2021-01-01,from:1.5778368E12,from_as_string:2020-01-01,to:1.6094592E12,to_as_string:2021-01-01,doc_count:0},{key:2021-01-01-2022-01-01,from:1.6094592E12,from_as_string:2021-01-01,to:1.6409952E12,to_as_string:2022-01-01,doc_count:0}]}}2.3 Terms Aggregation / 分组聚合对年龄进行聚合,显示3条数据POST/staff/_search {aggs: {age_count: {terms: {field:age,size:3} } } }聚合结果key年龄 为1020 30各为一条......aggregations: {age_count: {doc_count_error_upper_bound:0,sum_other_doc_count:2,buckets:[{key:10,doc_count:1},{key:20,doc_count:1},{key:30,doc_count:1}]} }......2.4 Histogram Aggregation / 直方图聚合它与前面介绍的Range聚合非常像只不过Range可以任意划分区间而Histogram做等间距划分。既然是等间距划分那么参数里面必然有距离参数就是interval参数。如根据年龄间隔20岁统计各个年龄段的员工总人数POST/staff/_search?size0{aggs: {salary_value_count: {value_count: {field:salary} } } }返回结果.....aggregations: {age_histogram_count: {buckets:[{key:0.0,doc_count:1},{key:20.0,doc_count:2},{key:40.0,doc_count:2}]} }.....2.5 Date histogram aggregation / 时间直方图聚合日期直方图聚合专门对时间类型的字段做直方图聚合。这种需求是比较常用见得的我们在统计时通常就会按照固定的时间断1个月或1年等来做统计如按年统计用户生日的总人数POST /staff/_search{aggs:{birthday_data_histogram_count:{date_histogram:{field:birthday,interval:year,format:yyyy-MM-dd}}}}返回结果.....aggregations: {birthday_data_histogram_count: {buckets:[{key_as_string:2001-01-01,key:978307200000,doc_count:1},{key_as_string:2002-01-01,key:1009843200000,doc_count:0},{key_as_string:2003-01-01,key:1041379200000,doc_count:1},{key_as_string:2004-01-01,key:1072915200000,doc_count:0},{key_as_string:2005-01-01,key:1104537600000,doc_count:0},{key_as_string:2006-01-01,key:1136073600000,doc_count:0},{key_as_string:2007-01-01,key:1167609600000,doc_count:0},{key_as_string:2008-01-01,key:1199145600000,doc_count:0},{key_as_string:2009-01-01,key:1230768000000,doc_count:0},{key_as_string:2010-01-01,key:1262304000000,doc_count:0},{key_as_string:2011-01-01,key:1293840000000,doc_count:0},{key_as_string:2012-01-01,key:1325376000000,doc_count:0},{key_as_string:2013-01-01,key:1356998400000,doc_count:0},{key_as_string:2014-01-01,key:1388534400000,doc_count:0},{key_as_string:2015-01-01,key:1420070400000,doc_count:0},{key_as_string:2016-01-01,key:1451606400000,doc_count:1},{key_as_string:2017-01-01,key:1483228800000,doc_count:1},{key_as_string:2018-01-01,key:1514764800000,doc_count:1}]} }.....三: 聚合查询嵌套使用通过嵌套可以使得metric类型的聚合操作作用在每一bucket上。我们可以使用ES的嵌套聚合操作来完成稍微复杂一点的统计功能。3.1 统计每年中用户的最高工资POST /staff/_search{aggs:{birthday_data_histogram_count:{date_histogram:{field:birthday,interval:year,format:yyyy-MM-dd},aggs:{max_salary:{max:{field:salary}}}}}}返回结果.....aggregations: {birthday_data_histogram_count: {buckets:[{key_as_string:2001-01-01,key:978307200000,doc_count:1,max_salary: {value:5000.0} },{key_as_string:2002-01-01,key:1009843200000,doc_count:0,max_salary: {value:null} },{key_as_string:2003-01-01,key:1041379200000,doc_count:1,max_salary: {value:4000.0} },{key_as_string:2004-01-01,key:1072915200000,doc_count:0,max_salary: {value:null} },{key_as_string:2005-01-01,key:1104537600000,doc_count:0,max_salary: {value:null} },{key_as_string:2006-01-01,key:1136073600000,doc_count:0,max_salary: {value:null} },{key_as_string:2007-01-01,key:1167609600000,doc_count:0,max_salary: {value:null} },{key_as_string:2008-01-01,key:1199145600000,doc_count:0,max_salary: {value:null} },{key_as_string:2009-01-01,key:1230768000000,doc_count:0,max_salary: {value:null} },{key_as_string:2010-01-01,key:1262304000000,doc_count:0,max_salary: {value:null} },{key_as_string:2011-01-01,key:1293840000000,doc_count:0,max_salary: {value:null} },{key_as_string:2012-01-01,key:1325376000000,doc_count:0,max_salary: {value:null} },{key_as_string:2013-01-01,key:1356998400000,doc_count:0,max_salary: {value:null} },{key_as_string:2014-01-01,key:1388534400000,doc_count:0,max_salary: {value:null} },{key_as_string:2015-01-01,key:1420070400000,doc_count:0,max_salary: {value:null} },{key_as_string:2016-01-01,key:1451606400000,doc_count:1,max_salary: {value:3000.0} },{key_as_string:2017-01-01,key:1483228800000,doc_count:1,max_salary: {value:2000.0} },{key_as_string:2018-01-01,key:1514764800000,doc_count:1,max_salary: {value:1000.0} }]} }.....先通过date_histogram按照年分组然后再通过嵌套max聚合查询统计出每年最高工资是多少。3.2 求每个年龄区间段的工资总和....aggregations: {age_ranges_count: {buckets:[{key:0.0-20.0,from:0.0,to:20.0,doc_count:1,sum_salary: {value:1000.0} },{key:20.0-40.0,from:20.0,to:40.0,doc_count:2,sum_salary: {value:5000.0} },{key:40.0-60.0,from:40.0,to:60.0,doc_count:2,sum_salary: {value:9000.0} }]} }....参考资料 致谢[1]官方文档[2] ElasticSearch全文搜索引擎之Aggregation聚合查询(结合Kibana)

相关推荐

HGS-BP混合模型在MATLAB中的实现与优化
HGS-BP混合模型在MATLAB中的实现与优化

1. 项目背景与核心价值在工程预测和数据分析领域,如何建立高精度的拟合预测模型一直是核心挑战。传统BP神经网络虽然应用广泛,但在处理复杂非线性关系时容易陷入局部最优解。HGS(Hunger Games Search)算法作为一种新型群体智能优化… · 2026/9/23 8:50:21

私募排行面试避坑指南:3个高频报错解决思路
私募排行面试避坑指南:3个高频报错解决思路

私募排行面试避坑指南:3个高频报错解决思路 复制来的私募排行代码跑不通,报错信息看得头大?别慌,这行老鸟告诉你,90%的问题出在数据清洗和排序逻辑的细微差异上。这篇避坑指南直接拆解大厂面试官最爱考的三个坑,让你从“代码搬运工”变成“逻辑掌控… · 2026/9/23 8:50:21

相场法模拟金属凝固微观组织的MATLAB实现与优化
相场法模拟金属凝固微观组织的MATLAB实现与优化

1. 相场模拟与金属凝固微观组织演化概述金属凝固过程中的微观组织演化一直是材料科学领域的重要研究课题。相场法作为一种强大的数值模拟工具,能够直观展现枝晶生长、二次枝晶臂间距等关键特征的形成过程。与传统的元胞自动机或蒙特卡洛方法相比,相场法通… · 2026/9/23 8:50:21

PyQt5 入门指南:从安装到第一个桌面应用
PyQt5 入门指南:从安装到第一个桌面应用

文章目录引言环境准备与安装第一个 PyQt5 窗口常用控件介绍信号与槽机制布局管理实战:简易计算器总结摘要:本文面向 Python 初学者,从环境安装到实战开发,系统讲解 PyQt5 的核心控件、信号槽机制与布局管理,并通过简易… · 2026/9/23 9:49:26

告别面试哑火:一个亿小目标带你从入门到精通搞定并发计数
告别面试哑火:一个亿小目标带你从入门到精通搞定并发计数

告别面试哑火:一个亿小目标带你从入门到精通搞定并发计数 面试被问原理答不上来,这种尴尬你经历过吗? 当面试官追问“如何准确统计一个亿次请求”时,你只记得 count++ ,却卡在高并发下的数据丢失上,这直接暴露了基础不牢。… · 2026/9/23 9:49:20

Salt macOS keychain 模块实战指南:用 Salt 管理 macOS 钥匙串中的证书
Salt macOS keychain 模块实战指南:用 Salt 管理 macOS 钥匙串中的证书

Salt macOS keychain 模块实战指南:用 Salt 管理 macOS 钥匙串中的证书 【免费下载链接】salt Software to automate the management and configuration of infrastructure and applications at scale. 项目地址: https://gitcode.com/gh_mirrors/sa/salt Sa… · 2026/9/23 9:49:20

Karmada正式毕业!华为云携手社区共建Agentic Cloud坚实底座
Karmada正式毕业!华为云携手社区共建Agentic Cloud坚实底座

近日,在KubeCon CloudNativeCon OpenInfra Summit PyTorch Conference China 2026,云原生计算基金会(CNCF)正式宣布,Karmada晋级为毕业项目。这一里程碑不仅标志着Karmada在技术能力、社区治理与安全实践各领域的高… · 2026/9/23 9:49:20

COMSOL激光热应力仿真建模与多物理场耦合分析
COMSOL激光热应力仿真建模与多物理场耦合分析

1. 激光热应力仿真概述激光加工技术在现代制造业中扮演着越来越重要的角色,从精密切割到表面处理,激光的热效应都会在材料内部产生复杂的热应力分布。作为一名长期使用COMSOL进行热力学仿真的工程师,我发现很多同行在建立激光热应力模型时都会… · 2026/9/23 9:49:20

Robot Framework 7.0.1 RC1 发布解析:回归修复、日本语本地化与回滚决策
Robot Framework 7.0.1 RC1 发布解析:回归修复、日本语本地化与回滚决策

Robot Framework 7.0.1 RC1 发布解析:回归修复、日本语本地化与回滚决策 【免费下载链接】robotframework Generic automation framework for acceptance testing and RPA 项目地址: https://gitcode.com/gh_mirrors/ro/robotframework 本文基于仓库内 doc/r… · 2026/9/23 9:49:20

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码