目录

目标

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聚合语法讲解相关推荐

  1. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 系统小说 www.kuwx.net 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch ...

  2. Es Bucket聚合(桶聚合) Terms Aggregation与Significant Terms Aggregation

    本章将介绍elasticsearch最重要的桶聚合terms aggregation. Terms Aggregation 多值聚合,根据库中的文档动态构建桶.基于词根的聚合,如果聚合字段是text的 ...

  3. Es Bucket聚合(桶聚合) 第二篇-Terms Aggregation与Significant Terms Aggregation

    作者介绍:<RocketMQ技术内幕>作者,中间件兴趣圈微信公众号维护者,文末有对应的二维码,关注后可以与作者更好的互动. 本章将介绍elasticsearch最重要的桶聚合terms a ...

  4. ES的Query的DSL语法Filter DSL聚合分析

    1 查询所有(match_all query) GET /lagou-company-index/_search { "query":{ "match_all" ...

  5. Es Bucket聚合(桶聚合) 第一篇(常用桶聚合一览)

    本篇将开始介绍Elasticsearch Bucket聚合(桶聚合). Buket Aggregations(桶聚合)不像metrics Aggregations(度量聚合)那样计算字段上的度量,而是 ...

  6. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  7. es的聚合mysql聚合速度_Elasticsearch(8) --- 聚合查询(Metric聚合)

    摘要: quot;:0,"aggs":{"stats_salary":{"stats":{"field":"s ...

  8. estemplate 导入MySQL_[数据库]es~通过ElasticsearchTemplate进行聚合操作

    [数据库]es~通过ElasticsearchTemplate进行聚合操作 0 2020-08-24 17:00:38 聚合操作,我们可以对数据进行分组的求和,求数,最大值,最小值,或者其它的自定义的 ...

  9. Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能

    目录 Java api 实现聚合 依赖 简单聚合按照颜色分组获取每个卖出数量 聚合每个颜色卖出数量,及平均价格(每个分桶子聚合) 按照颜色分组 ,获取销售数量,avg min max sum 按照60 ...

最新文章

  1. 你以为在做的是微服务?不!你只是做了个比单体还糟糕的分布式单体!
  2. 《Unreal Engine 4蓝图可视化编程》一1.6 改变目标方向
  3. 人工智能-基于U^2-Net的肖像画生成算法
  4. 熟读《阿里巴巴java开发手册》(二、异常日志)
  5. OpenGL Single Point单点移动三角形的实例
  6. 深解微服务架构:从过去,到未来
  7. Linux : shell基础(慕课网Linux达人养成计划课程笔记)
  8. php映射,PHP实现路由映射到指定控制器
  9. 如何在Python中安全地创建嵌套目录
  10. Sublime Text 3 如何配置Python环境及安装插件?
  11. [c#] HttpContext.Cache和AppFabric的性能对比
  12. 离散数学期末复习概念_复习第1部分中的基本概念
  13. Java——抽象类和接口
  14. 分享 5 个实用的 Java 开源论坛系统!
  15. pytorch与torch的关系
  16. Android实现网页动态背景“五彩蛛网”
  17. Eclipse JavaEE版下载地址(含全球多个镜像地址)
  18. R语言修改下载安装包install.package的默认存储位置
  19. MATLAB信号处理——分解信号,双谱重构
  20. 计算机网络原理【八】之 网络安全基础

热门文章

  1. vue2.x版本+element-ui2.15+版本实现只能输入数字的ip输入框,功能样式借鉴windows,与父组件双向绑定
  2. 微信小程序仿手机淘宝新增地址自动识别地址,姓名,手机号
  3. 中国大陆5所院校入选2022 QS亚洲地区大学前10名;中国内地被评为全球进步最快的养老金体系 | 美通社头条...
  4. 电脑启动出现0x0000007B的解决方案
  5. 虚拟光驱Daemon Tools安装游戏或其他.iso文件
  6. 视频播放器的html代码(一)
  7. [转帖]江湖经验:喝酒的学问技巧,社会新人一定要看~!
  8. 三种批量删除PLSQL写法效率的比对
  9. Java中级面试题及答案解析(4)
  10. Android Paint的使用详解