聚合提供了从你的数据中分组并萃取统计的能力。关于聚合的最简单的方法是将它大致等同于SQL组和SQL聚合函数。在Elasticsearch中,你可以执行搜索返回命中的结果,与此同时在同一个响应中返回聚合结果。在这个意义上这是非常强大和有效的,你可以使用简洁和简化的API在一次网络交互中完成查询和多个聚合操作。

首先,这个示例按state分组所有的account,然后返回按统计数(count)降序排列的前10个state。

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

 

在SQL中,上面的聚合在概念上类似:
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

返回:

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

 

我们可以看到在ID(Idaho)中有27个账户,紧跟着是27个账号在TX(Texas),然后是25个账号在AL(Alabama),以此类推。
需要注意的是我们设置了size=0用来不显示search hits(搜索结果中的hits),因为我们只想看返回的聚合结果。
在前边的聚合基础上,下面的例子计算各州(state)的平局账户余额。(仅取按计数降序排列的前十个)。

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

 

注意我们是如何将average_balance聚合嵌套在group_by_state聚合中的。这是所有聚合的通用模式。你可以在聚合中任意嵌套聚合用于萃取你所需的数据汇总。
基于前面的聚合,让我们根据余额平均数姜旭排列。

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

这个例子演示了如何通过年龄组(年龄20-29岁,30-39岁,40-49),然后通过性别,最后得到每个年龄段、每个性别的平均账户余额。

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

 

还有很多其他的聚合能力,我们在此不会展开讲解。如果你想进一步了解,可以参考:Aggregations reference guide

 


本文系本人根据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。
原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_executing_aggregations.html

 posted on 2017-05-02 19:12  段子手6哥  阅读(264)  评论(0编辑  收藏  举报