【ElasticSearch系列-04】ElasticSearch的聚合查询操作

ElasticSearch系列整体栏目


内容链接地址
【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827
【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631
【三】ElasticSearch的高级查询Query DSLhttps://blog.csdn.net/zhenghuishengq/article/details/134159587
【四】ElasticSearch的聚合查询操作https://blog.csdn.net/zhenghuishengq/article/details/134159587

ElasticSearch的聚合查询操作

  • 一,深入理解es的聚合查询
    • 1,Metric Aggregation
    • 2,Bucket Aggregation
    • 3,Pipeline Aggregation
    • 4,ElasticSearch聚合结果不精准原因
      • 4.1,不精准原因
      • 4.2,如何提高精准度
      • 4.3,聚合查询优化

一,深入理解es的聚合查询

在关系型数据库中,存在聚合操作,如mysql的求最大值,最小值,平均值等。在es中,也是存在着这些操作的。

在Elasticsearch中,聚合操作可以分为三类,分别是 Metric AggregationBucket AggregationPipeline Aggregation

在针对具体的类型之前,先创建一个索引库,后面的举例都会用到该索引库。首先先创建一个员工索引库,如下面两个属性,一个是姓名,不需要分词,一个是工资

DELETE /employees
#创建索引库
PUT /employees
{"mappings": {"properties": {"name":{"type": "keyword"},"salary":{"type": "integer"}}}
}

创建完成之后,往里面插入一些数据,这里插入10条即可

PUT /employees/_bulk
{ "index" : {  "_id" : "1" } }
{ "name" : "huisheng1","salary":35000 }
{ "index" : {  "_id" : "2" } }
{ "name" : "huisheng2","salary": 50000}
{ "index" : {  "_id" : "3" } }
{ "name" : "huisheng3","salary":18000 }
{ "index" : {  "_id" : "4" } }
{ "name" : "huisheng4","salary": 22000}
{ "index" : {  "_id" : "5" } }
{ "name" : "huisheng5","salary":18000 }
{ "index" : {  "_id" : "6" } }
{ "name" : "huisheng6","salary": 25000}
{ "index" : {  "_id" : "7" } }
{ "name" : "huisheng7","salary":20000 }
{ "index" : {  "_id" : "8" } }
{ "name" : "huisheng8","salary": 20000}
{ "index" : {  "_id" : "9" } }
{ "name" : "huisheng9","salary":22000 }
{ "index" : {  "_id" : "10" } }
{ "name" : "huisheng10","salary": 9000}

1,Metric Aggregation

表示的是一些数学运算,可以对文档字段进行统计分析,比如说求min,max,avg等

如求用户的最大工资,就是上面salary字段的最大值,需要通过max关键字。在返回数据时,会将查询的数据以及最终的结果全部返回,因此可以加上一个size属性,其value设置为0

