Elastic学习之旅 (7) 聚合分析
大家好,我是Edison。
上一篇:ES的Query DSL
什么是ES的聚合
Elastic除搜索之外,还提供针对ES数据的统计分析功能,具有较高的实时性。
通过聚合,我们可以得到一个数据的概览,它是分析和总结全套的数据,而不是寻找单个文档。
例如,我们可以通过聚合得到一个旅游网站的以下数据:
地区A 和 地区B 的客房数量
不同的价格区间,可以预定的经济性酒店和舒适型酒店的数量
使用ES聚合,我们只需要一条语句,就可以从ES得到分析的结果,无需在客户端去实现。在Kibana中,大量的可视化报表其实都是采用了ES的聚合分析来得到的数据结果。

ES聚合的分类
ES中常见的聚合有如下几类:
Bucket Aggregation - 一些列满足特定条件的文档集合
Metric Aggregation - 一些数学运算,可以对文档字段进行统计分析
Pipeline Aggregation - 对其他的聚合结果进行二次聚合
Matrix Aggregation - 支持对多个字段的操作并提供一个结果矩阵
那么,接下来,我们就一起来看看最常用的Bucket & Metric聚合。
Bucket & Metric
这里我们直接用我们都很熟悉的SQL语句来理解Bucket和Metric:

Metric就类似于SQL中的一些聚合函数方法,主要对数据集进行计算。
大多数Metric是数学计算,仅仅输出一个值,如:min / max / sum / avg / cardinality
少部分Metric支持输出多个数值,如:stats / percentiles / percentile_ranks
Bucket就类似于SQL中对数据进行分组,主要指满足一定条件的文档集合。
我们可以借助Bucket实现数据的分桶,例如可以实现酒店的高档、中档和低档的分桶,也可以在高档的分组下再分为好评、中评和差评三个分桶。
ES中提供了多种类型的Bucket,例如 Term & Range,可以让我们轻松地实现时间 / 年龄区间 / 地理位置的分桶。
下面我们来看一个Bucket的例子:
查看航班目的地的统计信息
分桶字段:DestCountry (目的地)
// 按照字段的Terms进行分桶
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"flight_dest": {
"terms": {
"field": "DestCountry"
}
}
}
}
统计结果如下图所示:

可以从结果图中看出,ES返回了以航班目的地为分组的的Buckets(分桶),IT(意大利)的航班有2371次,US(美丽国)的航班有1987次...
下面我们来看一个加入Metirc的例子:
查看航班目的地的统计信息,并增加均价、最高价 和 最低价的统计
这里我们就可以使用ES提供的数学计算Metrics了
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"flight_dest": {
"terms": {
"field": "DestCountry"
},
"aggs": {
// 自定义名字为 avaerage_price
"average_price": {
// 使用 avg metric
"avg": {
"field": "AvgTicketPrice"
}
},
// 自定义名字为 max_price
"max_price": {
// 使用 max metric
"max": {
"field": "AvgTicketPrice"
}
},
// 自定义名字为 min_price
"min_price": {
// 使用 min metric
"min": {
"field": "AvgTicketPrice"
}
}
}
}
}
}
统计结果如下图所示:

可以从结果图中看出,ES在之前分组统计的基础上,还把平均价格、最高价和最低价都统计出来了。
相信到这里,你已经初步了解基本的统计分析了。
聚合嵌套
如果想要在上面的聚合统计基础之上,再做进一步的详细分析,我们就可以使用聚合嵌套。
还是以上面的示例为基础,我们想要:
查看航班目的地的统计信息,平均票价,以及天气情况。
天气情况是基于之前对航班目的地的聚合统计的基础之上,做的二次聚合,类似于在第一个Bucket中再分几个Bucket,这个就是聚合嵌套。
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs": {
"flight_dest": {
"terms": {
"field": "DestCountry"
},
"aggs": {
"average_price": {
"avg": {
"field": "AvgTicketPrice"
}
},
// 聚合嵌套
"weather": {
"terms": {
"field": "DestWeather"
}
}
}
}
}
}
统计结果如下图所示:

可以看到,ES在以航班目的地为分组的Bucket下,又为我们分出了多个Bucket,这些嵌套的Bucket就是我们想要统计的天气情况。比如,图中航班目的地为CN(中国)的天气情况中,Sunny(晴朗)天气的记录有209条,而Rain(下雨)天气的记录有207条。
小结
本篇,我们了解了ElasticSearch的聚合的概念,以及两个重要的聚合 Bucket & Metric。通过一个查询实例,我们了解了如何使用 Bucket & Metric 进行最基本的统计分析,ES的聚合还支持嵌套,还是很强大的!
参考资料
极客时间,阮一鸣,《ElasticSearch核心技术与实战》

