【Elasticsearch】聚合查询(四)

Elasticsearch(简称为ES)是一个基于Lucene的开源搜索和分析引擎,提供了丰富的聚合查询功能。聚合查询指的是在搜索结果上执行分组、汇总和统计等操作,以便从大量数据中提取有用的信息和洞察。

这篇文章主要介绍检索相关的操作,单值、多值、范围、模糊等查询方式,使用bool支持多种条件复杂查询。

一、环境准备

版本

Docker version 20.10.22
elasticsearch:7.13.3
kibana:7.13.3
ps:具体启动命令参考第一篇ES博客

二、聚合查询(metrics)

metrics 聚合查询是 Elasticsearch 聚合查询的一种类型,用于计算某个字段的统计指标,如平均值、总和、最大值、最小值、计数等。

常用统计方法

下面是常用的统计值:

  1. avg:计算数值字段的平均值。
  2. sum:对数值字段进行求和。
  3. min:找到数值字段的最小值。
  4. max:找到数值字段的最大值。
  5. stats:计算数值字段的最小值、最大值、平均值和总和。

查询示例

还是以bank索引为例子,"size": 0可以不返回原始数据。

// 查询薪水的平均值
POST /bank/_search
{"query": {"bool": {"must": {"match_all": {}}}},// 不需要查询原数据,只返回聚合结果"size": 0, "aggs": {"avg_balance": {"avg": {"field": "balance"}}}
}// 查询各种指标
POST /bank/_search
{"query": {"bool": {"must": {"match_all": {}}}},"size": 0,"aggs": {"stats_balance": {"stats": {"field": "balance"}}}
}// 返回值
{"took" : 6,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1000,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"stats_balance" : {"count" : 1000,// 数量"min" : 1011.0,// 最小值"max" : 49989.0,// 最大值"avg" : 25714.837,// 平均值"sum" : 2.5714837E7// 总和}}
}

三、桶聚合查询(Bucket)

桶聚合查询(Bucket Aggregations)是 Elasticsearch 聚合查询的一种类型,用于按照指定条件将文档分配到不同的"桶"中,并对每个桶进行聚合操作。桶聚合可以根据不同的字段值或范围进行分组和统计,以便提取有关数据集的更详细的信息和洞察。

PS:在桶查询中会有自定义名称,我这里会使用**_self**的后缀来体现。

常用查询类型

以下是一些常见的桶聚合查询类型及其功能:

  1. terms:根据某个字段的值进行分组,创建多个桶,并统计每个桶中的文档数量。
  2. date_histogram:根据时间字段将文档分配到不同的时间段桶中。
  3. range:根据某个字段的值范围将文档分配到不同的桶,并在每个桶上执行其他聚合操作。
  4. histogram:根据数值字段将文档分配到不同的数值段桶中,可以指定桶的间隔大小,并对每个数值段桶进行其他聚合操作。
  5. geo_distance:根据地理位置字段将文档分配到不同的距离范围桶中,可以指定中心点和距离范围,并在每个距离范围桶上执行其他聚合操作。
  6. nested:用于在嵌套的文档结构中进行聚合操作。可以创建多级的嵌套聚合来处理复杂的嵌套数据。

聚合查询

根据年龄进行分组查询。
类似于MySQL中的group by命令,对相同字段进行聚合,等价于select count(*) from bank group by age;

POST /bank/_search
{"query": {"bool": {"must": {"match_all": {}}}},"size": 0,"aggs": {// 自定义查询名称"age_group_self": {"terms": {"field": "age"}}}
}

image.png

聚合统计查询(进阶)

在对年龄分组后,查询组的平均薪水。
等价于select avg(balance) from bank group by age;

POST /bank/_search
{"query": {"bool": {"must": {"match_all": {}}}},"size": 0,"aggs": {// 第一次根据年龄聚合"age_group_self": {"terms": {"field": "age"},// 在每个年龄聚合内容内,取平均数"aggs": {"avg_balance_group_self": {"avg": {"field": "balance"}}}}}
}

image.png

聚合过滤统计查询(再进阶)

更近一步,查询每个年龄段中,薪水大于40000的人员平均工资。
等价于select avg(balance) from bank group by age having balance >= 40000;

POST /bank/_search
{"size": 0,"aggs": {"age_group_self": {"terms": {"field": "age"},"aggs": {// 相比增加过滤条件"avg_balance_group_self": {"filter": {"range": {"balance": {"gte": 40000}}},// 因为增加了过滤条件,然后把过滤后的结果进行聚合"aggs": {"avg_balance_group_self": {"avg": {"field": "balance"}}}}}}}
}

image.png

桶选择器

查询人数在55以上的年龄有哪些。
这里使用了bucket_selector 桶选择器,分别有多个参数,介绍如下。

{"bucket_selector": {"buckets_path": {// my_var1 是这个桶的路径中使用脚本中的变量的名称// the_sum 路径的度量所使用的变量。"my_var1": "the_sum","my_var2": "the_value_count"},// 在这个聚合上运行的脚本。这个脚本可以是内置的,文件或索引。"script": "params.my_var1 > params.my_var2"}
}

查询示例

POST /bank/_search
{"size": 0,"aggs": {"age_group_self": {"terms": {"field": "age"},"aggs": {"age_count_self": {"value_count": {"field": "age"}},"bucket_filter_self": {"bucket_selector": {"buckets_path": {"count": "age_count_self"},"script": "params.count > 55"}}}}}
}

image.png

四、总结

在聚合查询中,aggs 命令下首先是一个自定义命名的查询,在这之下可以继续做 aggs 操作,可以对数据进行过滤、排序等操作,再通过最外部的 query 命令进行检索。
在聚合中,是不会过滤桶的个数的,哪怕桶内已经没有符合要求的数据了,这个时候需要使用桶选择器对桶进行过滤。

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

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

相关文章

云部署家里的服务器

1.固定静态ip 查看ip地址,en开头的 ifconfig查看路由器ip,via开头的 ip route修改配置文件 cd /etc/netplan/ #来到这个文件夹 sudo cp 01-network-manager-all.yaml 01-network-manager-all.yaml.bak #先备…

Mac电脑强大的字体管理 RightFont for Mac

RightFont for Mac软件特色 速度有多快?RightFont可以在0.9秒以内加载30,000个字体! 自动从Google字体/ Adobe Typekit集合(通过Adobe Creative Cloud客户端)同步字体。 轻松切换组视图以折叠/展开字体系列。 通过简单的拖放导入…

华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制

华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制 1. 准备工作2. 环境搭建3. 心得总结 1. 准备工作 随着云计算时代的进一步深入,越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务运营和创新开发。基…

2023 MacBook Pro (Apple M2 Pro、macOS Ventura)配置Android开发环境

配置git和ssh 配置git简单,用brew下载就行。ssh配置其实也很简单,但是在macOS Ventura系统上遇到了加密方式的问题。 新mac的系统是macOS Ventura。 git 配置ssh网上有很多教程,但是,我正常生成密钥/共钥,把公钥配置…

python魔术方法详解

一、概述 一直搞不懂python类实例化后内部的函数是怎么自动执行的,原来是通过自定义的魔术方法(magic method)自动执行 二、魔术方法 2.1什么是魔术方法 在python声明的Class中,凡是以双"__"下划线命名的函数&#…

第2章 算法

2.1 开场白 2.2 数据结构与算法之间的关系 在“数据结构”课程中,就算谈到算法,也是为了帮助理解好数据结构,并不会详细谈及算法的方方面面。 2.3 两种算法的比较 2.4 算法的定义 算法是解决特定问题求解步骤的描述,在计算机…

一个人可以开发游戏吗?

在今天的数字时代,游戏产业已经成为全球最具活力的领域之一。从大型游戏开发工作室到独立游戏制作人,游戏开发已经变得更加多样化和容易进入。然而,对于许多梦想成为游戏开发者的人来说,一个关键问题一直挥之不去:一个…

Cortex-A9 架构

一、Cortex-A 处理器运行模式 Cortex-A9处理器有 9中处理模式,如下表所示: 九种运行模式 在上表中,除了User(USR)用户模式以外,其它8种运行模式都是特权模式,在特权模式下,程序可以访问所有的系统资源。这…

spark 集成 ClickHouse 和 MySQL (读和写操作)(笔记)

目录 前言: 一.spark读出 1. spark 读出 MySQL表数据 1.2 spark 读出 ClickHouse表数据 二.spark写入 1. spark 写入 MySQL表数据 2.spark 写入 ClickHouse表数据 前言: 这篇文章主要记录的是用spark集成ClickHouse和MySQL, 将数据read出…

贪心算法-金条切割问题

1、题目描述 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。 问:一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{1…

shell脚本使用(宿主机windows-服务器-centos)--用于使用shell脚本方式控制docker容器

需求: 我想要使得windows上编写shell脚本,并且在这个shell脚本在linux中也可用 shell脚本在windows上无法直接运行,但是有WSL这个linux子系统的工具 可以使得shell脚本在主机上执行 视频讲解连接 https://www.bilibili.com/video/BV1Tw411Y7FP/方式1 …

elasticsearch和mongodb对比

一般来说,我们会将elasticsearch和mongodb一起使用,那为什么我们不能只用其中一个呢? MongoDB 优点:数据写入性能优于ElasticSearch(但比不上Redis)、数据约束性强、完善的权限机制。 缺点:只…

filament渲染引擎中的坐标转换

文章目录 背景openGL中的坐标转换简单的概念介绍 屏幕坐标转世界坐标openGL的实现filament通过射线拾取计算filament官方给出的转换方式filament实现坐标转换的QA1、View::pick()2、为什么filament的计算方式没有除以w分量?3、为什么别的资料上都是inverse(viewMatr…

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发), 系统具有完整的源代码和数据…

(vue3)create-vue 组合式API

优势: 更易维护:组合式api,更好的TS支持 之前是选项式api,现在是组合式,把同功能的api集合式管理 复用功能封装成一整个函数 更快的速度 更小的体积 更优的数据响应式:Proxy create-vue 新的脚手架工…

计算机竞赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…

老卫带你学---leetcode刷题(124. 二叉树中的最大路径和)

124. 二叉树中的最大路径和 问题: 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总…

【数据结构】单链表的基本操作(节点建立、插入删除)

1. 单链表的基本操作 1.1. 链表的定义1.2. 链表的创建(初始化) 1.2.1. 不带头结点的链表1.2.2. 带头结点的链表 1.3. 链表的插入和删除 1.3.1. 按位序插入 1.3.1.1. 带头结点1.3.1.2. 不带头结点 1.3.2. 指定节点的后插操作1.3.3. 指定元素的前插操作1.3…

外汇天眼:外汇交易一周最佳外汇交易日!

外汇市场运行24小时,但并非每时每刻都适合交易。本文将为您介绍一周中最佳外汇交易日,以及哪些时间段最适合参与外汇交易。 首先,值得注意的是伦敦时段通常是外汇市场最繁忙的时段。然而,即便如此,一周中仍有特定的日…

debian无法使用reboot 等系统命令解决

重启debian的时候,报错没有此命令 然后查看环境配置文件,发现没有debian 安装后没有自动添加环境变量。 1.首先编辑配置文件 nano /etc/profile2.在文件末尾添加如下内容 export PATH$PATH:/sbin/3.保存退出 CTRL O // 保存 ENTER // 回车确认文…