Elasticsearch-桶聚合查询详解

前言

在之前我们详细面熟了es的查询用法,但是es还拥有强大的聚合查询功能,可以得到类似分组,直方图,折线图等数据组合。类似SQL的SUM、AVG、COUNT、GROUP BY
Elasticsearch-02-es的restapi使用

概念

1:ES聚合查询流程

ES聚合查询类似SQL的GROUP by,一般统计分析主要分为两个步骤:

  • 分组

对查询的数据首先进行一轮分组,可以设置分组条件,例如:新生入学,把所有的学生按专业分班,这个分班的过程就是对学生进行了分组。

  • 组内聚合

组内聚合,就是对组内的数据进行统计,例如:计算总数、求平均值等等,接上面的例子,学生都按专业分班了,那么就可以统计每个班的学生总数, 这个统计每个班学生总数的计算,就是组内聚合计算。

2:桶的概念

es中满足特定条件的文档的集合,叫做桶。
桶的就是一组数据的集合,对数据分组后,得到一组组的数据,就是一个个的桶。

提示:桶等同于组,分桶和分组是一个意思,ES使用桶代表一组相同特征的数据。

ES中桶聚合,指的就是先对数据进行分组,ES支持多种分组条件,例如:支持类似SQL的group by根据字段分组,当然ES比SQL更强大,支持更多的分组条件,以满足各种统计需求

3:指标

指标指的是对文档进行统计计算方式,又叫指标聚合。
桶内聚合,说的就是先对数据进行分组(分桶),然后对每一个桶内的数据进行指标聚合。

说白了就是,前面将数据经过一轮桶聚合,把数据分成一个个的桶之后,我们根据上面计算指标对桶内的数据进行统计。比如计算每个桶内,最大值,最小值,平均值等

常用的指标有:SUM、COUNT、MAX等统计函数。

ES分组聚合查询

Elasticsearch桶聚合,目的就是数据分组,先将数据按指定的条件分成多个组,然后对每一个组进行统计。 组的概念跟桶是等同的,在ES中统一使用桶(bucket)这个术语。

ES桶聚合的作用跟SQL的group by的作用是一样的,区别是ES支持更加强大的数据分组能力,SQL只能根据字段的唯一值进行分组,分组的数量跟字段的唯一值的数量相等,例如: group by 店铺id, 去掉重复的店铺ID后,有多少个店铺就有多少个分组。

ES常用的桶聚合如下:

  • Terms聚合 - 类似SQL的group by,根据字段唯一值分组
  • Histogram聚合 - 根据数值间隔分组,例如: 价格按100间隔分组,0、100、200、300等等
  • Date histogram聚合 - 根据时间间隔分组,例如:按月、按天、按小时分组
  • Range聚合 - 按数值范围分组,例如: 0-150一组,150-200一组,200-500一组。

Terms聚合 - 类似SQL的group by,根据字段唯一值分组

terms聚合的作用跟SQL中group by作用一样,都是根据字段唯一值对数据进行分组(分桶),字段值相等的文档都分到同一个桶内。

GET person_info/_search
{"size": 0,   //这是为了不返回数据,只返回聚合结果"aggs": {"buket_name": {   // 聚合查询名字,随便取一个"terms": {		//聚合类型为: terms"field": "source.keyword" //根据source值来分组}}}
}

结果:

{"took" : 82,"timed_out" : false,"_shards" : {"total" : 3,"successful" : 3,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 6854,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"buket_name" : {"doc_count_error_upper_bound" : 10,"sum_other_doc_count" : 1261,"buckets" : [{"key" : "填表","doc_count" : 5340},{"key" : "普查","doc_count" : 56},{"key" : "网上下载","doc_count" : 39}]}}
}

Histogram聚合 - 根据数值间隔分组,可做直方图

histogram(直方图)聚合,主要根据数值间隔分组,使用histogram聚合分桶统计结果,通常用在绘制条形图报表。

GET person_info/_search
{"size": 0, //这是为了不返回数据,只返回聚合结果"aggs": {"buket_name": {  // 聚合查询名字,随便取一个"histogram": { // 聚合类型为:histogram"field": "age",  //对age字段进行分类"interval": 5	//数字间隔为5}}}
}

结果:

{"took" : 4,"timed_out" : false,"_shards" : {"total" : 3,"successful" : 3,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 6854,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"buket_name" : {"buckets" : [{"key" : 10,"doc_count" : 814},{"key" : 15.0,"doc_count" : 1612},{"key" : 20.0,"doc_count" : 1290},{"key" : 25.0,"doc_count" : 3138}]}}
}

Date histogram聚合 - 根据时间间隔分组,可做时间折线图

