大家好,我是Edison。
上一篇:ES的Query DSL
Elastic除搜索之外,还提供针对ES数据的统计分析功能,具有较高的实时性。
通过聚合,我们可以得到一个数据的概览,它是分析和总结全套的数据,而不是寻找单个文档。
例如,我们可以通过聚合得到一个旅游网站的以下数据:
使用ES聚合,我们只需要一条语句,就可以从ES得到分析的结果,无需在客户端去实现。在Kibana中,大量的可视化报表其实都是采用了ES的聚合分析来得到的数据结果。
ES中常见的聚合有如下几类:
那么,接下来,我们就一起来看看最常用的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的聚合还支持嵌套,还是很强大的!