执行聚合

聚合提供了分组和抽取数据的能力. 理解聚合最简单的方式就是, 把它想成SQL中的GROUP BY语句和聚合函数. 在Elasticsearch中, 你有能力在同一时间执行查询返回hits和对结果进行聚合展示. 这是非常强大和高效的,因为您可以运行查询和多个聚合, 并一次性获得两个(或者其中之一)操作的结果, 从而避免使用简明和简化的API进行网络往返.

首先, 这个例子以state分组所有文档, 然后默认返回前10个数量最多的state数据, 默认倒叙.

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

在SQL中, 上面的聚合累死下面的语句:

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

响应如下(部分展示):

{
  "took": 29,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770,
      "buckets" : [ {
        "key" : "ID",
        "doc_count" : 27
      }, {
        "key" : "TX",
        "doc_count" : 27
      }, {
        "key" : "AL",
        "doc_count" : 25
      }, {
        "key" : "MD",
        "doc_count" : 25
      }, {
        "key" : "TN",
        "doc_count" : 23
      }, {
        "key" : "MA",
        "doc_count" : 21
      }, {
        "key" : "NC",
        "doc_count" : 21
      }, {
        "key" : "ND",
        "doc_count" : 21
      }, {
        "key" : "ME",
        "doc_count" : 20
      }, {
        "key" : "MO",
        "doc_count" : 20
      } ]
    }
  }
}

我们可以看到ID有27个文档, TX27个, AL25个 等等.

注意我们设置了size=0, 为了不显示查询结果, 因为m 指向看到响应中的聚合结果.

基于前面的聚合, 这个例子根据state分组, 计算出平均的balance(默认10条, 降序):

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

注意我们是如何在group聚合里内嵌了一个avg聚合. 这是聚合的通用模式. 你可以任意在聚合里内嵌聚合, 以获取你需要的数据.

基于前面的聚合, 昂我们根据balance的平均值降序排列:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

下面的例子像我们展示了如何根据年龄段(20-29, 30-39, 40-49)分组, 在根据性别, 最后根据balance平均值. 每个年龄段, 每个性别:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

还有很多的聚合功能, 我们不会深入研究. 如果你想进一步的学习聚合, 那么聚合参考手册会是一个很好的起点.

results matching ""

    No results matching ""