POST /employees/_search
{"size": 0,"aggs": {				//前缀,固定搭配"max_salary": {		//别名"max": {			//需要的聚合操作"field": "salary"}}}
}

求用户的最小工资,需要通过min关键字

POST /employees/_search
{"size": 0,"aggs": {"min_salary": {"min": {"field": "salary"}}}
}

求用户的平均工资,需要通过这个avg的关键字

POST /employees/_search
{"size": 0,"aggs": {"avg_salary": {"avg": {"field": "salary"}}}
}

或者直接通过一个 stats ,将要查询的聚合结果值全部返回

POST /employees/_search
{"size": 0,"aggs": {"stats_salary": {"stats": {"field": "salary"}}}
}

在这里插入图片描述

去重操作,可以直接使用 cardinality 关键字,去重的字段必须是一个keyword的字段

POST /employees/_search
{"size": 0,"aggs": {"cardinate_salary": {	//别名"cardinality": {"field": "salary"}}}
}

2,Bucket Aggregation

桶查询,类似于mysql的分组查询,将相同结果的放在一个桶里面,如对用户的姓名进行分组,最后再对每个组的数据进行统计,并以降序的方式。trems精确查询,一定是要对应 keyword 的字段

GET /employees/_search
{"size": 0,"aggs": {"name_count": {"terms": {"field":"name",		//对用户姓名进行分组"size": 10,"order": {"_count": "desc" }}}}
}

除了这个terms精确查询之外,还可以直接使用这个 ranges 进行分为分组,默认是从闭区间0开始,to的值为区间的结束值。如下面的区间就是 [0-100000),[10000,20000),[20000,无穷)

POST employees/_search
{"size": 0,"aggs": {"salary_range": {"range": {"field":"salary","ranges":[{"to":10000},{"from":10000,"to":20000},{"key":">20000","from":20000}]}}}
}

在这里插入图片描述

也可以直接按照直方图的方式进行区间分桶,如5000为一个区间

POST employees/_search
{"size": 0,"aggs": {"salary_histrogram": {"histogram": {"field":"salary","interval":5000,"extended_bounds":{"min":0,		//直方图的起始值"max":50000	//直方图的最大值}}}}
}

在这里插入图片描述

上面的集合单个的查询中,可以直接通过聚合操作将上面的操作嵌套使用。如先分组,随后求分组后的最大值最小值,以及中间可以经过多次分组等。如下面的先通过工资进行分桶,随后再对每一个桶进行求最大值和最小值

POST /employees/_search
{"size": 0,"aggs": {"salary_count": {"terms": {"field": "salary"},"aggs": {"salary": {"stats": {"field": "salary"}}}}}

在这里插入图片描述

3,Pipeline Aggregation

表示的是支持聚合操作,允许将前面的结果作为后面的参数使用。如下面的例子,主要是看这个 stats_salary_by_name 里面的结果

POST /employees/_search
{"size": 0,"aggs": {			"name": {		//别名1"terms": {"field": "name"},"aggs": {"avg_salary": {		//别名2"avg": {"field": "salary"}}}},"stats_salary_by_name":{"stats_bucket": {			//桶名"buckets_path": "name>avg_salary"	//桶路径}}}
}

除了这个 stats_bucket 用于求所有最大值最小值等聚合操作之外,还有下面的这些

cumulative_sum		//累计求和
percentiles_bucket	//求百分比
min_bucket			//求最小值

4,ElasticSearch聚合结果不精准原因

在面对大数据量时,数据的实时性和精确度往往不能同时满足,就是要么只能满足精确度,要么只能满足数据的实时性

4.1,不精准原因

不准确的原因是因为在取数据时,协调者分片每次取的数据是每个分片的最大值的个数,而不是每个分片汇总后的最大值的个数。如取每个分片的top3的数据,如下所示,取出的数据是ABC,是因为第一个分片取出的数据是6、4、6,第二个分片取出的数据是6、2、3,协调者分片汇总数据的时候,会觉得c的结果4会大于d的结果3,所以将c的结果取出。

然而实际上在两个分片中,c的汇总为3+1等于4,d的汇总为3+3等于6,按理是需要将d的结果取出的,反而取出的是c,这就是造成数据不精准的原因

img

4.2,如何提高精准度

  • 如果是数据量小的场景中,可以直接将主分片的值设置为1(推荐使用)
  • 如果数据量大的场景,可以调大 shard_size 的值(推荐使用)
  • 将size设置成全量值,不推荐使用
  • 不用es,改用clickhouse/spark

4.3,聚合查询优化

1,启用 eager global ordinals 来提升高基数聚合性能,就是一个字段的的离散率大一点

2,在插入数据时进行预排序,如提前指定好需要排序的字段。但是这种方式会影响写性能,只适合读多写少的场景

PUT /my_index
{"settings": {"index":{"sort.field": "create_time","sort.order": "desc"}}

3,使用结点缓存Node query cache,可以有效缓存过滤器filter的值

4,使用分片缓存,在查询时直接设置size为0,只返回聚合结果,不返回查询结果

5,拆分聚合,使聚合并行化。通过msearch实现,将一个聚合拆分成多个查询

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

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

相关文章

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别; 2. OSPF协议通信过程与部署; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的? - 依靠手动 或…

python脚本监听域名证书过期时间,并将通知消息到钉钉

版本一: 执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名 python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_tokenavd345324 --domains www.abc1.com www.abc2.com www.abc3.com脚本如下 #!/usr/bin…

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p,请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如,在图8.9的二叉搜索树中,节点8的下一个节点是节点9,节点11的下一个节点是null。 分析&#xf…

Qt封装的Halcon显示控件,支持ROI绘制

前言 目前机器视觉ROI交互控件在C#上做的比较多,而Qt上做的比较少,根据作者 VSQtHalcon——显示图片,实现鼠标缩放、移动图片的文章,我在显示和移动控件的基础上,增加了ROI设置功能,并封装成了一个独立的Q…

领星ERP如何无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

领星ERP(LINGXING)是一款专业的一站式亚马逊管理系统,帮助卖家构建完整的数据化运营闭环。,致力于为跨境电商卖家提供精细化运营和业财一体化的解决方案。 官网:https://erp.lingxing.com 集简云无代码集成平台&…

轻量封装WebGPU渲染系统示例<13>- 屏幕空间后处理效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/ScreenPostEffect.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见:引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。…

轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计

一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业,由于生产需要,人员需频繁进入打包机内作业,如:加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中,每个班次生产线材超过300件,人员在一…

腾讯云优惠券是什么?腾讯云优惠券怎么领取?

腾讯云是腾讯集团倾力打造的云计算品牌,为了吸引用户上云,经常推出各种优惠活动,其中就包括腾讯云优惠券。 1、腾讯云优惠券解释说明 腾讯云优惠券是腾讯云的一种优惠凭证,包括代金券和折扣券,领券之后新购、续费、升…

证明char是定长的?

证明char是定长的? 大部分博客都在讲解char和varchar区别的时候都谈到char为定长,varchar为变长。 但是怎么证明char为定长呢? 下面是我证明的过程。 创建CHAR列:首先,创建一个CHAR列,指定其长度。例如&…

基于Tensorflow卷积神经网络玉米病害识别系统(UI界面)

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 Tensorflow是一个流行的机器学习框架,可用于训练和部署各种人工智能模型。玉米病害识别系统基于Tensorf…

毕业设计-课程设计-基于python+django+vue开发的外卖点餐网站

文章目录 源码下载地址项目介绍项目功能界面预览项目备注毕设定制,咨询 源码下载地址 点击下载源码 项目介绍 该系统是基于pythondjango开发的外卖点餐系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者…

【音视频 | opus】opus编解码库(opus-1.4)详细介绍以及使用——附带解码示例代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

答题测评考试小程序的效果如何

在线答题系统是一种在线练习、考试、测评的智能答题系统,适用于企业培训、测评考试、知识竞赛、模拟考试等场景,管理员可任意组题、随机出题,答题者成功提交后,系统自动判分。 多种题目类型,两种答题模式 练习模式&a…

搭建Qt5.7.1+kylinV10开发环境、运行环境

1.下载Qt源码 Index of / 2.编译Qt 解压缩qt-everywhere-opensource-src-5.7.1.tar.gz 进入到qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs这个目录下, 2.1找到以下目录 复制他,然后改名linux-x86-arrch64,博主这里名字取的有些问…

go测试库之apitest

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

使用Python 脚自动化操作服务器配置

“ 有几十台特殊的服务器,没有合适的批量工具只能手动,要一个一个进行点击设置很耗费时间呀\~”,使用 Python 的简单脚本,即可模拟鼠标键盘进行批量作业 01 — 自动化示例 以某服务器中的添加用户权限为例,演示过程皆未触碰鼠标…

Git https方式拉的代码IDEA推送代码报错

报错信息 fatal: could not read Username for ‘https://codehub-cn-south-1.devcloud.huaweicloud.com’: No such file or directory 18:18:39.885: [recovery_pattern] git -c credential.helper -c core.quotepathfalse -c log.showSignaturefalse push --progress --porc…

LCR 166.珠宝的最高价值 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

LCR 166. 珠宝的最高价值 - 力扣(LeetCode) 现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为: 只能从架子的左上角开始拿珠宝每次可以移动到右侧或下侧的相邻位置到达珠宝架子的右下…

git生成gitee和github两个不同的公钥

配置多个公钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 1、生成公钥文件: 通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t rsa -C "Gitee SSH Key" -f ~/.ssh/gitee_be…

我的ChatGPT的几个使用场景

示例一,工作辅助、写函数代码: 这里展示了一个完整的代码,修正,然后最终输出的过程。GPT具备足够丰富的相关的小型代码生成能力,语法能力也足够好。这类应用场景,在我的GPT使用中,能占到65%以上…