Elasticsearch 之聚合分析入门

本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合。

首先来看下聚合(Aggregation):

什么是 Aggregation?

首先举一个生活中的例子,这个是京东的搜索界面,在搜索框中输入“华为”进行搜索,就会得到如上界面,搜索框就是我们常用的搜索功能,而下面这些,比如分类、热点、操作系统、CPU 类型等是根据 ES 的聚合分析获得的相关结果。

看完上面这个例子,下面来看下聚合的定义:

ES 除了搜索以外,还提供针对 ES 数据进行统计分析的功能,也就是聚合,它的特点是实时性非常高,所有的计算结果都是即时返回的,而 Hadoop 等大数据系统得到一个统计结果需要一天的时间,一般都是 T + 1 级别的。

通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档,比如海淀区和东城区的客房数量,不同价格区间,可预订的经济型酒店和商务型酒店的数量,这样可以帮助我们过滤搜索的结果,这样的优点是性能高,只需要一条语句,就可以从 ES 得到分析结果,无需再客户端自己去实现分析逻辑。

在 ES 的聚合中主要一共分为四大类:

  • Bucket Aggregation:分桶类型,一些列满足特定条件的文档的集合
  • Metric Aggregation:指标分析类型,一些数学运算,可以对文档字段进行统计分析,比如计算最大值、最小值、平均值等
  • Pipeline Aggregation:管道分析类型,对其他聚合结果进行二次聚合
  • Matrix Aggregation:矩阵分析类型,支持对多个字段的操作并提供一个结果矩阵

在以后的文章会对这些做详细的讲解,本文先来了解下什么是 Bucket 和 Metric:

Bucket 简单来说相当于 SQL 中的 GROUP,可以根据条件,把结果分成一个一个的组,那 Metric 相当于 SQL 中的 COUNT,可以去执行一系列的统计方法。

接下来看什么是 Bucket Aggregation:

Bucket Aggregation

Bucket 就是桶的意思,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。如上图所示,左边有一堆文档,右边有三个桶,每个桶有不同的规则,比如第一个桶的规则为价格小于 3000 的,第二个桶为价格大于等于 3000 小于 6000 的,最后一个桶的规则为价格大于 6000 的,然后不同的文档根据不同的价格分到不同的桶中,那么我们就实现了分类。

有了 Bucket 聚合分析机制,我们就可以把公司员工以年龄方式进行区分,以地理位置的方式来区分客户,以男性女性来区分演员等。

根据 Bucket 的分桶策略,常见的 Bucket 聚合分析如下:

  • Terms:直接按照 term 来分桶,如果是 text 类型,则按照分词后的结果分桶
  • Range:指定数值的范围来设定分桶规则
  • Date Range:指定日期的范围来设定分桶规则
  • Histogram:直方图,以固定间隔的策略来分割数据
  • Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型

下面以 Terms 为例,让我们动手实践下:

这是一个查看航班目的地的统计信息的例子,通过指定关键词为 terms,然后指明 term 字段 fieldDestCountry,下面我们请求下,查看下请求结果:

从结果中可以看到文档根据目的地分成了不同的桶,每个桶还包括 doc_count,这样就可以很轻松知道 ES 存储的航班信息中,去往意大利、美国、中国等国家分别有多少架航班。

在简单了解了 Bucket 聚合分析后,让我们来看下 Metric 聚合分析:

Metric Aggregation

Metric 是基于数据集计算的结果,除了支持在字段上进行计算,同样也支持在脚本产生的结果之上进行计算。Metric 主要分为单值分析和多值分析,具体内容如下:

单值分析,只输出一个分析结果:

  • Min、Max、Avg、Sum
  • Cardinality

其中,Min、Max、Avg、Sum 这些很容易理解,在这里说一下 Cardinality,它是指不同数值的个数,相当于 SQL 中的 distinct。

多值分析,输出多个分析结果:

  • Stats、Extended Stats
  • Percentiles、Percentile Ranks
  • Top Hits

其中,Stats 是做多样的数据分析,可以一次性得到最大值、最小值、平均值、中值等数据;Extended Stats 是对 Stats 的扩展,包含了更多的统计数据,比如方差、标准差等;PercentilesPercentile Ranks 是百分位数的一个统计;Top Hits 一般用于分桶后获取桶内最匹配的顶部文档列表,即详情数据。

了解之后,让我们实操起来,紧接着刚才查看航班目的地的统计信息的例子,如果还想知道机票的均价,最高最低价格,该怎么做呢?这就需要用到 Metric 了:

我们在请求中加入 aggs,其中 avg_price 为自己定义的名字,这个是为了方便在以后理解这个字段返回值的含义,然后分别关键词分别选择 avg、max、min 来完成计算目的地不同的航班的机票均价、最高最低价格,这个请求的执行结果如下所示:

