zoukankan      html  css  js  c++  java
  • elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg

    分析

    Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它很像SQL中的GROUP BY但是功能更强大。

    举个例子,让我们找到所有职员中最大的共同点(兴趣爱好)是什么:

    GET .monitoring-es-6-2018.08.16/_search
    {
    "aggs": {
    "all_interests": {
    "terms": {
    "field": "source_node.host"
    }
    }
    }
    }

    暂时先忽略语法只看查询结果:

    "aggregations": {
    "all_interests": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
    {
    "key": "10.96.141.205",
    "doc_count": 383515
    },
    {
    "key": "10.96.141.203",
    "doc_count": 8868
    },
    {
    "key": "10.96.141.204",
    "doc_count": 8866
    },
    {
    "key": "10.96.141.209",
    "doc_count": 8864
    },
    {
    "key": "10.96.141.210",
    "doc_count": 8862
    }
    ]
    }
    }

    我们可以看到两个职员对音乐有兴趣,一个喜欢林学,一个喜欢运动。这些数据并没有被预先计算好,它们是实时的从匹配查询语句的文档中动态计算生成的。如果我们想知道所有姓"Smith"的人最大的共同点(兴趣爱好),我们只需要增加合适的语句既可:

    GET /megacorp/employee/_search
    {
      "query": {
        "match": {
          "last_name": "smith"
        }
      },
      "aggs": {
        "all_interests": {
          "terms": {
            "field": "interests"
          }
        }
      }
    }
    

    all_interests聚合已经变成只包含和查询语句相匹配的文档了:

      ...
      "all_interests": {
         "buckets": [
            {
               "key": "music",
               "doc_count": 2
            },
            {
               "key": "sports",
               "doc_count": 1
            }
         ]
      }
    

    聚合也允许分级汇总。例如,让我们统计每种兴趣下职员的平均年龄:

    GET /megacorp/employee/_search
    {
        "aggs" : {
            "all_interests" : {
                "terms" : { "field" : "interests" },
                "aggs" : {
                    "avg_age" : {
                        "avg" : { "field" : "age" }
                    }
                }
            }
        }
    }
    

    虽然这次返回的聚合结果有些复杂,但任然很容易理解:

    3
      ...
      "all_interests": {
         "buckets": [
            {
               "key": "music",
               "doc_count": 2,
               "avg_age": {
                  "value": 28.5
               }
            },
            {
               "key": "forestry",
               "doc_count": 1,
               "avg_age": {
                  "value": 35
               }
            },
            {
               "key": "sports",
               "doc_count": 1,
               "avg_age": {
                  "value": 25
               }
            }
         ]
      }
    

    该聚合结果比之前的聚合结果要更加丰富。我们依然得到了兴趣以及数量(指具有该兴趣的员工人数)的列表,但是现在每个兴趣额外拥有avg_age字段来显示具有该兴趣员工的平均年龄。

    2

    即使你还不理解语法,但你也可以大概感觉到通过这个特性可以完成相当复杂的聚合工作,你可以处理任何类型的数据。

    为了掌握聚合aggs语法,你一定要了解两个主要概念:

    Buckets(桶):

    满足某个条件的文档集合。

    Metrics(指标):

    为某个桶中的文档计算得到的统计信息。

    就是这样!每个聚合只是简单地由一个或者多个桶,零个或者多个指标组合而成。


    桶和SQL中的组(Grouping)拥有相似的概念,而指标则与COUNT(),SUM(),MAX(),MIN(), AVG()等相似。

    让我们仔细看看这些概念。

    桶(Buckets)

    一个桶就是满足特定条件的一个文档集合:

    一名员工要么属于男性桶,或者女性桶。

    一个聚合就是一些桶和指标的组合。一个聚合可以只有一个桶,或者一个指标,或者每样一个。在桶中甚至可以有多个嵌套的桶。比如,我们可以将文档按照其所属国家进行分桶,然后对每个桶计算其平均薪资(一个指标)。

    因为桶是可以嵌套的,我们能够实现一个更加复杂的聚合操作:

    将文档按照国家进行分桶。(桶)
    然后将每个国家的桶再按照性别分桶。(桶)
    然后将每个性别的桶按照年龄区间进行分桶。(桶)
    最后,为每个年龄区间计算平均薪资。

    大家一定要理解Buckets(桶)及Metrics(指标)概念,buckets多层嵌套的概念,想基于哪个桶做统计计算,只需要嵌入一层aggs就可以了。

     

    本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6344688.html,如需转载请自行联系原作者

  • 相关阅读:
    okhttp post用json传递参数
    android10获取相册图片
    从一页跳转到另一页返回后刷新
    获取应用图标并转为bitmap适配android10
    上拉更新,下拉刷新
    android 多图片上传
    04号团队-团队任务5:项目总结会
    codeforces987D bfs跑最短路
    layaair 物理
    TypeScript
  • 原文地址:https://www.cnblogs.com/-flq/p/9519885.html
Copyright © 2011-2022 走看看