ElasticSearch聚合操作案例

1、根据color分组统计销售数量

只执行聚合分组,不做复杂的聚合统计。在ES中最基础的聚合为terms,相当于
SQL中的count。
在ES中默认为分组数据做排序,使用的是doc_count数据执行降序排列。可以使用
_key元数据,根据分组后的字段数据执行不同的排序方案,也可以根据_count元数
据,根据分组后的统计值执行不同的排序方案。

1 GET /cars/_search
2 {
3 "aggs": {
4 "group_by_color": {
5 "terms": {
6 "field": "color",
7 "order": {
8 "_count": "desc"
9 }
10 }
11 }
12 }
13 }

2、统计不同color车辆的平均价格

本案例先根据color执行聚合分组,在此分组的基础上,对组内数据执行聚合统
计,这个组内数据的聚合统计就是metric。同样可以执行排序,因为组内有聚合统
计,且对统计数据给予了命名avg_by_price,所以可以根据这个聚合统计数据字段名
执行排序逻辑。

1 GET /cars/_search
2 {
3 "aggs": {
4 "group_by_color": {
5 "terms": {
6 "field": "color",
7 "order": {
8 "avg_by_price": "asc"
9 }
10 },
11 "aggs": {
12 "avg_by_price": {
13 "avg": {
14 "field": "price"
15 }
16 }
17 }
18 }
19 }
20 }
size可以设置为0,表示不返回ES中的文档,只返回ES聚合之后的数据,提高查询速
度,当然如果你需要这些文档的话,也可以按照实际情况进行设置
1 GET /cars/_search
2 {
3 "size" : 0,
4 "aggs": {
5 "group_by_color": {
6 "terms": {
7 "field": "color"
8 },
9 "aggs": {
10 "group_by_brand" : {
11 "terms": {
12 "field": "brand",
13 "order": {
14 "avg_by_price": "desc"
15 }
16 },
17 "aggs": {
18 "avg_by_price": {
19 "avg": {
20 "field": "price"
21 }
22 }
23 }
24 }
25 }
26 }
27 }
28 }

3、统计不同color不同brand中车辆的平均价格

先根据color聚合分组,在组内根据brand再次聚合分组,这种操作可以称为下钻
分析。
Aggs如果定义比较多,则会感觉语法格式混乱,aggs语法格式,有一个相对固定
的结构,简单定义:aggs可以嵌套定义,可以水平定义。
嵌套定义称为下钻分析。水平定义就是平铺多个分组方式。

1 GET /index_name/type_name/_search
2 {
3 "aggs" : {
4 "定义分组名称(最外层)": {
5 "分组策略如:terms、avg、sum" : {
6 "field" : "根据哪一个字段分组",
7 "其他参数" : ""
8 },
9 "aggs" : {
10 "分组名称1" : {},
11 "分组名称2" : {}
12 }
13 }
14 }
15 }
1 GET /cars/_search
2 {
3 "aggs": {
4 "group_by_color": {
5 "terms": {
6 "field": "color",
7 "order": {
8 "avg_by_price_color": "asc"
9 }
10 },
11 "aggs": {
12 "avg_by_price_color" : {
13 "avg": {
14 "field": "price"
15 }
16 },
17 "group_by_brand" : {
18 "terms": {
19 "field": "brand",
20 "order": {
21 "avg_by_price_brand": "desc"
22 }
23 },
24 "aggs": {
25 "avg_by_price_brand": {
26 "avg": {
27 "field": "price"
28 }
29 }
30 }
31 }
32 }
33 }
34 }
35 }

4、统计不同color中的最大和最小价格、总价

1 GET /cars/_search
2 {
3 "aggs": {
4 "group_by_color": {
5 "terms": {
6 "field": "color"
7 },
8 "aggs": {
9 "max_price": {
10 "max": {
11 "field": "price"
12 }
13 },
14 "min_price" : {
15 "min": {
16 "field": "price"
17 }
18 },
19 "sum_price" : {
20 "sum": {
21 "field": "price"
22 }
23 }
24 }
25 }
26 }
27 }

5、统计不同品牌汽车中价格排名最高的车型

