ES系列14:你知道25种(桶聚合)Bucket Aggs 类型各自的使用场景么?【聚合分析】...

您所在的位置:网站首页 橡木桶有哪些种类型 ES系列14:你知道25种(桶聚合)Bucket Aggs 类型各自的使用场景么?【聚合分析】...

ES系列14:你知道25种(桶聚合)Bucket Aggs 类型各自的使用场景么?【聚合分析】...

2024-06-01 15:12| 来源: 网络整理| 查看: 265

看了本文,你将掌握

1、ES有哪些聚合类型?Bucket、Metric、Pipeline Aggregations 各自的特点是什么??

2、Bucket Aggs 有哪些种类?各自的使用场景是什么?

3、Bucket Aggs 各种类型的重要参数有哪些?注意事项是什么?

ps:本文基于ES 7.7.1【文末附《Bucket aggs 25种类型详解》xmind 获取方式】

 

01 ES聚合类型简介

                                                                                              一图胜千言

 

如上图,ES的聚合一共有4种类型,Bucket 、Metric、Pipeline 是经常使用的,掌握了这3种聚合,就已经可以满足日常大部分的聚合分析场景了。

在学习之前,先掌握aggregations的语法结构:【注意aggregations关键字可使用aggs代替】

简单示例,学会agg语法:

GET /cars/_search { "size": 0, "aggs": { "first_agg_name": { "terms": { "field": "color" }, "aggs": { "sub_agg_name1": { "avg": { "field": "price" } }, "sub_agg_name2": { "terms": { "field": "make" } } } } } } 02 Bucket Aggregations

Bucket 就是桶的意思,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。

ES从 2.x 到 7.x,聚合功能已经日渐强大,到 7.7 版本, Bucket 聚合已经有25种类型了,今天我们就一起系统学习 Bucket Aggregations,全面掌握 Bucket 聚合。

                                                                                          Bucket Aggs 概览

 

ps:因为篇幅问题,TeHero在文章中就只通过示例进行简单讲解,涉及其他的注意事项,重要参数等,见xmind截图,毕竟一图胜千言,哈哈,好吧,我承认,就是懒得写重复的内容【文末有xmind源文件获取方式】。

 

2.0 写在前面

通过上图《Bucket Aggs 概览》我们可以看到,一共有25种类型的 Bucket Aggs,对于每一种聚合类型,我们都去详细学习并掌握是比较费时间的,个人建议可以按如下方式学习:

1)了解每种聚合类型的使用场景,简单而言,就是知道每种聚合是干嘛的,能对数据做怎样的分析;

2)了解其注意事项和重要参数;

3)完成以上2点,我觉得就差不多了,在实际工作中,面对需求,我们知道可以用哪些聚合操作解决需求即可,需要用到的时候再去详细学习具体的语法。

2.1 Terms 术语聚合

场景示例:对于博客系统,按不同的作者分类聚合,得到每位作者的博文总数

GET /blogs_index/_search { "size": 0, "aggs": { "author": { "terms": { "field": "author" } } } }

结果:

"aggregations" : { "author" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "方才兄", "doc_count" : 3 }, { "key" : "方才", "doc_count" : 1 } ] } }  2.2 Rare Terms  稀有术语聚合

在 Terms Aggs 中,聚合结果的排序是默认根据 doc_count 的值降序排列,但在实际使用过程中,我们有时候希望根据 doc_count 的值升序排列,这个时候就应该使用  Rare Terms【之所以不使用 Terms aggs再去改变排序规则,是因为聚合精度问题,后续专门讨论】

场景示例:按不同的作者分类聚合,同时根据每位作者的文章总数进行升序排列

GET /blogs_index/_search { "size": 0, "aggs": { "author": { "rare_terms": { "field": "author", "max_doc_count": 10 } } } }

注意max_doc_count参数:术语出现的最大文档数【返回的bucket 的 doc_count = 现在减去10个月,向下舍入到月初。

结果:现在是 2020-07