类似histogram聚合,区别是Date histogram可以很好的处理时间类型字段,主要用于根据时间、日期分桶的场景。


GET person_info/_search
{"size": 0,"aggs": {"buket_name": { //这是为了不返回数据,只返回聚合结果"date_histogram": {  // 聚合类型为: date_histogram"field": "data",	// 根据date字段分组"calendar_interval": "month",		// 分组间隔,详解在下边"format" : "yyyy-MM-dd",	// 设置返回结果中桶key的时间格式"time_zone": "+08:00", 		//**设置时区,如果存入的时候没设置就不用填**"min_doc_count": 0,			// 没有数据的月份返回0"extended_bounds": {		//强制返回的日期区间,既需要填充0的范围"min": "2000-01-01","max": "2003-01-01"}}}}
}

结果:

{"took" : 17,"timed_out" : false,"_shards" : {"total" : 3,"successful" : 3,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 6854,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"buket_name" : {"buckets" : [{"key_as_string" : "2002-01-01","key" : 1009843200000,"doc_count" : 5}]}}
}

参考

参数说明1:“time_zone”: “+08:00”

  • 日期(date)类型的字段在 es中是以 long类型的值保存的。
  • es中默认 默认的时区是 0时区。
  • 如果我们有一个东八区的时间,那么在es中是如何存储的呢?
  • 如果我们此时存在 如下 东八区时间 2022-11-29 12:12:12,那么在 es 会存储为 2022-11-29 12:12:12 +0000 对应的时间戳,为什么会加上+0000,因为我们自己的时间字符串中没有时区,就会加上默认的0时区。
  • 也可用 时差(offset)来表示,使用 offset 参数按指定的正(+)或负(-)偏移量持续时间来更改每个桶的起始值,例如1h表示一个小时,1d表示一天。例如,当使用day作为时间间隔时,每个桶的时间区间从午夜到午夜。 将参数 offset 设置为 +6h 会将每个桶的时间区间更改为从早上6点到早上6点:

参数说明2:fixed_interval 和calendar_interval 区别

  • 原本的interval 字段在7.2中被弃用
  • 日历感知间隔是用参数 calendar_interval 配置的。 日历间隔只能以单位的“单数”数量指定(1d、1M等)。 不支持像 2d这样的倍数,否则会引发异常。

minute (1m)
hour(1h)
day(1d)
week(1w)
month(1m)
quarter( 季度1q)
year(1y)

  • 固定间隔是用参数 fixed_interval 配置的。

与日历感知间隔不同,固定间隔是固定数量的国际单位制(SI)单位,无论它们在日历上的位置如何,都不会偏离。 一秒钟总是由1000毫秒组成。 这允许以支持单位的任何倍数值指定固定间隔。
然而,这意味着固定的间隔不能表达其他单位,如“月(month)”,因为一个月的持续时间不是一个固定的量。 试图指定月或季度(quarter)等日历间隔将引发异常。

固定间隔支持的单位有:
毫秒 (ms)
秒 (s):定义为每个1000毫秒
分钟 (m):所有分钟都从00秒开始。 定义为每个60秒(60,000毫秒)
小时 (h):所有小时都从00分00秒开始。 定义为每60分钟(3,600,000毫秒)
天 (d):所有天都在尽可能早的时间开始,通常是00:00:00(午夜)。 定义为24小时(86,400,000毫秒)

Range聚合 - 按数值范围分组,自定义分组

GET /xxx/_search
{"query": {"range": {"alarmNum": {"gte": 20, "lte": 50}} },"size": 0,"aggs": {"warncont": {"range": {"field": "alarmNum","ranges": [{"to": 24    #<},{"from": 24,   #>= and <"to": 32},{ "from": 32  #>=}]}}}
}

Elasticsearch 指标聚合(metrics)-函数

ES指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用。

常用的统计函数如下:

  • Value Count - 类似sql的count函数,统计总数
  • Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数
  • Avg - 求平均值
  • Sum - 求和
  • Max - 求最大值
  • Min - 求最小值

Value Count - 类似sql的count函数,统计总数

GET /sales/_search?size=0
{"aggs": {"types_count": { // 聚合查询的名字,随便取个名字"value_count": { // 聚合类型为:value_count"field": "type" // 计算type这个字段值的总数}}}
}等价SQL:select count(type) from sales

Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数

POST /sales/_search?size=0
{"aggs" : {"type_count" : { // 聚合查询的名字,随便取一个"cardinality" : { // 聚合查询类型为:cardinality"field" : "type" // 根据type这个字段统计文档总数}}}
}等价SQL:select count(DISTINCT type) from sales

Avg - 求平均值 Sum - 求和 Max - 求最大值 Min - 求最小值

POST /exams/_search?size=0
{"aggs": {"avg_grade": { // 聚合查询名字,随便取一个名字"avg": { // 聚合查询类型为: avg"field": "grade" // 统计grade字段值的平均值}}}
}

综合使用-多层嵌套

GET /project_zcy/_search
{"size": 0,"query": {"term": {"project_status.keyword": {"value": "执行中"}}},"aggs": {"institue_bulk": {"terms": {"field": "institute_code.keyword",  #分组code"order": {"_count": "asc"}},"aggs": {"depart_bulk": {"terms": {"field": "institute_name.keyword"  #再次分组获取名称},"aggs": {                #指标sum"warm_sum": {"sum": {"field": "alarmNum"}},"index_count": {    #指标count"value_count": {"field": "institute_code.keyword"}}}}}}}
}

ES聚合排序

排序是对桶里面数据排序

默认情况,ES会根据doc_count文档总数,降序排序。

ES桶聚合支持两种方式排序:

  • 内置排序
  • 按度量指标排序

1:内置排序

内置排序参数:

  • _count - 按文档数排序。对 terms 、 histogram 、 date_histogram 有效
  • _term - 按词项的字符串值的字母顺序排序。只在 terms 内使用
  • _key - 按每个桶的键值数值排序, 仅对 histogram 和 date_histogram 有效
GET /cars/_search
{"size" : 0,"aggs" : {"colors" : { // 聚合查询名字,随便取一个"terms" : { // 聚合类型为: terms"field" : "color", "order": { // 设置排序参数"_count" : "asc"  // 根据_count排序,asc升序,desc降序}}}}
}

2:按度量排序

通常情况下,我们根据桶聚合分桶后,都会对桶内进行多个维度的指标聚合,所以我们也可以根据桶内指标聚合的结果进行排序。

GET /cars/_search
{"size" : 0,"aggs" : {"colors" : { // 聚合查询名字"terms" : { // 聚合类型: terms,先分桶"field" : "color", // 分桶字段为color"order": { // 设置排序参数"avg_price" : "asc"  // 根据avg_price指标聚合结果,升序排序。}},"aggs": { // 嵌套聚合查询,设置桶内聚合指标"avg_price": { // 聚合查询名字,前面排序引用的就是这个名字"avg": {"field": "price"} // 计算price字段平均值}}}}
}

限制返回桶的数量 -size

GET /_search
{"aggs" : {"products" : { // 聚合查询名字"terms" : { // 聚合类型为: terms"field" : "product", // 根据product字段分桶"size" : 5 // 限制最多返回5个桶}}}
}

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

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

相关文章

是什麼讓WhatsApp行銷如此有效?

還記得在幾年前&#xff0c;WhatsAPP還是個用作於溝通的聊天工具。 但如今&#xff0c;它已轉變為強大的行銷管道&#xff0c;在全球擁有超過20億活躍使用者&#xff0c;為企業以直接、個人化和高度參與的方式與受眾建立聯繫提供了巨大的潛力。 WhatsApp 行銷和電子郵件行銷的…

Maven入门指南:构建与管理Java项目的利器

引言 在Java开发领域&#xff0c;项目构建和管理是一个至关重要的环节。随着项目规模和复杂度的不断增加&#xff0c;有效地管理项目的依赖、构建过程以及部署流程变得尤为关键。在这样的背景下&#xff0c;Apache Maven作为一款优秀的项目管理工具应运而生&#xff0c;成为了…

ChatGPT智能辅助:让学术论文写作更从容自如

ChatGPT无限次数:点击直达 html ChatGPT智能辅助&#xff1a;让学术论文写作更从容自如 引言 学术论文写作一直是许多研究者和学生头疼的问题。无论是构思文章框架、寻找合适的文献资料&#xff0c;还是整合思路、撰写论文正文&#xff0c;都是考验耐心与专业知识的过程。…

浅谈HTTP

浅谈HTTP 要通过netty实现HTTP服务器(或者客户端)&#xff0c;首先你要了解HTTP协议。 HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。 例如&#xff0c;web浏览器可以是客户端&#xff0c;并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交…

Vue ElementPlus Input 输入框

Input 输入框 通过鼠标或键盘输入字符 input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变&#xff0c;不支…

异构加速GPU服务器设计方案:904-全国产化异构加速GPU服务器

全国产化异构加速GPU服务器 一、产品介绍 X7340H0是中科可控基于HYGON系列处理器开发的一款全新高端2U双路GPU服务器。X7340H0采用优异的可扩展架构设计&#xff0c;支持高密度扩展GPU加速卡&#xff0c;为深度学习推理场景提供更加安全可靠、高性价比的解决方案。 性能卓越 ●…

全志A40i android7.1 移植wifi驱动的一般流程

一&#xff0c;问题分析 一般情况下移植一款模组&#xff0c;会涉及到驱动&#xff0c;firmware, hal层&#xff0c;方案端的适配。 下面以RTL8723ds为例详细列出移植的通用步骤。 二&#xff0c;移植步骤 1. 移植Wi-Fi驱动 从RTL原厂或者已经支持的其他把内核版本中获取驱动…

C++中string容器的字符串操作

目录 1.c_str() 返回C常量字符串 2.date() 返回C常量字符串 3.substr() 构造子串 4.find() 正向查找&#xff08;查找失败返回npos&#xff09; 5.rfind() 逆向查找&#xff08;查找失败返回npos&#xff09; 6.find_first_of() 正向查找匹配的字符 7.find_last_of() 逆向…

HTML面试题:get和post的区别

get和post都是HTTP中的两种请求方式 区别一&#xff0c;参数位置&#xff1a;GET请求把参数包含在URL中&#xff0c;POST将参数包含在请求体request body中。 区别二&#xff0c;回退&#xff1a;GET在浏览器回退时是无害的&#xff0c;而POST会再次提交请求。 区别三&#…

经典文献阅读之--LOG-LIO(高效局部几何信息估计的激光雷达惯性里程计)

0. 简介 局部几何信息即法线和点分布在基于激光雷达的同时定位与地图构建&#xff08;SLAM&#xff09;中是至关重要&#xff0c;因为它为数据关联提供了约束&#xff0c;进一步确定了优化方向&#xff0c;最终影响姿态的准确性。然而即使在使用KD树或体素图的辅助下&#xff…

【CANN训练营笔记】AscendCL图片分类应用(C++实现)

样例介绍 基于PyTorch框架的ResNet50模型&#xff0c;对*.jpg图片分类&#xff0c;输出各图片所属分类的编号、名称。 环境介绍 华为云AI1s CPU&#xff1a;Intel Xeon Gold 6278C CPU 2.60GHz 内存&#xff1a;8G NPU&#xff1a;Ascend 310 环境准备 下载驱动 wget ht…

git diff

1. 如何将库文件的变化生成到patch中 git diff --binary commit1 commit2 > test.patch 打patch&#xff1a; git apply test.patch 2. 如何消除trailing whitespace 问题 git diff --ignore-space-at-eol commit1 commit2 > test.patch 打patch&#xff1a; git ap…

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下&#xff1a; MongoDB 版本号的命名规则是 x.y.z&#xff0c;当其中的 y 是奇数时表示当前的版本为开发版&#xff0c;当其中的 y 是偶数时表示当前的…

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c;用…

Linux入侵排查

第2篇&#xff1a;Linux 入侵排查 0x00 前言 当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时&#xff0c;急需第一时间进行处理&#xff0c;使企业的网络信息系统在最短时间内恢复正常工作&#xff0c;进一步查找入侵来源&#xff0c;还原入侵事故过程&…

【C#】数字后缀及其作用 | Numeric Literal Suffixes and Their Usage in C#

C#中的数字字面量后缀及其作用 | Numeric Literal Suffixes and Their Usage in C# 在C#编程中,我们经常需要使用不同类型的数字,如整数、浮点数和高精度数字等。为了方便表示这些数字并明确其数据类型,C#提供了各种数字字面量后缀。本文将通过实例详细介绍这些后缀的作用和用…

【Python】【极简入门】12-元组

基本特性 元组就是一个逗号分隔的序列:t = ‘a’, ‘b’, ‘c’一般都用括号把元组括起来: t = (‘a’, ‘b’, ‘c’)创建单元素元组, 需要在末尾加上逗号: t1 = ‘a’, 不加逗号不构成元组:t2 = (‘a’)如果参数是一个序列 (字符串, 列表或者元组), 结果便会得到一个由元素…

首场直播,就在4月11日!

2024年的第一场直播&#xff0c;我们把目光聚焦到“大会员”。 这一次我们想聊聊&#xff0c;当大会员遇上泛零售企业&#xff0c;会产生怎样的“火花”。泛零售企业突破增长压力的机会在哪里&#xff1f;又有哪些挑战必须直面&#xff1f; 本次直播将结合泛零售企业“多业态、…

GEE问题——在使用sentienl数据云掩膜的时候发现出现中间连贯性的“条带”问题,如何解决?

简介 在使用sentienl+landsat数据掩膜的时候发现出现了中间连贯性的条带问题,如何解决?这里我们使用GEE出品的Landsat和sentinel数据的过程中,当我们进行云掩膜的时候出现了条带的问题。 问题 您注意到这个问题了吗? 我该如何消除它们(例如,在镶嵌前遮蔽瓦片最外层的 …

1379. 找出克隆二叉树中的相同节点

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始…