ES聚合之Bucket聚合语法讲解
目录
目标
ES版本信息
官方文档
实战
新增测试数据
基本语法
先过滤再分桶聚合
按照范围聚合
Histogram(直方图/柱状图)
嵌套分桶聚合
Date range aggregation(日期范围聚合)
Filter aggregation
Filters aggregation
Missing aggregation
Multi Terms aggregation(多字段聚合)
目标
掌握Bucket aggregations(分桶聚合,相当于MySQL中的分组聚合 )语法,通过本文列举的各种案例举一反三。具体会涉及以下内容:
- Multi Terms aggregation(多字段聚合);
- 分桶聚合排序;
- 分桶聚合前先过滤数据;
- 根据范围分桶聚合;
- Histogram(直方图/柱状图);
- 嵌套分桶聚合;
- 对日期分桶聚合;
- 单过滤器和多过滤器;
- missing聚合。
ES版本信息
7.17.5
官方文档
Bucket aggregationshttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-bucket.html
实战
新增测试数据
PUT /library_db
{"settings": {"index": {"analysis.analyzer.default.type": "ik_max_word"}}
}PUT /library_db/_bulk
{"index":{"_id":"1"}}
{"id":1,"type":"玄幻","name":"诛仙","words_num":120,"chapter_num":600,"completion_time":"2000-09-01","author":"萧鼎","prices":32.12}
{"index":{"_id":"2"}}
{"id":2,"type":"玄幻","name":"诛仙前传:蛮荒行","words_num":30,"chapter_num":67,"completion_time":"2020-09-01","author":"萧鼎","prices":23.12}
{"index":{"_id":"3"}}
{"id":3,"type":"武侠","name":"天龙八部","words_num":80,"chapter_num":120,"completion_time":"1995-09-01","author":"金庸","prices":52.1}
{"index":{"_id":"4"}}
{"id":4,"type":"武侠","name":"射雕英雄传","words_num":67,"chapter_num":95,"completion_time":"1998-01-01","author":"金庸","prices":4.12}
{"index":{"_id":"5"}}
{"id":5,"type":"武侠","name":"神雕侠侣","words_num":75,"chapter_num":76,"completion_time":"2000-01-01","author":"金庸","prices":32.8}
{"index":{"_id":"6"}}
{"id":5,"type":"武侠","name":"倚天屠龙记","words_num":83,"chapter_num":130,"completion_time":"2003-01-01","author":"金庸","prices":100.12}
{"index":{"_id":"7"}}
{"id":7,"type":"玄幻","name":"凡人修仙传","words_num":600,"chapter_num":3000,"completion_time":"2018-01-01","author":"忘语","prices":120.12}
{"index":{"_id":"8"}}
{"id":8,"type":"玄幻","name":"魔天记","words_num":159,"chapter_num":400,"completion_time":"2019-01-01","author":"忘语","prices":11.12}
{"index":{"_id":"9"}}
{"id":9,"type":"都市异能","name":"黄金瞳","words_num":220,"chapter_num":400,"completion_time":"2019-01-01","author":"打眼","prices":74.5}
{"index":{"_id":"10"}}
{"id":10,"type":"玄幻","name":"将夜","words_num":210,"chapter_num":600,"completion_time":"2014-01-01","author":"血红","prices":32.0}
{"index":{"_id":"11"}}
{"id":11,"type":"军事","name":"亮剑","words_num":120,"chapter_num":100,"completion_time":"2012-01-01","author":"都梁","prices":15.0}
基本语法
需求一:求图书馆中每个小说类型的小说数量。
#size=10,表示聚合后展示10条数据。
GET /library_db/_search
{"size": 0,"aggs": {"type_count": {"terms": {"field": "type.keyword","size": 10}}}
}
需求二:求图书馆中每个小说类型的小说数量。按照升序排序。
#同理,降序排序就用desc,这和MySQL是一样的语法。
GET /library_db/_search
{"size": 0,"aggs": {"type_count": {"terms": {"field": "type.keyword","size": 10,"order": {"_count": "asc"}}}}
}
先过滤再分桶聚合
需求:求图书馆中每个小说类型的小说数量,要求小说字数大于等于100万。
GET /library_db/_search
{"size": 0,"query": {"range": {"words_num": {"gte": 100}}}, "aggs": {"type_count": {"terms": {"field": "type.keyword","size": 10}}}
}
按照范围聚合
需求:求小说字数在0-30万、30万-50万、50万-100万、100万-200万、大于等于200万区间的数量。
GET /library_db/_search
{"size": 0,"aggs": {"words_num_count": {"range": {"field": "words_num","ranges": [{"from": 0, "to": 30},{"to": 50,"from": 30},{"to": 100,"from": 50},{"to": 200,"from": 100},{"key": ">200","from": 200}]}}}
}
Histogram(直方图/柱状图)
需求:求图书馆中,各个字数区间的小说数量,每个区间50万字。
#这里会查出来很多空区间。设置min_doc_count=1表示为空区间的数据不返回。
GET /library_db/_search
{"size": 0,"aggs": {"type_count": {"histogram": {"field": "words_num","interval": 50,"min_doc_count": 1}}}
}
嵌套分桶聚合
需求:求图书馆中,每种类型的小说的平均价格。
GET /library_db/_search
{"size": 0,"aggs": {"type_group": {"terms": {"field": "type.keyword"},"aggs": {"prices_avg": {"avg": {"field": "prices"}}}}}
}
Date range aggregation(日期范围聚合)
分析
- from和to分别表示开始时间和结束时间;
- from相当于>=;
- to相当于<;
- missing:为缺少的字段设置代替值的作用。
需求一:求图书馆中,以当前时间后推一年的时间间隔,完本的小说数量。注意:这里按照东八区(北京时间)来计算,所以+8h。
GET /library_db/_search
{"size": 0,"aggs": {"range": {"date_range": {"field": "completion_time","ranges": [{"from": "now+8h-2y/d","to": "now+8h-1y/d"}]}}}
}
需求二:求图书馆中,以2019年为分界线,完本的小说的数据量。没有时间字段,则默认时间字段值为1976-11-30,它们会被划分到Older中。
GET /library_db/_search
{"size": 0,"aggs": {"range": {"date_range": {"field": "completion_time","missing": "1976-11-30","ranges": [{"key": "Older","to": "2019-01-01"},{"key": "Newer","from": "2019-01-01","to": "now+8h/d"}]}}}
}
Filter aggregation
需求:查询所有小说的平均价格和武侠小说的平均价格。
POST /library_db/_search?size=0&filter_path=aggregations
{"aggs": {"avg_price": {"avg": {"field": "prices"}},"wx": {"filter": {"term": {"type": "武侠"}},"aggs": {"wx_avg_prices": {"avg": {"field": "prices"}}}}}
}#如果单纯地查询武侠小说的平均价格,query比filter效率更高。
POST /library_db/_search?size=0&filter_path=aggregations
{"query": { "term": { "type": "武侠" } },"aggs": {"wx": { "avg": { "field": "prices" } }}
}#不推荐
POST /library_db/_search?size=0&filter_path=aggregations
{"aggs": {"wx": {"filter": { "term": { "type": "武侠" } },"aggs": {"wx_avg_prices": { "avg": { "field": "prices" } }}}}
}
Filters aggregation
分析
- 多个过滤条件时,考虑到效率问题,推荐用多过滤器而不是单过滤器。
- other_bucket_key表示其他,相当于java中的else。
需求一:查询武侠、玄幻、军事、都市类小说的数量。
GET library_db/_search
{"size": 0,"aggs": {"type_avg": {"filters": {"filters": {"wx": {"term": {"type.keyword": "武侠"}},"xh": {"term": {"type.keyword": "玄幻"}},"js": {"term": {"type.keyword": "军事"}},"ds": {"term": {"type.keyword": "都市"}}}}}}
}
需求二:查询武侠、玄幻、其他类小说的数量。这里的其他类是只除了玄幻和武侠小说的类别。
GET library_db/_search
{"size": 0,"aggs": {"type_avg": {"filters": {"filters": {"wx": {"term": {"type.keyword": "武侠"}},"xh": {"term": {"type.keyword": "玄幻"}}},"other_bucket_key": "other_type"}}}
}
Missing aggregation
需求:搜索没有价格字段的小说数量。
POST /library_db/_search?size=0
{"aggs": {"without_prices": {"missing": { "field": "prices" }}}
}
Multi Terms aggregation(多字段聚合)
需求:根据作者和小说类型字段分组,统计小说数量。
分析:相当于MySQL中对多个字段进行分组。Multi Terms aggregation与terms aggregation相似,但是前者效率低于后者,所以官方文档中建议:如果经常使用的同一组字段,则将这些字段的组合键索引设置为单独的字段并在此字段上使用terms aggregation。
GET /library_db/_search
{"size": 0, "aggs": {"genres_and_products": {"multi_terms": {"terms": [{"field": "type.keyword" }, {"field": "author.keyword"}]}}}
}
ES聚合之Bucket聚合语法讲解相关推荐
- Elasticsearch(9) --- 聚合查询(Bucket聚合)
Elasticsearch(9) --- 聚合查询(Bucket聚合) 系统小说 www.kuwx.net 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch ...
- Es Bucket聚合(桶聚合) Terms Aggregation与Significant Terms Aggregation
本章将介绍elasticsearch最重要的桶聚合terms aggregation. Terms Aggregation 多值聚合,根据库中的文档动态构建桶.基于词根的聚合,如果聚合字段是text的 ...
- Es Bucket聚合(桶聚合) 第二篇-Terms Aggregation与Significant Terms Aggregation
作者介绍:<RocketMQ技术内幕>作者,中间件兴趣圈微信公众号维护者,文末有对应的二维码,关注后可以与作者更好的互动. 本章将介绍elasticsearch最重要的桶聚合terms a ...
- ES的Query的DSL语法Filter DSL聚合分析
1 查询所有(match_all query) GET /lagou-company-index/_search { "query":{ "match_all" ...
- Es Bucket聚合(桶聚合) 第一篇(常用桶聚合一览)
本篇将开始介绍Elasticsearch Bucket聚合(桶聚合). Buket Aggregations(桶聚合)不像metrics Aggregations(度量聚合)那样计算字段上的度量,而是 ...
- Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合
Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...
- es的聚合mysql聚合速度_Elasticsearch(8) --- 聚合查询(Metric聚合)
摘要: quot;:0,"aggs":{"stats_salary":{"stats":{"field":"s ...
- estemplate 导入MySQL_[数据库]es~通过ElasticsearchTemplate进行聚合操作
[数据库]es~通过ElasticsearchTemplate进行聚合操作 0 2020-08-24 17:00:38 聚合操作,我们可以对数据进行分组的求和,求数,最大值,最小值,或者其它的自定义的 ...
- Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能
目录 Java api 实现聚合 依赖 简单聚合按照颜色分组获取每个卖出数量 聚合每个颜色卖出数量,及平均价格(每个分桶子聚合) 按照颜色分组 ,获取销售数量,avg min max sum 按照60 ...
最新文章
- 你以为在做的是微服务?不!你只是做了个比单体还糟糕的分布式单体!
- 《Unreal Engine 4蓝图可视化编程》一1.6 改变目标方向
- 人工智能-基于U^2-Net的肖像画生成算法
- 熟读《阿里巴巴java开发手册》(二、异常日志)
- OpenGL Single Point单点移动三角形的实例
- 深解微服务架构:从过去,到未来
- Linux : shell基础(慕课网Linux达人养成计划课程笔记)
- php映射,PHP实现路由映射到指定控制器
- 如何在Python中安全地创建嵌套目录
- Sublime Text 3 如何配置Python环境及安装插件?
- [c#] HttpContext.Cache和AppFabric的性能对比
- 离散数学期末复习概念_复习第1部分中的基本概念
- Java——抽象类和接口
- 分享 5 个实用的 Java 开源论坛系统!
- pytorch与torch的关系
- Android实现网页动态背景“五彩蛛网”
- Eclipse JavaEE版下载地址(含全球多个镜像地址)
- R语言修改下载安装包install.package的默认存储位置
- MATLAB信号处理——分解信号,双谱重构
- 计算机网络原理【八】之 网络安全基础
热门文章
- vue2.x版本+element-ui2.15+版本实现只能输入数字的ip输入框,功能样式借鉴windows,与父组件双向绑定
- 微信小程序仿手机淘宝新增地址自动识别地址,姓名,手机号
- 中国大陆5所院校入选2022 QS亚洲地区大学前10名;中国内地被评为全球进步最快的养老金体系 | 美通社头条...
- 电脑启动出现0x0000007B的解决方案
- 虚拟光驱Daemon Tools安装游戏或其他.iso文件
- 视频播放器的html代码(一)
- [转帖]江湖经验:喝酒的学问技巧,社会新人一定要看~!
- 三种批量删除PLSQL写法效率的比对
- Java中级面试题及答案解析(4)
- Android Paint的使用详解