【Elasticsearch系列十二】聚合-电视案例

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

      • 1.统计哪种颜色的电视销量最高
      • 2,统计每种颜色电视平均价格
      • 3.继续下钻分析
      • 4.更多的 metric
      • 5.划分范围 histogram
        • 6.按照日期分组聚合
      • 7.统计每季度每个品牌的销售额
      • 8.搜索与聚合结合,查询某个品牌按颜色销量
      • 9.global bucket:单个品牌与所有品牌销量对比
      • 10.过滤+聚合:统计价格大于 1200 的电视平均价格
      • 11.bucket filter:统计品牌最近一个月的平均价格
      • 12.按每种颜色的平均销售额降序排序
      • 13.排序:按每种颜色的每种品牌平均销售额降序排序

创建索引及映射

PUT /tvs
PUT /tvs/_search
{"properties": {"price": {"type": "long"},"color": {"type": "keyword"},"brand": {"type": "keyword"},"sold_date": {"type": "date"}}
}

插入数据

POST /tvs/_bulk
{ "index": {}}
{ "price" : 1000, "color" : "红色", "brand" : "长虹", "sold_date" : "2019-10-28" }
{ "index": {}}
{ "price" : 2000, "color" : "红色", "brand" : "长虹", "sold_date" : "2019-11-05" }
{ "index": {}}
{ "price" : 3000, "color" : "绿色", "brand" : "小米", "sold_date" : "2019-05-18" }
{ "index": {}}
{ "price" : 1500, "color" : "蓝色", "brand" : "TCL", "sold_date" : "2019-07-02" }
{ "index": {}}
{ "price" : 1200, "color" : "绿色", "brand" : "TCL", "sold_date" : "2019-08-19" }
{ "index": {}}
{ "price" : 2000, "color" : "红色", "brand" : "长虹", "sold_date" : "2019-11-05" }
{ "index": {}}
{ "price" : 8000, "color" : "红色", "brand" : "三星", "sold_date" : "2020-01-01" }
{ "index": {}}
{ "price" : 2500, "color" : "蓝色", "brand" : "小米", "sold_date" : "2020-02-12" }

1.统计哪种颜色的电视销量最高

GET /tvs/_search
{"size" : 0,"aggs" : {"popular_colors" : {"terms" : {"field" : "color"}}}
}

查询条件解析

size:只获取聚合结果,而不要执行聚合的原始数据
aggs:固定语法,要对一份数据执行分组聚合操作
popular_colors:就是对每个 aggs,都要起一个名字,
terms:根据字段的值进行分组
field:根据指定的字段的值进行分组

返回

{"took" : 18,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 8,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"popular_colors" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "红色","doc_count" : 4},{"key" : "绿色","doc_count" : 2},{"key" : "蓝色","doc_count" : 2}]}}
}

返回结果解析

hits.hits:我们指定了 size 是 0,所以 hits.hits 就是空的
aggregations:聚合结果
popular_color:我们指定的某个聚合的名称
buckets:根据我们指定的 field 划分出的 buckets
key:每个 bucket 对应的那个值
doc_count:这个 bucket 分组内,有多少个数据
数量,其实就是这种颜色的销量

每种颜色对应的 bucket 中的数据的默认的排序规则:按照 doc_count 降序排序

2,统计每种颜色电视平均价格

GET /tvs/_search
{"size" : 0,"aggs": {"colors": {"terms": {"field": "color"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

在一个 aggs 执行的 bucket 操作(terms),平级的 json 结构下,再加一个 aggs,这个第二个 aggs 内部,同样取个名字,执行一个 metric 操作,avg,对之前的每个 bucket 中的数据的指定的 field,price field,求一个平均值

返回:

{"took": 4,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 8,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"colors": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "红色","doc_count": 4,"avg_price": {"value": 3250.0}},{"key": "绿色","doc_count": 2,"avg_price": {"value": 2100.0}},{"key": "蓝色","doc_count": 2,"avg_price": {"value": 2000.0}}]}}
}