Elastic学习之旅 (7) 聚合分析的更多相关文章
- Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...
- Elasticsearch 之聚合分析入门
本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合. 首先来看下聚合(Aggregation): 什么是 Aggregati ...
- ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探
一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建 ...
- Elasticsearch 6.x版本全文检索学习之聚合分析入门
1.什么是聚合分析? 答:聚合分析,英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能.特点如下所示: a.功能丰富,提供Bucket.Metric.Pipeline等 ...
- Elasticsearch学习笔记(三)聚合分析Agg
一.设置fielddata PUT /index/_mapping/type { "properties":{ "fieldName" ...
- Elasticsearch学习之深入聚合分析四---案例实战
1. 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99 tp50:50%的请求的耗时最长在多长时间tp90:90%的请求的耗时最长在多长时间tp99:99%的请 ...
- Elasticsearch学习之深入聚合分析三---案例实战
1. 统计指定品牌下每个颜色的销量 任何的聚合,都必须在搜索出来的结果数据中进行,搜索结果,就是聚合分析操作的scope GET /tvs/sales/_search { , "query& ...
- Elasticsearch学习之深入聚合分析二---案例实战
以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析,首先建立电视销售的索引,然后 添加几条销售记录 PUT /tvs { "mappin ...
- Elasticsearch学习之深入聚合分析一---基本概念
首先明白两个核心概念:bucket和metric 1. bucket:一个数据分组 city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 基于city划分buckets,划分 ...
- Elastic Stack 笔记(七)Elasticsearch5.6 聚合分析
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个分布式的全文搜索引擎,索引和搜索是 Elasticsarch 的基本功能.同时,Elasticsear ...
随机推荐
- Linux下安装node及npm
Linux下安装node 1.解压 $ tar zxf node-v8.9.0-linux-x64.tar.gz 2.移动到指定目录 $ mv node-v8.9.0-linux-x64 /usr/l ...
- unity里生成的.csproj和.sln :assembly definition以及ET框架中的程序集定义
有一段时间一直没明白为啥有的时候第三方的package里的代码没法引用我们项目的,最近有点心得,记录下: 在创建unity项目的时候默认是创建一个解决方案就是以.sln为结尾的.默认开发时都在同一个解 ...
- Java并发并发编程实战-并发容器和同步工具类
并发容器 ConcurrentHashMap 设计原理 分段锁(JDK 7) :将数据分成多个段(Segment),每个段独立加锁,不同段的操作可并行执行. CAS + synchronized(JD ...
- 【问题解决】centos7已经不维护了,如何继续使用yum源?
背景 CentOS 7 已于2024年6月30日停止维护,在停止维护后我们之前配置的国内镜像源大多都是空目录了,即在线国内镜像源不可用,就像下边这样提示: [root@bogon yum.repos. ...
- TablesOfContents.Add 方法 (python3处理Word添加目录)
TablesOfContents.Add 方法 (Word) 返回一 个 TableOfContents 对象,该对象代表添加到文档中的目录. 语法 表达式.Add (Range, UseHeadin ...
- 一、C语言概述
声明 本文内容大多取自<高级语言程序设计一书>,为本人学习笔记记录,切勿用于商业用途. 第一节 计算机发展 电子计算机已经历的四个发展时代: 第一代:20 世纪 50 年代,主要采用真空电 ...
- 一个开源、经典的 WPF 控件、组件和实用工具集合,值得参考学习!
前言 今天大姚给大家推荐一个开源.经典的 WPF 控件.组件和实用工具集合,对于想要自己编写 WPF UI 界面的同学可以参考借鉴学习:Extended.Wpf.Toolkit. 项目介绍 Exten ...
- http2和http3
HTTP/2 和 HTTP/3 是 HTTP 协议的升级版本,主要为了解决 HTTP/1.x 协议的性能瓶颈和安全性问题.以下是它们的主要目标和解决的问题: HTTP/2 的主要目标和解决的问题 1. ...
- xshell远程连接出现WARNING! The remote SSH server rejected X11 forwarding request.
解决办法: 编辑sshd配置文件 vi /etc/ssh/sshd_config 设置 X11Forwarding yes UserLogin no //原本的注释解开 yum install -y ...
- CSS 魔法与布局技巧
CSS 布局与视觉效果常用实践指南 在我一篇随笔中其实有说到十大布局,里面有提到 flex 布局.grid 布局.响应式布局,不过没有提到容器查询这个,现在说下这三个布局然后穿插下容器查询把. 1️⃣ ...