从结果中可以看出,飞往意大利的航班一共有 2371 架,其中机票最高价格为 1195 元,最低价格为 100 元,平均价格为 586 元,很快就可以得到统计的一些结果。

另外,聚合分析还支持嵌套,那么让我们看下如果实现一个嵌套聚合分析:

通过这个请求不但可以获取到航班目的地的统计信息,还可以得到航班抵达时的天气状况,运行结果如下所示:

可以看出,在抵达意大利的航班中,抵达时的天气有 424 次为晴天,417 次为下雨天等,所以通过嵌套的方式就可以很快得到更深层次的数据统计值。

总结

本文对 Elasticsearch 的聚合功能做了初步介绍,也学习 Bucket 和 Metric 聚合分析,在后续文章会对聚合功能做一个更加深入的讲解。

下面是我总结的 Elasticsearch 聚合分析的思维导图,在公众号【武培轩】回复【es】获取思维导图以及源代码。

参考文献

Elastic Stack从入门到实践

Elasticsearch核心技术与实战

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-aggregations.html

原文地址:https://www.cnblogs.com/wupeixuan/p/12549336.html

时间: 2024-08-08 09:36:55

Elasticsearch 之聚合分析入门的相关文章

Elasticsearch 顶尖高手(6)--快速入门案例实战:group by + avg + sort等聚合分析(三)

1.计算每个tag下的商品数量 GET /ecommerce/product/_search { "aggs":{ "group_by_tags":{ "terms":{"field":"tags"} } } } 将文本field的fielddate属性设置为true PUT /ecommerce/_mapping/product { "properties":{ "tags&

elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)

一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力. 对一个数据集求最大.最小.和.平均值等指标的聚合,在ES中称为指标聚合   metric 而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合.在 ES 中group by 称为分桶,桶聚合 bucke

ElasticSearch聚合分析

聚合用于分析查询结果集的统计指标,我们以观看日志分析为例,介绍各种常用的ElasticSearch聚合操作. 目录: 查询用户观看视频数和观看时长 聚合分页器 查询视频uv 单个视频uv 批量查询视频uv Having查询 根据 count 进行过滤 根据其它指标进行过滤 首先展示一下我们要分析的文档结构: { "video_id": 1289643545120062253, // 视频id "video_uid": 3931482202390368051, //

ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探

一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建的索引上. 1)模板仅是一个索引被创建时才会起作用,修改模板并不会影响已创建的索引: 2)可以设定多个索引模板,这些设置会被merge在一起: 3)通过指定order的数值,控制merge的过程: 2.Index Template的工作方式如下: 当一个索引被创建时,会执行如下操作: 1)应用Ela

Elasticsearch系列---常见搜索方式与聚合分析

概要 本篇主要介绍常见的6种搜索方式.聚合分析语法,基本是上机实战,可以和关系型数据库作对比,如果之前了解关系型数据库,那本篇只需要了解搜索和聚合的语法规则就可以了. 搜索响应报文 以上篇建立的music索引为例,我们先看看搜索结果的属性都有哪些 { "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "

Elasticsearch学习之深入聚合分析1--基本概念

首先明白两个核心概念:bucket和metric 1. bucket:一个数据分组 1 city name 2 3 北京 小李 4 北京 小王 5 上海 小张 6 上海 小丽 7 上海 小陈 基于city划分buckets,划分出来两个bucket,一个是北京bucket,一个是上海bucket 北京bucket:包含了2个人,小李,小王上海bucket:包含了3个人,小张,小丽,小陈 按照某个字段进行bucket划分,那个字段的值相同的那些数据,就会被划分到一个bucket中,有一些mysql

Elasticsearch学习之深入聚合分析二---案例实战

以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析,首先建立电视销售的索引,然后 添加几条销售记录 PUT /tvs { "mappings": { "sales": { "properties": { "price": { "type": "long" }, "color": { "type"

Elasticsearch学习之深入聚合分析三---案例实战

1. 统计指定品牌下每个颜色的销量 任何的聚合,都必须在搜索出来的结果数据中进行,搜索结果,就是聚合分析操作的scope GET /tvs/sales/_search { "size": 0, "query": { "term": { "brand": { "value": "小米" } } }, "aggs": { "group_by_color"

Elasticsearch学习之深入聚合分析四---案例实战

1. 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99 tp50:50%的请求的耗时最长在多长时间tp90:90%的请求的耗时最长在多长时间tp99:99%的请求的耗时最长在多长时间 PUT /website { "mappings": { "logs": { "properties": { "latency": { "type": "long"