亲宝软件园·资讯

展开

Elasticsearch 之聚合分析入门

武培轩 人气:1
本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合。 首先来看下聚合(Aggregation): ## 什么是 Aggregation? ![](https://img-blog.csdnimg.cn/20200321230507375.png) 首先举一个生活中的例子,这个是京东的搜索界面,在搜索框中输入“华为”进行搜索,就会得到如上界面,搜索框就是我们常用的**搜索**功能,而下面这些,比如分类、热点、操作系统、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 ![](https://img-blog.csdnimg.cn/20200322165432646.png) Bucket 就是桶的意思,即**按照一定的规则将文档分配到不同的桶中,达到分类分析的目的**。如上图所示,左边有一堆文档,右边有三个桶,每个桶有不同的规则,比如第一个桶的规则为价格小于 3000 的,第二个桶为价格大于等于 3000 小于 6000 的,最后一个桶的规则为价格大于 6000 的,然后不同的文档根据不同的价格分到不同的桶中,那么我们就实现了分类。 有了 Bucket 聚合分析机制,我们就可以把公司员工以年龄方式进行区分,以地理位置的方式来区分客户,以男性女性来区分演员等。 根据 Bucket 的分桶策略,常见的 Bucket 聚合分析如下: - Terms:直接按照 `term` 来分桶,如果是 `text` 类型,则按照分词后的结果分桶 - Range:指定数值的范围来设定分桶规则 - Date Range:指定日期的范围来设定分桶规则 - Histogram:直方图,以固定间隔的策略来分割数据 - Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型 下面以 Terms 为例,让我们动手实践下: ![Bucket 聚合分析-Terms](https://img-blog.csdnimg.cn/20200322211248236.png) 这是一个查看航班目的地的统计信息的例子,通过指定关键词为 `terms`,然后指明 term 字段 `field` 为 `DestCountry`,下面我们请求下,查看下请求结果: ![response](https://img-blog.csdnimg.cn/20200322214138671.png) 从结果中可以看到文档根据目的地分成了不同的桶,每个桶还包括 `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` 的扩展,包含了更多的统计数据,比如方差、标准差等;`Percentiles` 和 `Percentile Ranks` 是百分位数的一个统计;`Top Hits` 一般用于分桶后获取桶内最匹配的顶部文档列表,即详情数据。 了解之后,让我们实操起来,紧接着刚才查看航班目的地的统计信息的例子,如果还想知道机票的均价,最高最低价格,该怎么做呢?这就需要用到 Metric 了: ![Metric 聚合分析](https://img-blog.csdnimg.cn/20200322213420421.png) 我们在请求中加入 `aggs`,其中 `avg_price` 为自己定义的名字,这个是为了方便在以后理解这个字段返回值的含义,然后分别关键词分别选择 `avg、max、min` 来完成计算目的地不同的航班的机票均价、最高最低价格,这个请求的执行结果如下所示: ![response](https://img-blog.csdnimg.cn/20200322214000914.png) 从结果中可以看出,飞往意大利的航班一共有 2371 架,其中机票最高价格为 1195 元,最低价格为 100 元,平均价格为 586 元,很快就可以得到统计的一些结果。 另外,聚合分析还支持嵌套,那么让我们看下如果实现一个嵌套聚合分析: ![嵌套聚合分析](https://img-blog.csdnimg.cn/20200322215152267.png) 通过这个请求不但可以获取到航班目的地的统计信息,还可以得到航班抵达时的天气状况,运行结果如下所示: ![response](https://img-blog.csdnimg.cn/2020032222020386.png) 可以看出,在抵达意大利的航班中,抵达时的天气有 424 次为晴天,417 次为下雨天等,所以通过嵌套的方式就可以很快得到更深层次的数据统计值。 # 总结 本文对 Elasticsearch 的聚合功能做了初步介绍,也学习 Bucket 和 Metric 聚合分析,在后续文章会对聚合功能做一个更加深入的讲解。 下面是我总结的 Elasticsearch 聚合分析的思维导图,在公众号【**武培轩**】回复【**es**】获取思维导图以及源代码。 ![Elasticsearch 聚合分析](https://img-blog.csdnimg.cn/20200322182759612.png) > 参考文献 > > Elastic Stack从入门到实践 > > Elasticsearch核心技术与实战 > > https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-aggregations.html

加载全部内容

相关教程
猜你喜欢
用户评论