My Github

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核心技术与实战

 

posted @ 2024-04-07 08:30  EdisonZhou  阅读(26)  评论(0编辑  收藏  举报