前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elastic学习之旅 (7) 聚合分析

Elastic学习之旅 (7) 聚合分析

作者头像
Edison Zhou
发布2024-04-08 08:30:49
840
发布2024-04-08 08:30:49
举报
文章被收录于专栏:EdisonTalkEdisonTalk

大家好,我是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 (目的地)

代码语言:javascript
复制
// 按照字段的Terms进行分桶
GET kibana_sample_data_flights/_search
{
  "size": 0,
  "aggs": {
    "flight_dest": {
      "terms": {
        "field": "DestCountry"
      }
    }
  }
}

统计结果如下图所示:

可以从结果图中看出,ES返回了以航班目的地为分组的的Buckets(分桶),IT(意大利)的航班有2371次,US(美丽国)的航班有1987次...

下面我们来看一个加入Metirc的例子:

查看航班目的地的统计信息,并增加均价、最高价 和 最低价的统计

这里我们就可以使用ES提供的数学计算Metrics了

代码语言:javascript
复制
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,这个就是聚合嵌套。

代码语言:javascript
复制
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的聚合还支持嵌套,还是很强大的!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是ES的聚合
  • ES聚合的分类
  • Bucket & Metric
  • 聚合嵌套
  • 小结
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档