zoukankan      html  css  js  c++  java
  • 【ElasticSearch(十)进阶】Aggregations执行聚合

    【ElasticSearch(十)进阶】Aggregations执行聚合

    • 聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数。
    • 在 ElasticSearch 中,你可以执行queryaggs(可以包含多个聚合),返回 结果包含 hits(命中结果,可以查看 查询结果),同时返回 aggregations(聚合结果)。使用一次简洁和简化的AP来避免网络往返。

    1.聚合集合的分类

    • Bucket Aggregation:一些列满足特定条件的文档的集合
    • Metric Aggregation:一些数学运算,可以对文档字段进行统计分析
    • Pipeline Aggregation:对其他的聚合结果进行二次聚合
    • Matrix Aggregration:支持对多个字段的操作并提供一个结果矩阵

    2.Bucket

    使用字段terms进行分桶。Bucket相当于mysql里的GROUP BY


    【例子】

    搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄。

    aggs:聚合操作

    ageAggageAvg:单个聚合操作的名称

    terms:获取结果的不同数据个数。在这里是,统计不同年龄的分布人数。

    field:要统计的属性

    size:显示几个。在这里是,只获取前10种年龄分布。

    avg:求平均值

    GET /bank/_search
    {
      "query":{
        "match":{
          "address":"mill"
        }
      },
      "aggs":{
        "ageAgg":{
          "terms":{
            "field": "age",
            "size": 10
          }
        },
        "ageAvg":{
          "avg":{
            "field":"age"
          }
        }
      }
    }
    

    (补充)如果 不想看query的详细结果,只看聚合结果,加上size=0

    GET /bank/_search
    {
      "query":{
        "match":{
          "address":"mill"
        }
      },
      "aggs":{
        "ageAgg":{
          "terms":{
            "field": "age",
            "size": 10
          }
        },
        "ageAvg":{
          "avg":{
            "field":"age"
          }
        }
      },
      "size": 0  //新增
    }
    

    返回的结果:可以看到hits这里是空的

    {
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 4,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "aggregations" : {
        "ageAgg" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [
            {
              "key" : 38,
              "doc_count" : 2
            },
            {
              "key" : 28,
              "doc_count" : 1
            },
            {
              "key" : 32,
              "doc_count" : 1
            }
          ]
        },
        "ageAvg" : {
          "value" : 34.0
        }
      }
    }
    

    3.Metric

    包括统计avgmaxmin等。


    【例子】

    按照年龄聚合,选出前3个,并且请求这些年龄段的这些人的平均薪资

    这里先聚合了年龄,再在这个基础上计算这些人的平均薪资(用子聚合)。

    GET /bank/_search
    {
      "query":{
        "match_all": {}
      },
      "aggs":{
        "ageAgg":{
          "terms":{
            "field": "age",
            "size": 3
          },
          "aggs":{  //子聚合
            "balanceAvg":{
              "avg":{
                "field": "balance"
              }
            }
          }
        }
      },
      "size": 0
    }
    

    返回结果:

    {
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1000,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "aggregations" : {
        "ageAgg" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 820,
          "buckets" : [
            {
              "key" : 31,
              "doc_count" : 61,
              "balanceAvg" : {
                "value" : 28312.918032786885
              }
            },
            {
              "key" : 39,
              "doc_count" : 60,
              "balanceAvg" : {
                "value" : 25269.583333333332
              }
            },
            {
              "key" : 26,
              "doc_count" : 59,
              "balanceAvg" : {
                "value" : 23194.813559322032
              }
            }
          ]
        }
      }
    }
    


    【综合例子】

    查询出年龄分布,并且这些 年龄段中 性别为 M 的平均薪资 和 性别为 F 的平均薪资 以及 这个年龄段的总体平均薪资。

    分解思路:

    先查询出年龄分布,在它的子聚合里统计性别为M和F的分别人数,在M/F分别人数的结果里的用子聚合统计各自的平均薪资。

    在年龄分布的子聚合里统计该年龄段的平均薪资。

    GET bank/_search
    {
      "query":{
        "match_all": {}
      },
      "aggs":{
        "ageAgg":{
          "terms": {
            "field": "age",
            "size": 3
          },
          "aggs": {
            "genderAgg": {
              "terms": {
                "field": "gender.keyword"
              },
              "aggs":{
                "balanceAvg":{
                  "avg":{
                    "field": "balance"
                  }
                }
              }
            },
            "ageBalanceAvg":{
              "avg":{
                "field": "balance"
              }
            }
          }
        }
      },
      "size": 0
    }
    

    返回结果:

    {
      "took" : 2,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1000,
          "relation" : "eq"
        },
        "max_score" : null,
        "hits" : [ ]
      },
      "aggregations" : {
        "ageAgg" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 820,
          "buckets" : [
            {
              "key" : 31,
              "doc_count" : 61,
              "genderAgg" : {
                "doc_count_error_upper_bound" : 0,
                "sum_other_doc_count" : 0,
                "buckets" : [
                  {
                    "key" : "M",
                    "doc_count" : 35,
                    "balanceAvg" : {
                      "value" : 29565.628571428573
                    }
                  },
                  {
                    "key" : "F",
                    "doc_count" : 26,
                    "balanceAvg" : {
                      "value" : 26626.576923076922
                    }
                  }
                ]
              },
              "ageBalanceAvg" : {
                "value" : 28312.918032786885
              }
            },
            {
              "key" : 39,
              "doc_count" : 60,
              "genderAgg" : {
                "doc_count_error_upper_bound" : 0,
                "sum_other_doc_count" : 0,
                "buckets" : [
                  {
                    "key" : "F",
                    "doc_count" : 38,
                    "balanceAvg" : {
                      "value" : 26348.684210526317
                    }
                  },
                  {
                    "key" : "M",
                    "doc_count" : 22,
                    "balanceAvg" : {
                      "value" : 23405.68181818182
                    }
                  }
                ]
              },
              "ageBalanceAvg" : {
                "value" : 25269.583333333332
              }
            },
            {
              "key" : 26,
              "doc_count" : 59,
              "genderAgg" : {
                "doc_count_error_upper_bound" : 0,
                "sum_other_doc_count" : 0,
                "buckets" : [
                  {
                    "key" : "M",
                    "doc_count" : 32,
                    "balanceAvg" : {
                      "value" : 25094.78125
                    }
                  },
                  {
                    "key" : "F",
                    "doc_count" : 27,
                    "balanceAvg" : {
                      "value" : 20943.0
                    }
                  }
                ]
              },
              "ageBalanceAvg" : {
                "value" : 23194.813559322032
              }
            }
          ]
        }
      }
    }
    
  • 相关阅读:
    分享一个详情页
    ES6初探,变量的声明
    ES6初探,什么是ES6
    提问回顾
    个人阅读&个人总结
    结对项目-数独程序扩展
    个人作业Week3-案例分析
    个人作业Week2-代码复审
    个人作业1
    【个人项目】数独
  • 原文地址:https://www.cnblogs.com/musecho/p/15179999.html
Copyright © 2011-2022 走看看