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 ...
随机推荐
- 【uniapp】文本控件多余文字省略号代替
多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...
- 无需WebView,Vue也能开发跨平台桌面应用
前言 一直以来,使用Vue开发桌面应用大部分都是使用基于webview的方案,如electron,tauri等.不依赖webview的,移动端倒有不少,如Weex,NativeScript等,桌面端寥 ...
- python的typer写cli脚本如此简单
# typer_demo.py import typer from pathlib import Path from typing import Optional from typing_extens ...
- 💻开源项目介绍-NewsNow-优雅的实时新闻聚合平台
news.zktww.vip 引言 在信息洪流中,如何优雅地获取新闻? 在当今信息爆炸的时代,我们每天需要在微博.知乎.Twitter.GitHub等平台间频繁切换,才能捕捉到最新的热点动态. New ...
- vue3在构建时,使用魔法糖语法时defineProps和defineEmits的注意事项
在 Vue 3.2+ 版本中,可以使用 <script setup> 替代传统的 script标签来编写组件,它提供了更简洁的语法来编写 Composition API 代码. 在 < ...
- jmeter使用时报错问题
一.打开时命令行提示按任意键继续图形界面无法打开 如图,打开时jmeter命令行报错 根据报错内容,是Java没有安装好. jdk安装好后,需要在环境变量中配置. 但是jdk安装配置好后打开还是报错, ...
- Composer的常用命令和关于在哪儿查看composer可用包列表的问题
1.安装: composer的安装就不用多说了,官网下载,一路next 中途貌似要让选择php.exe的所在目录. 2.常用命令: 1).配置/取消国内镜像仓库 /*配置国内镜像*/ composer ...
- NPOI,给指定的excle创建个下拉框验证
NPOI,给指定的excle创建个下拉框验证 先大致看下效果吧 Nuget 搜索 NPOI,一般出来的第一个就是,安装NPOI基础环境 1 using NPOI.HSSF.UserModel; 2 ...
- kubelet 创建 Pod 前发生了什么?
Kubelet Watch 到新增的 Pod,需要做的主要有以下几件事: 管理 Pod 状态,除了更新本地缓存,还要同步给 API server 计算节点的资源是否足够创建 Pod 创建 Cgroup ...
- ArcGIS Desktop 10.7 完美汉化安装教程
1,下载文件并解压缩,双击[Esri ArcGIS Desktop v10.7.0.exe] 2.在安装向导中选择[Next] 3.选中[I accept the master agreement]我 ...