buckets,除了 key 和 doc_count
avg_price:我们自己取的 metric aggs 的名字
value:我们的 metric 计算的结果,每个 bucket 中的数据的 price 字段求平均值后的结果

相当于 sql: select avg(price) from tvs group by color

3.继续下钻分析

每个颜色下,平均价格及每个颜色下,每个品牌的平均价格

GET /tvs/_search
{"size": 0,"aggs": {"group_by_color": {"terms": {"field": "color"},"aggs": {"color_avg_price": {"avg": {"field": "price"}},"group_by_brand": {"terms": {"field": "brand"},"aggs": {"brand_avg_price": {"avg": {"field": "price"}}}}}}}
}

4.更多的 metric

count:bucket,terms,自动就会有一个 doc_count,就相当于是 count
avg:avg aggs,求平均值
max:求一个 bucket 内,指定 field 值最大的那个数据
min:求一个 bucket 内,指定 field 值最小的那个数据
sum:求一个 bucket 内,指定 field 值的总和

GET /tvs/_search
{"size" : 0,"aggs": {"colors": {"terms": {"field": "color"},"aggs": {"avg_price": { "avg": { "field": "price" } },"min_price" : { "min": { "field": "price"} },"max_price" : { "max": { "field": "price"} },"sum_price" : { "sum": { "field": "price" } }}}}
}

5.划分范围 histogram

GET /tvs/_search
{"size" : 0,"aggs":{"price":{"histogram":{"field": "price","interval": 2000},"aggs":{"income": {"sum": {"field" : "price"}}}}}
}

histogram:类似于 terms,也是进行 bucket 分组操作,接收一个 field,按照这个 field 的值的各个范围区间,进行 bucket 分组操作

"histogram":{"field": "price","interval": 2000
}

interval:2000,划分范围,02000,20004000,40006000,60008000,8000~10000,buckets

bucket 有了之后,一样的,去对每个 bucket 执行 avg,count,sum,max,min,等各种 metric 操作,聚合分析

6.按照日期分组聚合

date_histogram,按照我们指定的某个 date 类型的日期 field,以及日期 interval,按照一定的日期间隔,去划分 bucket

min_doc_count:即使某个日期 interval,2017-01-01~2017-01-31 中,一条数据都没有,那么这个区间也是要返回的,不然默认是会过滤掉这个区间的
extended_bounds,min,max:划分 bucket 的时候,会限定在这个起始日期,和截止日期内

GET /tvs/_search
{"size" : 0,"aggs": {"sales": {"date_histogram": {"field": "sold_date","interval": "month","format": "yyyy-MM-dd","min_doc_count" : 0,"extended_bounds" : {"min" : "2019-01-01","max" : "2020-12-31"}}}}
}

7.统计每季度每个品牌的销售额

GET /tvs/_search
{"size": 0,"aggs": {"group_by_sold_date": {"date_histogram": {"field": "sold_date","interval": "quarter","format": "yyyy-MM-dd","min_doc_count": 0,"extended_bounds": {"min": "2019-01-01","max": "2020-12-31"}},"aggs": {"group_by_brand": {"terms": {"field": "brand"},"aggs": {"sum_price": {"sum": {"field": "price"}}}},"total_sum_price": {"sum": {"field": "price"}}}}}
}

8.搜索与聚合结合,查询某个品牌按颜色销量

搜索与聚合可以结合起来。

sql select count(*)

from tvs

where brand like “%小米%”

group by color

es aggregation,scope,任何的聚合,都必须在搜索出来的结果数据中之行,搜索结果,就是聚合分析操作的 scope

GET /tvs/_search
{"size": 0,"query": {"term": {"brand": {"value": "小米"}}},"aggs": {"group_by_color": {"terms": {"field": "color"}}}
}

9.global bucket:单个品牌与所有品牌销量对比

aggregation,scope,一个聚合操作,必须在 query 的搜索结果范围内执行

出来两个结果,一个结果,是基于 query 搜索结果来聚合的; 一个结果,是对所有数据执行聚合的

