当前位置: 首页 > news >正文

【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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略
  • 【计算机网络】UDP 协议详解及其网络编程应用
  • Sqlmap中文使用手册 - File system access模块参数使用
  • 比特币10年价格数据(2014-2024)分析(进阶2_时间序列分析)
  • Docker 镜像制作(Dockerfile)
  • C++之第十二课
  • 华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)
  • 【新手上路】衡石分析平台使用手册-租户管理
  • 硬件看门狗导致MCU启动时间慢
  • Flask-JWT-Extended登录验证
  • python基础(1)pyenv安装和对Django使用
  • Python 入门教程(4)数据类型 | 4.5、字符串类型
  • Scala尾递归解决爆栈问题
  • Python VS Golng 谁更胜一筹?
  • 智能化技术在灌区管理中的应用前景
  • css选择器
  • docker python 配置
  • Flex布局到底解决了什么问题
  • input的行数自动增减
  • JavaScript的使用你知道几种?(上)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java小心机(3)| 浅析finalize()
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • python 装饰器(一)
  • Python实现BT种子转化为磁力链接【实战】
  • React的组件模式
  • Spring框架之我见(三)——IOC、AOP
  • Spring声明式事务管理之一:五大属性分析
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 蓝海存储开关机注意事项总结
  • 聊聊flink的TableFactory
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端性能优化——回流与重绘
  • 如何设计一个比特币钱包服务
  • 我的zsh配置, 2019最新方案
  • ​io --- 处理流的核心工具​
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ‌移动管家手机智能控制汽车系统
  • ###STL(标准模板库)
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #define
  • (1)STL算法之遍历容器
  • (C++17) optional的使用
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET C# 操作Neo4j图数据库
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • ??在JSP中,java和JavaScript如何交互?
  • @WebServiceClient注解,wsdlLocation 可配置
  • []使用 Tortoise SVN 创建 Externals 外部引用目录