【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
          }
        }
      ]
    }
  }
}
posted @ 2021-08-24 13:52  musecho  阅读(260)  评论(0编辑  收藏  举报