在分组后,可能需要对组内的数据进行排序,并选择其中排名高的数据。那么可
以使用s来实现:top_top_hithits中的属性size代表取组内多少条数据(默认为
10);sort代表组内使用什么字段什么规则排序(默认使用_doc的asc规则排序);
_source代表结果中包含document中的那些字段(默认包含全部字段)。
1 GET cars/_search
2 {
3 "size" : 0,
4 "aggs": {
5 "group_by_brand": {
6 "terms": {
7 "field": "brand"
8 },
9 "aggs": {
10 "top_car": {
11 "top_hits": {
12 "size": 1,
13 "sort": [
14 {
15 "price": {
16 "order": "desc"
17 }
18 }
19 ],
20 "_source": {
21 "includes": ["model", "price"]
22 }
23 }
24 }
25 }
26 }
27 }
28 }

6、histogram 区间统计

histogram类似terms,也是进行bucket分组操作的,是根据一个field,实现数据
区间分组。
如:以100万为一个范围,统计不同范围内车辆的销售量和平均价格。那么使用
histogram的聚合的时候,field指定价格字段price。区间范围是100万-interval :
1000000。这个时候ES会将price价格区间划分为: [0, 1000000), [1000000,
2000000), [2000000, 3000000)等,依次类推。在划分区间的同时,histogram会类似
terms进行数据数量的统计(count),可以通过嵌套aggs对聚合分组后的组内数据做
再次聚合分析。

1 GET /cars/_search
2 {
3 "aggs": {
4 "histogram_by_price": {
5 "histogram": {
6 "field": "price",
7 "interval": 1000000
8 },
9 "aggs": {
10 "avg_by_price": {
11 "avg": {
12 "field": "price"
13 }
14 }
15 }
16 }
17 }
18 }

7、date_histogram区间分组

date_histogram可以对date类型的field执行区间聚合分组,如每月销量,每年销
量等。
如:以月为单位,统计不同月份汽车的销售数量及销售总金额。这个时候可以使
用date_histogram实现聚合分组,其中field来指定用于聚合分组的字段,interval指
定区间范围(可选值有:year、quarter、month、week、day、hour、minute、
second),format指定日期格式化,min_doc_count指定每个区间的最少document(如
果不指定,默认为0,当区间范围内没有document时,也会显示bucket分组),
extended_bounds指定起始时间和结束时间(如果不指定,默认使用字段中日期最小值
所在范围和最大值所在范围为起始和结束时间)。

1 ES7.x之前的语法
2 GET /cars/_search
3 {
4 "aggs": {
5 "histogram_by_date" : {
6 "date_histogram": {
7 "field": "sold_date",
8 "interval": "month",
9 "format": "yyyy‐MM‐dd",
10 "min_doc_count": 1,
11 "extended_bounds": {
12 "min": "2021‐01‐01",
13 "max": "2022‐12‐31"
14 }
15 },
16 "aggs": {
17 "sum_by_price": {
18 "sum": {
19 "field": "price"
20 }
21 }
22 }
23 }
24 }
25 }
26 执行后出现
27 #! Deprecation: [interval] on [date_histogram] is deprecated, use [fixed_inter
val] or [calendar_interval] in the future.
28
29 7.X之后
30 GET /cars/_search
31 {
32 "aggs": {
33 "histogram_by_date" : {
34 "date_histogram": {
35 "field": "sold_date",
36 "calendar_interval": "month",
37 "format": "yyyy‐MM‐dd",
38 "min_doc_count": 1,
39 "extended_bounds": {
40 "min": "2021‐01‐01",
41 "max": "2022‐12‐31"
42 }
43 },
44 "aggs": {
45 "sum_by_price": {
46 "sum": {
47 "field": "price"
48 }
49 }
50 }
51 }
52 }
53 }

8、_global bucket

在聚合统计数据的时候,有些时候需要对比部分数据和总体数据。
如:统计某品牌车辆平均价格和所有车辆平均价格。global是用于定义一个全局
bucket,这个bucket会忽略query的条件,检索所有document进行对应的聚合统计。

 GET /cars/_search
2 {
3 "size" : 0,
4 "query": {
5 "match": {
6 "brand": "大众"
7 }
8 },
9 "aggs": {
10 "volkswagen_of_avg_price": {
11 "avg": {
12 "field": "price"
13 }
14 },
15 "all_avg_price" : {
16 "global": {},
17 "aggs": {
18 "all_of_price": {
19 "avg": {
20 "field": "price"
21 }
22 }
23 }
24 }
25 }
26 }

