ElasticSearch - 聚合 aggs

聚合概念

  • ElasticSearch除了致力于搜索之外,也提供了聚合实时分析数据的功能

    • 如果把搜索比喻为大海捞针(从海量的文档中找出符合条件的那一个),那麽聚合就是去分析大海中的针们的特性,像是

      • 在大海里有多少针?

      • 针的平均长度是多少?

      • 按照针的製造商来划分,针的长度中位值是多少?

      • 每月加入到海中的针有多少?

      • 这里面有异常的针麽?

    • 因此透过聚合,我们可以得到一个数据的概览,聚合能做的是分析和总结全套的数据,而不是查找单个文档(这是搜索做的事)

  • 聚合允许我们向数据提出一些複杂的问题,虽然他的功能完全不同于搜索,但他们其实使用了相同的数据结构,这表示聚合的执行速度很快,并且就像搜索一样几乎是实时的

    • 并且由于聚合和搜索是使用同样的数据结构,因此聚合和搜索可以是一起执行的

    • 这表示我们可以在一次json请求裡,同时对相同的数据进行 搜索/过滤 + 分析,两个愿望一次满足

  • 聚合的两个主要的概念,分别是 桶 和 指标

    • 桶(Buckets) : 满足特定条件的文档的集合

      • 当聚合开始被执行,每个文档会决定符合哪个桶的条件,如果匹配到,文档将放入相应的桶并接着进行聚合操作

        • 像是一个员工属于男性桶或者女性桶,日期2014-10-28属于十月桶,也属于2014年桶

      • 桶可以被嵌套在其他桶里面

        • 像是北京能放在中国桶裡,而中国桶能放在亚洲桶裡

      • Elasticsearch提供了很多种类型的桶,像是时间、最受欢迎的词、年龄区间、地理位置桶等等,不过他们在根本上都是通过同样的原理进行操作,也就是基于条件来划分文档,一个文档只要符合条件,就可以加入那个桶,因此一个文档可以同时加入很多桶

    • 指标(Metrics) : 对桶内的文档进行统计计算

      • 桶能让我们划分文档到有意义的集合, 但是最终我们需要的是对这些桶内的文档进行一些指标的计算

      • 指标通常是简单的数学运算(像是min、max、avg、sum),而这些是通过当前桶中的文档的值来计算的,利用指标能让你计算像平均薪资、最高出售价格、95%的查询延迟这样的数据

  • aggs 聚合的模板

    • 当query和aggs一起存在时,会先执行query的主查询,主查询query执行完后会搜出一批结果,而这些结果才会被拿去aggs拿去做聚合

      • 另外要注意aggs后面会先接一层自定义的这个聚合的名字,然后才是接上要使用的聚合桶

      • 如果有些情况不在意查询结果是什麽,而只在意aggs的结果,可以把size设为0,如此可以让返回的hits结果集是0,加快返回的速度

    • 一个aggs裡可以有很多个聚合,每个聚合彼此间都是独立的,因此可以一个聚合拿来统计数量、一个聚合拿来分析数据、一个聚合拿来计算标准差...,让一次搜索就可以把想要做的事情一次做完

      • 像是此例就定义了3个聚合,分别是custom_name1、custom_name2、custom_name3

    • aggs可以嵌套在其他的aggs裡面,而嵌套的桶能作用的文档集范围,是外层的桶所输出的结果集

    GET 127.0.0.1/mytest/doc/_search
    {
        "query": { ... },
        "size": 0,
        "aggs": {
            "custom_name1": {  //aggs后面接著的是一个自定义的name
                "桶": { ... }  //再来才是接桶
            },
            "custom_name2": {  //一个aggs裡可以有很多聚合
                "桶": { ... }
            },
            "custom_name3": {
                "桶": {
                   .....
                },
                "aggs": {  //aggs可以嵌套在别的aggs裡面
                    "in_name": { //记得使用aggs需要先自定义一个name
                        "桶": { ... } //in_name的桶作用的文档是custom_name3的桶的结果
                    }
                }
            }
        }
    }
    • 结果

        {
         "hits": {
             "total": 8,
             "max_score": 0,
             "hits": [] //因为size设为0,所以没有查询结果返回
         },
         "aggregations": {
             "custom_name1": {
                 ...
             },
             "custom_name2": {
                 ...
             },
             "custom_name3": {
                 ... ,
                 "in_name": {
                    ....
                 }
             }
         }
        }

聚合中常用的桶 terms、filter、top_hits

  • terms桶 : 针对某个field的值进行分组,field有几种值就分成几组

    • terms桶在进行分组时,会爲此field中的每种值创建一个新的桶

    • 要注意此 "terms桶" 和平常用在主查询query中的 "查找terms" 是不同的东西

    • 具体实例

      • 首先插入几笔数据,其中color是一个keyword类型

        { "color": "red" }
        { "color": "green" }
        { "color": ["red", "blue"] }
      • 执行terms聚合

        GET 127.0.0.1/mytest/doc/_search
        {
            "query": {
                "match_all": {}
            },
            "size": 0,
            "aggs": {
                "my_name": {
                    "terms": {
                        "field": "color" //使用colo
Elasticsearch中,聚合(aggregation)是一种强大的数据分析工具,可以对文档进行统计分析并返回计算结果。其中,Metric聚合是一种聚合类型,它会对文档中的某些数值型字段进行统计计算,例如:平均值、最大值、最小值、总和等。 下面我们来看一下如何在Elasticsearch中使用Metric聚合进行数据分析。 假设我们有一个存储了销售数据的索引,其中每个文档都包含了产品的名称、价格、销售量等信息。我们想要统计该索引中所有产品的平均价格、最高价格、最低价格以及销售总量,可以使用以下的聚合查询DSL: ``` GET /sales/_search { "size": 0, "aggs": { "avg_price": { "avg": { "field": "price" } }, "max_price": { "max": { "field": "price" } }, "min_price": { "min": { "field": "price" } }, "total_sales": { "sum": { "field": "sales" } } } } ``` 在上述查询中,我们使用了四个不同的Metric聚合:avg(平均值)、max(最大值)、min(最小值)和sum(总和)。每个聚合都针对文档中的price和sales字段进行了计算,最终返回了平均价格、最高价格、最低价格以及销售总量的计算结果。 在聚合查询中,我们还可以使用多个Metric聚合组合起来进行更加复杂的数据分析。例如,我们可以计算不同销售区域的平均价格和销售总量,可以使用以下的聚合查询DSL: ``` GET /sales/_search { "size": 0, "aggs": { "by_region": { "terms": { "field": "region" }, "aggs": { "avg_price": { "avg": { "field": "price" } }, "total_sales": { "sum": { "field": "sales" } } } } } } ``` 在上述查询中,我们首先使用了terms聚合将文档按照region字段进行了分组,然后在每个分组中使用了两个不同的Metric聚合:avg(平均值)和sum(总和)。最终返回了不同销售区域的平均价格和销售总量的计算结果。 总之,Metric聚合Elasticsearch中非常有用的数据分析工具,可以帮助我们对文档中的数值型字段进行统计分析并返回计算结果。在实际应用中,我们可以根据具体的业务需求来选择不同的Metric聚合进行数据分析。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值