"aggregations": { "range": { "buckets": [ { "key": "*-2019-09", "to": 1567296000000, "to_as_string": "2019-09", "doc_count": 20 }, { "key": "2019-09-*", "from": 1567296000000, "from_as_string": "2019-09", "doc_count": 50 } ] } } 2.8 IP Range IP范围聚合

看个示例即可:

GET /ip_addresses/_search { "size": 10, "aggs": { "ip_ranges": { "ip_range": { "field": "ip", "ranges": [ { "to": "10.0.0.5" }, { "from": "10.0.0.5" } ] } } } }

结果:

GET /product/_search { "aggregations": { "ip_ranges": { "buckets": [ { "key": "*-10.0.0.5", "to": "10.0.0.5", "doc_count": 10 }, { "key": "10.0.0.5-*", "from": "10.0.0.5", "doc_count": 0 } ] } } } 2.9 Composite 复合聚合

1)对于Composite Agg 需要看两个示例,一个是翻页的示例:

GET /teamwork_task/_search { "size": 0, "aggs": { "my_buckets": { "composite": { "size": 2, "sources": [ { "customName": { "terms": { "field": "team_id" } } } ] } } } }

结果:

"aggregations": { "my_buckets": { "after_key": { "customName": 135 }, "buckets": [ { "key": { "customName": 128 }, "doc_count": 2 }, { "key": { "customName": 135 }, "doc_count": 3 } ] } } }

翻页查询:查询 body不变,添加上次返回的 after即可

GET /teamwork_task/_search { "size": 0, "aggs": { "my_buckets": { "composite": { "size": 2, "sources": [ { "customName": { "terms": { "field": "team_id" } } } ], "after": { "customName": 135 } } } } }

2)问卷结果统计示例:假设有A、B两道题,每题都有2个答案,那么 Composite聚合就可以得到所有可能组合的答案的问卷数

GET /question_index/_search { "size": 0, "aggs": { "my_buckets": { "composite": { "sources": [ { "question_A": { "terms": { "field": "question_A" } } }, { "question_B": { "terms": { "field": "question_B" } } } ] } } } }

结果:

"aggregations": { "my_buckets": { "after_key": { "question_A": "B", "question_B": 1 }, "buckets": [ { "key": { "question_A": "A", "question_B": 1 }, "doc_count": 1 }, { "key": { "question_A": "B", "question_B": 1 }, "doc_count": 1 } ] } } 2.10 Filter 过滤器聚合

场景示例:只想查看商品类型是 t-shirt 的平均价格

POST /sales/_search?size=0 { "aggs" : { "t_shirts" : { "filter" : { "term": { "type": "t-shirt" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } }

ps:考虑篇幅问题,后面的例子仅写DSL,省略结果。

2.11 Filters 过滤器集合聚合

场景示例:日志统计,统计 error 和 warning 各有多少条记录

GET logs/_search { "size": 0, "aggs": { "messages": { "filters": { "filters": { "errors": { "match": { "body": "error" } }, "warnings": { "match": { "body": "warning" } } } } } } } 2.12 Global 全局聚合

场景示例:查询商品类型为 t-shirt 的商品集合及其平均价格,同时得到所有商品的平均价格

POST /sales/_search?size=0 { "query": { "match": { "type": "t-shirt" } }, "aggs": { "all_products": { "global": {}, "aggs": { "avg_price": { "avg": { "field": "price" } } } }, "t_shirts": { "avg": { "field": "price" } } } } 2.13 Missing 缺少聚合

场景示例:获取没有标价的商品的总数

POST /sales/_search?size=0 { "aggs": { "products_without_a_price": { "missing": { "field": "price" } } } } 2.14 Adjacency Matrix 邻接矩阵聚合

概念理解图示:

2.15 3种地理位置的bucket聚合

 2.16 后续8种bucket聚合待深入学习

下期预告:ES的聚合分析02:Metric aggs 【关注公众号:方才编程,系统学习ES】

【点击加入 ES学习社群,即可免费领取《Bucket aggs 25种类型详解》xmind,原创不易,你的在看就是最大的鼓励】



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3