GET /tvs/_search
{"size": 0,"query": {"term": {"brand": {"value": "小米"}}},"aggs": {"single_brand_avg_price": {"avg": {"field": "price"}},"all": {"global": {},"aggs": {"all_brand_avg_price": {"avg": {"field": "price"}}}}}
}

10.过滤+聚合:统计价格大于 1200 的电视平均价格

搜索+聚合

过滤+聚合

GET /tvs/_search
{"size": 0,"query": {"constant_score": {"filter": {"range": {"price": {"gte": 1200}}}}},"aggs": {"avg_price": {"avg": {"field": "price"}}}
}

11.bucket filter:统计品牌最近一个月的平均价格

GET /tvs/_search
{"size": 0,"query": {"term": {"brand": {"value": "小米"}}},"aggs": {"recent_150d": {"filter": {"range": {"sold_date": {"gte": "now-150d"}}},"aggs": {"recent_150d_avg_price": {"avg": {"field": "price"}}}},"recent_140d": {"filter": {"range": {"sold_date": {"gte": "now-140d"}}},"aggs": {"recent_140d_avg_price": {"avg": {"field": "price"}}}},"recent_130d": {"filter": {"range": {"sold_date": {"gte": "now-130d"}}},"aggs": {"recent_130d_avg_price": {"avg": {"field": "price"}}}}}
}

aggs.filter,针对的是聚合去做的

如果放 query 里面的 filter,是全局的,会对所有的数据都有影响

但是,如果,比如说,你要统计,长虹电视,最近 1 个月的平均值; 最近 3 个月的平均值; 最近 6 个月的平均值

bucket filter:对不同的 bucket 下的 aggs,进行 filter

12.按每种颜色的平均销售额降序排序