9、aggs+order

对聚合统计数据进行排序。
如:统计每个品牌的汽车销量和销售总额,按照销售总额的降序排列。
1 GET /cars/_search
2 {
3 "aggs": {
4 "group_of_brand": {
5 "terms": {
6 "field": "brand",
7 "order": {
8 "sum_of_price": "desc"
9 }
10 },
11 "aggs": {
12 "sum_of_price": {
13 "sum": {
14 "field": "price"
15 }
16 }
17 }
18 }
19 }
20 }
如果有多层aggs,执行下钻聚合的时候,也可以根据最内层聚合数据执行排序。
如:统计每个品牌中每种颜色车辆的销售总额,并根据销售总额降序排列。这就像
SQL中的分组排序一样,只能组内数据排序,而不能跨组实现排序。
1 GET /cars/_search
2 {
3 "aggs": {
4 "group_by_brand": {
5 "terms": {
6 "field": "brand"
7 },
8 "aggs": {
9 "group_by_color": {
10 "terms": {
11 "field": "color",
12 "order": {
13 "sum_of_price": "desc"
14 }
15 },
16 "aggs": {
17 "sum_of_price": {
18 "sum": {
19 "field": "price"
20 }
21 }
22 }
23 }
24 }
25 }
26 }
27 }

10、search+aggs

聚合类似SQL中的group by子句,search类似SQL中的where子句。在ES中是完全可
以将search和aggregations整合起来,执行相对更复杂的搜索统计。

如:统计某品牌车辆每个季度的销量和销售额。
1 GET /cars/_search
2 {
3 "query": {
4 "match": {
5 "brand": "大众"
6 }
7 },
8 "aggs": {
9 "histogram_by_date": {
10 "date_histogram": {
11 "field": "sold_date",
12 "calendar_interval": "quarter",
13 "min_doc_count": 1
14 },
15 "aggs": {
16 "sum_by_price": {
17 "sum": {
18 "field": "price"
19 }
20 }
21 }
22 }
23 }
24 }

11、filter+aggs

在ES中,filter也可以和aggs组合使用,实现相对复杂的过滤聚合分析。

如:统计10万~50万之间的车辆的平均价格。
1 GET /cars/_search
2 {
3 "query": {
4 "constant_score": {
5 "filter": {
6 "range": {
7 "price": {
8 "gte": 100000,
9 "lte": 500000
10 }
11 }
12 }
13 }
14 },
15 "aggs": {
16 "avg_by_price": {
17 "avg": {
18 "field": "price"
19 }
20 }
21 }
22 }

12、聚合中使用filter

filter也可以使用在aggs句法中,filter的范围决定了其过滤的范围。

如:统计某品牌汽车最近一年的销售总额。将filter放在aggs内部,代表这个过滤器
只对query搜索得到的结果执行filter过滤。如果filter放在aggs外部,过滤器则会过
滤所有的数据。
12M/M 表示 12 个月。
1y/y 表示 1年。
d 表示天
1 GET /cars/_search
2 {
3 "query": {
4 "match": {
5 "brand": "大众"
6 }
7 },
8 "aggs": {
9 "count_last_year": {
10 "filter": {
11 "range": {
12 "sold_date": {
13 "gte": "now‐12M"
14 }
15 }
16 },
17 "aggs": {
18 "sum_of_price_last_year": {
19 "sum": {
20 "field": "price"
21 }
22 }
23 }
24 }
25 }
26 }

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

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

相关文章

SQLite 数据库常见问题及解决方法

一、数据库文件锁定问题 1. 问题表现 在多线程或多进程环境下访问 SQLite 数据库时,常常会出现数据库文件被锁定的情况。当一个进程对数据库执行写操作时,其他进程的读写操作都会被阻塞,导致应用程序出现卡顿甚至无响应。比如在移动应用开发…

DeepSeek基础:PPO、DPO、GRPO概念详解

DeepSeek-R1 的强化学习方案中,其亮点之一在于通过 GRPO 算法取代RLHF 常用的 PPO,通过尽可能减少人类标注数据,设计纯 RL 的环境,用精心设计的奖励机制来训练模型自己学会推理。那么什么是PPO、GRPO,其产生的背景、核…

一分钟了解机器学习

