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

news2024/11/27 21:52:34

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.coloradmin.cn/o/1166749.html

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

相关文章

迅为iTOP-RK3568开发板npu手册更新

iTOP -RK3568开发板使用教程更新,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 为了满足人工智能的需要,去年,迅为基于RK3568开发板编写了对应的手册文档>>>【资料上新】基…

K7系列FPGA进行FLASH读写1——CCLK控制(STARTUPE2原语)

最近的工作涉及对 FPGA 进行远程更新,也就是通过远程通信接口将 .bin 文件送到 FPGA,然后写入 FLASH,这样当 FPGA 重新上电后就可以执行更新后的程序了。因此第一步工作就是进行 FLASH 的读写控制。 然而如果尝试配置 FLASH 管脚时&#xff0…

队列、循环队列和双端队列

目录 1、队列 1.1 概念 2.2 队列的使用 2.3 队列模拟实现 2、循环队列 2.1 循环队列的认识 2.2 设计循环队列 3. 双端队列 (Deque) 1、队列 1.1 概念 队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列…

Python之Excel——复制一个sheet当做模板,生成多个sheet

目录 专栏导读背景思路1、加载模板2、项目文件2、完整版代码:3、视频演示:4、总结:👍 该系列文章专栏:[Python办公自动化专栏] 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍&…

synchronized和死锁介绍

synchronized特性synchronized使用修饰普通方法(对象锁)修饰静态方法(类锁)修饰代码块(明确指定锁的对象)非锁竞争情况 死锁死锁是什么?死锁的必要条件循环等待场景程序死锁怎么排除死锁问题怎么解决 标准库的线程安全…

led驱动电源模块能进行自动化测试吗,具体测试方法,流程是?

LED电源模块测试的痛点主要包括以下几点: 测试效率低:传统的LED电源模块测试方法通常采用人工操作,测试效率低下,且易出错。 测试项目不全面:传统的测试方法可能无法覆盖所有的性能指标,导致一些潜在的问…

非洲“支付宝”PalmPay搭载OceanBase:成本降低80%

10 月 30 日,非洲支付公司PalmPay 的核心系统搭载国产自研数据库OceanBase,正式投入使用。PalmPay 也是 OceanBase 首个非洲商业用户。 作为一家非洲领先的金融科技公司,PalmPay 于 2019 年在尼日利亚推出电子钱包应用,其功能类似…

Verilog刷题[hdlbits] :Module cseladd

题目:Module cseladd One drawback of the ripple carry adder (See previous exercise) is that the delay for an adder to compute the carry out (from the carry-in, in the worst case) is fairly slow, and the second-stage adder cannot begin computing …

推荐PHP匿名在线聊天室系统源码

PHP匿名在线聊天室系统源码 自适应PCWAP端 可发语音、图片,修改数据库config\settings.php可拿去搭建专门跟客户聊天的网站。 演示地址:runruncode.com/php/19610.html

AD教程(五)光耦及二极管元件模型的创建

AD教程(五)光耦及二极管元件模型的创建 二极管元件的创建 放置管脚,设置管脚号和管脚名称(一般隐藏)绘制三角形 右键放置直线,选择放置多边形,操作逻辑,每次操作都会增加一边&…

【面试精选】00后卷王带你三天刷完软件测试面试八股文

前言 本人普通本科计算机专业,做测试也有3年的时间了,讲下我的经历,我刚毕业就进了一个小自研薪资还不错,有10.5k(个人觉得我很优秀),在里面呆了两年,积累了一些的经验和技能&#…

火爆全网,性能测试-Tomcat连接数分析/jprofiler定位接口相应时长(总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Tomcat链接数分…

QT之多个界面相互切换 (stackedWidget控件)

TOC Chapter1 QT之多个界面相互切换 (stackedWidget控件) 原文链接 stackedWidget控件: 可以自由在多个widget切换,可以通过点击顶部菜单,显示不同界面,在实际开发中应用很广泛。 QStackedWidget是一个堆栈窗口控件&#xff0c…

tp6使用Spreadsheet报错:Class ‘PhpOffice\PhpSpreadsheet\Spreadsheet‘ not found

问题提示如下: 可能vendor下的 phpoffice是从别的项目拷贝过来的,所以咋都不行 解决办法是删掉vendor下的phpoffice,用composer重新下载 具体操作:1、在项目根目录下cmd执行下面这条命令 composer require phpoffice/phpspread…

【Linux】 shutdown 命令使用

shutdown 命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机。使用权限:系统管理者。 语法 shutdown [选项] 时间 [警告信息] 命令选项及作用 执行令 man shutdown 执行命令结果 参…

矿山数字化react-native技术点记录

文章目录 1,宽度自适应表格实现2,新建作业手势动画3,tabBar中间midTabBar动态展示4,堆料图实现5,语音识别实现6,待办事项上下滑动切换页面7,装料卸料手势冲突8,首页初始化性能9&…

有活动啦 | 同立海源年终大促,满额赠礼!

秋天是倒放的春天 时间不停流转 四季马不停蹄 转眼间 距离2024年还有59天啦! 在这个最美的季节 同立海源,年终大促,携礼而来! 关于同立海源 北京同立海源生物科技有限公司,专注细胞和基因治疗(CGT&am…

都是80m²小户型,凭啥她家那么好看!福州中宅装饰,福州装修

杨桥新苑 本案来自杨桥新苑的住宅, 质朴弥漫在80㎡的小家, 自然淡雅的木纹,精炼的玄关隔断, 简约的设计里传达着中式的静谧风雅, 简练的空间加入中国元素, 让人从进门开始就沾染一丝艺术气息。 风格&a…

库尔勒春雨社会工作服务中心开展“三金西瓜霜‘爱牙公益行’善网公益资源对接

为进一步增强辖区居民口腔健康观念和口腔保健意识,加大口腔防治知识宣传教育,促进形成良好的口腔健康行为。10月29日,库尔勒市春雨社会工作服务中心联合库尔勒市天山街道未成年人保护站开展“三金西瓜霜‘爱牙公益行’─善网公益资源对接”公…

uniapp原生插件之安卓客户端之间wifi文件传输

插件介绍 安卓客户端之间文件传输,支持大文件传输,Wifi/热点文件传输,轻松传送1G文件 插件地址 安卓客户端之间wifi文件传输 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 使用文档 详细使用文档 示例文件 百度网盘链接&a…