GET /tvs/_search
{"size": 0,"aggs": {"group_by_color": {"terms": {"field": "color","order": {"avg_price": "asc"}},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

相当于 sql 子表数据字段可以立刻使用。

13.排序:按每种颜色的每种品牌平均销售额降序排序

GET /tvs/_search
{"size": 0,"aggs": {"group_by_color": {"terms": {"field": "color"},"aggs": {"group_by_brand": {"terms": {"field": "brand","order": {"avg_price": "desc"}},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}}}
}

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

Vue3 中 Aos 动画同时触发的解决办法

文章目录 问题现象解决之后的效果解决办法问题猜测 问题现象 我总共有四行数据,每一行都是一个动画,但是触发第一个之后其他三个也都触发了 我想要的效果是:动画从底部出现的时候触发一个动画,不要都触发掉 解决之后的效果 解决…

css边框修饰

一、设置线条样式 通过 border-style 属性设置,可选择的一些属性如下: dotted:点线 dashed:虚线 solid:实线 double:双实线 效果如下: 二、设置边框线宽度 ① 通过 border-width 整体设置…

uni-data-select 使用 localdata 传入数据出现 不回显 | 下拉显示错误的 解决方法

目录 1. 问题所示2. 正确Demo3. 下拉显示错误(Bug复现)4. 下拉不回显(Bug复现)1. 问题所示 uni-app的下拉框uni-data-select 使用 localdata 传入数据 主要总结正确的Demo以及复现一些Bug 数据不回显数据不显示下拉选项2. 正确Demo 详细的基本知识推荐阅读:uni-app中的…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程(使用模拟数据),我们将使用以下技术: Spring Boot:作为后端框架,用来提供数据接口。Thymeleaf:作为前端模板引擎,呈现网页。Leaflet…

图书馆座位预约系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,图书馆管理,座位信息管理,预约选座管理,签到信息管理,系统管理 微信端账号功能包括:系统首页,论坛&#xf…

力扣最热一百题——缺失的第一个正数

目录 题目链接:41. 缺失的第一个正数 - 力扣(LeetCode) 题目描述 示例 提示: 解法一:标记数组法 1. 将非正数和超出范围的数替换 2. 使用数组下标标记存在的数字 3. 找到第一个未标记的位置 4. 为什么时间复杂…

【Vue】- 路由及传参

文章目录 知识回顾前言源码分析1. 声明式导航2. 路由传参3. 可选符4. 重定向5. 4046. 跳转及传参7. 路由懒加载拓展知识总结router-link静态传参和动态路由的对比知识回顾 前言 什么是单页面应用程序? ● 所有功能在一个html页面上实现 单页面应用优缺点? ● 优点:按需更新…

Python | Leetcode Python题解之第415题字符串相加

题目: 题解: class Solution:def addStrings(self, num1: str, num2: str) -> str:res ""i, j, carry len(num1) - 1, len(num2) - 1, 0while i > 0 or j > 0:n1 int(num1[i]) if i > 0 else 0n2 int(num2[j]) if j > 0 e…

openssl 生成多域名 多IP 的数字证书

openssl.cnf 文件内容: [req] default_bits 2048 distinguished_name req_distinguished_name copy_extensions copy req_extensions req_ext x509_extensions v3_req prompt no [req_distinguished_name] countryName CN stateOrProvinceName GuangDong l…

[Linux]从零开始的泰山派系统安装与远程教程

一、前言 泰山派买回来也有一阵子了,最近慢慢开始研究。当然,学习这种Linux的开发板的第一步就是安装系统,对于RK系列的芯片系统安装有专门的软件,所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统,这一…

电脑端视频剪辑软件哪个好用,十多款剪辑软件分享

随着自媒体时代的蓬勃发展,视频创作已成为营销战略与社交媒体互动中不可或缺的一环,这极大地推动了视频编辑技术的普及与兴盛。今天,我将为大家精选并介绍15款当前市场上广受欢迎的视频剪辑工具及配套软件,旨在帮助大家更高效地进…

YOLO混凝土缺陷检测数据集

YOLO混凝土缺陷检测 数据集 模型 ui界面 ✓图片数量7353,模型已训练200轮; ✓类别:exposed reinforcement,rust stain,Crack,Spalling,Efflorescence,delamination(外露…

基于单片机的楼宇门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…

华为OD机试 - 报数问题 - 约瑟夫环(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

Apache ZooKeeper 及 Curator 使用总结

1. 下载 官网地址:Apache ZooKeeper 点击下载按钮 选择对应的版本进行下载 2. 使用 1、解压 tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件,有一个示例配置文件 conf/zoo_sample.cfg,此文件不能生效,需要名称为…

【非常实用—Navicat重置 MySQL 的密码】

Navicat重置 MySQL 的密码 连接本地数据库,忘记原始密码停止 MySQL 服务以安全模式启动 MySQL打开新的命令行窗口重置密码停止 MySQL 并重启 连接本地数据库,忘记原始密码 停止 MySQL 服务 在命令行中使用以下命令停止服务(Windows 下&#…

C语言6大常用标准库 -- 4.<math.h>

目录 引言 4. C标准库--math.h 4.1 简介 4.2 库变量 4.3 库宏 4.4 库函数 4.5 常用的数学常量 🌈你好呀!我是 程序猿 🌌 2024感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长&…

医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断

文章目录 项目六:分类分析实践目的实践平台实践内容(一)数据理解及准备(二)模型建立、预测及优化任务一:使用 KNN算法进行分类预测任务二:使用贝叶斯分类算法进行分类预测任务三:使用…

星云股份战略运营副总裁袁智勇︱如何培养“能打胜仗”的项目经理

全国项目经理专业人士年度盛会 福建星云电子股份有限公司总裁办战略运营副总裁袁智勇先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“如何培养“能打胜仗”的项目经理”。大会将于10月26-27日在北京举办&…

56.【C语言】字符函数和字符串函数(strtok函数)(未完)

目录 12.strtok函数(较复杂) *简单使用 总结: *优化 12.strtok函数(较复杂) *简单使用 strtok:string into tokens cplusplus的介绍 点我跳转 翻译: 函数 strtok char * strtok ( char * str, const char * delimiters ); 总结: delimiters参数指向一个字符串&#xff0…