ElasticSearch聚合操作案例

news2025/5/13 7:59:23

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

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

相关文章

使用 OAuth 2.0 保护 REST API

使用 OAuth 2.0 保护 REST API 使用 OAuth 2.0 保护 REST API1.1 不安全的api1.2 安全默认值安全默认值Spring Security 默认值 需要对所有请求进行身份验证Servlet、过滤器和调度程序安全优势 使用所有请求的安全标头进行响应缓存标头 严格传输安全标头内容类型选项需要对所有…

解决下拉框数据提交后回显名称不对

问题背景描述 页面组件使用 antd 的 Select 组件,下拉框的 options 数据是动态获取的,基本就是有value 和 label 属性的对象数组。 提交数据后,我们有一个保存草稿的操作,支持返回或者刷新页面,浏览其他页面之后通过其…

lenis滑动插件的笔记

官网 lenis - npm 方法一:基础判断(推荐) 通过 Lenis 自带的 scroll 和 limit 属性直接判断: const lenis new Lenis()// 滚动事件监听 lenis.on(scroll, ({ scroll, limit }) > {const distanceToBottom limit - scroll…

Android Framework

Android 分区 /boot:存放引导程序,包括内核和内存操作程序。/system:相当于电脑 C 盘,存放 Android 系统及系统应用。/recovery:恢复分区,可以进入该分区进行系统恢复。/data:用户数据区&#…

OpenMCU(六):STM32F103开发板功能介绍

概述 距上一篇关于STM32F103的FreeRTOS博客的发布已经过去很长时间没有更新了。在这段时间内,大家可以看到博主发表了一系列的关于使用qemu 模拟实现STM32F103的博客,博主本来想借助qemu开发stm32F103相关的一些软件功能,博主开发出来并成功运…

Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链

字节跳动开源了一款采用 Rust 开发的前端模块打包工具:Rspack(读音为 /ɑrspk/)。 据介绍,Rspack 是一个基于 Rust 的高性能构建引擎,具备与 Webpack 生态系统的互操作性,可以被 Webpack 项目低成本集成&a…

高速系统设计实例设计分析

在上几章的内容中,我们从纯粹高速信号的理论分析,到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习,已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是,对于高速电…

查看购物车

一.查看购物车 查看购物车使用get请求。我们要查看当前用户的购物车,就要获取当前用户的userId字段进行条件查询。因为在用户登录时就已经将userId封装在token中了,因此我们只需要解析token获取userId即可,不需要前端再传入参数了。 Control…

开发工具分享: Web前端编码常用的在线编译器

1.OneCompiler 工具网址:https://onecompiler.com/ OneCompiler支持60多种编程语言,在全球有超过1280万用户,让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费,对编程语言的覆盖也很全&#x…

智启未来:新一代云MSP管理服务助力企业实现云成本管理和持续优化

在数字化转型浪潮下,企业纷纷寻求更高效、更经济的运营方式。随着云计算技术的深入应用,云成本优化已成为企业普遍关注的核心议题。 过去,传统云运维服务往往依赖于人力外包,缺乏系统性、规范性的管理,难以有效降低云…

window 显示驱动开发-将虚拟地址映射到内存段(二)

在将虚拟地址映射到段的一部分之前,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数,以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈,也不能更改分配…

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

🌹欢迎来到《小5讲堂》🌹 🌹这是《文心智能体》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正&#xff0…

K8S中构建双架构镜像-从零到成功

背景介绍 公司一个客户的项目使用的全信创的环境,服务器采用arm64的机器,而我们的应用全部是amd64的,于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程,以及其中使用的相关配置…

c语言第一个小游戏:贪吃蛇小游戏03

我们为贪吃蛇的节点设置为一个结构体,构成贪吃蛇的身子的话我们使用链表,链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…

​​​​​​​大规模预训练范式(Large-scale Pre-training)

大规模预训练指在巨量无标注数据上,通过自监督学习训练大参数量的基础模型,使其具备通用的表征与推理能力。其重要作用如下: 一 跨任务泛化 单一模型可在微调后处理多种NLP(自然语言处理)、CV(计算机视觉…

WPF之高级绑定技术

文章目录 引言多重绑定(MultiBinding)基本概念实现自定义IMultiValueConverterMultiBinding在XAML中的应用示例使用StringFormat简化MultiBinding 优先级绑定(PriorityBinding)基本概念PriorityBinding示例实现PriorityBinding的后…

调出事件查看器界面的4种方法

方法1. 方法2. 方法3. 方法4.

使用vite重构vue-cli的vue3项目

一、修改依赖 首先修改 package.json,修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖,注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…

数据治理域——数据治理体系建设

摘要 本文主要介绍了数据治理系统的建设。数据治理对企业至关重要,其动因包括应对数据爆炸增长、提升内部管理效率、支撑复杂业务需求、加强风险防控与合规管理以及实现数字化转型战略。其核心目的是提升数据质量、统一数据标准、优化数据资产管理、支撑业务发展和…

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU:简化的生成式 AI UI界面开源程序,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…