一分钟了解机器学习 A Minute to Know About Machine Learning By JacksonML 1. 什么是机器学习? 机器学习(Machine Learning,ML) 是人工智能的分支,通过从数据中自动学习规律,使计算机无需显式编程即可完成任务。…

mvc-service引入

什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…

第一次做逆向

题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…

docker(四)使用篇二:docker 镜像

在上一章中,我们介绍了 docker 镜像仓库,本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…

k8s 1.10.26 一次containerd失败引发kubectl不可用问题

k8s 1.10.26 一次containerd失败引发kubectl不可用问题 开机k8s 1.10.26时,报以下错误 [rootmaster ~]# kubectl get no E0515 08:03:00.914894 7993 memcache.go:265] couldnt get current server API group list: Get "https://192.168.80.50:6443/api?…

今日积累:若依框架配置QQ邮箱,来发邮件,注册账号使用

QQ邮箱SMTP服务器设置 首先,我们需要了解QQ邮箱的SMTP服务器地址。对于QQ邮箱,SMTP服务器地址通常是smtp.qq.com。这个地址适用于所有使用QQ邮箱发送邮件的客户端。 QQ邮箱SMTP端口设置 QQ邮箱提供了两种加密方式:SSL和STARTTLS。根据您选…

无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成

在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…

4.2.3 Thymeleaf标准表达式 - 5. 片段表达式

在本次实战中,我们通过 Thymeleaf 的片段表达式实现了模板的模块化和复用。首先,我们定义了一个导航栏片段 navbar,并通过参数 activeTab 动态高亮当前激活的标签。然后,我们在多个页面(如主页、关于页和联系页&#x…

网安面试经(1)

1.说说IPsec VPN 答:IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术,在公共网络中创建加密隧道,确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公,能有效防范数据泄露与篡改,但部署…

【C++/Qt shared_ptr 与 线程池】合作使用案例

以下是一个结合 std::shared_ptr 和 Qt 线程池(QThreadPool)的完整案例,展示了如何在多线程任务中安全管理资源,避免内存泄漏。 案例场景 任务目标:在后台线程中处理一个耗时的图像检测任务,任务对象通过 …

【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表

更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…

经典案例 | 筑基与跃升:解码制造企业产供销协同难题

引言 制造企业如何在投产初期突破管理瓶颈,实现高效运营?G公司作为某大型集团的新建子公司,面对产供销流程缺失、跨部门协同低效等难题,选择与AMT企源合作开展流程优化。 项目通过端到端流程体系搭建、标准化操作规范制定及长效管…

【Python 操作 MySQL 数据库】

在 Python 中操作 MySQL 数据库主要通过 pymysql 或 mysql-connector-python 库实现。以下是完整的技术指南,包含连接管理、CRUD 操作和最佳实践: 一、环境准备 1. 安装驱动库 pip install pymysql # 推荐(纯Python实现&#xff0…

记录vsCode连接gitee并实现项目拉取和上传

标题 在 VSCode 中上传代码到 Gitee 仓库 要在 VSCode 中将代码上传到 Gitee (码云) 仓库,你可以按照以下步骤操作: 准备工作 确保已安装 Git确保已安装 VSCode拥有 Gitee 账号并创建了仓库 可以参考该文章的部分:idea实现与gitee连接 操…

【信息系统项目管理师】第6章:项目管理概论 - 31个经典题目及详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 第一节 PMBOK的发展【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】第二节 项目基本要素【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】第三节 项目经…

简单介绍C++中线性代数运算库Eigen

Eigen 是一个高性能的 C 模板库,专注于线性代数、矩阵和向量运算,广泛应用于科学计算、机器学习和计算机视觉等领域。以下是对 Eigen 库的详细介绍: 1. 概述 核心功能:支持矩阵、向量运算,包括基本算术、矩阵分解&…

生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans

生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans Flyte 是一个开源编排器,用于构建生产级数据和机器学习流水线。它以 Kubernetes 作为底层平台,注重可扩展性和可重复性。借助 Flyte,用户团队可以使用 P…

Python 之类型注解

类型注解允许开发者显式地声明变量、函数参数和返回值的类型。但是加不加注解对于程序的运行没任何影响(是非强制的,且类型注解不影响运行时行为),属于 有了挺好,没有也行。但是大型项目按照规范添加注解的话&#xff…