执行聚合

聚合提供了数据的组合和提取的能力。想想聚集最简单的方法是将其大致等同于SQL GROUP BY和SQL聚合函数。在Elasticsearch,你拥有执行的搜索返回命中的能力,同时匹配和返回汇总结果也都在同一个返回相应中。你可以操作一次性避免网络往返,运行查询和多个聚合并得到两个(或两者以上)的结果返回,这是非常强大和有效的,使用起来简洁和简化的API。

看下面,这个例子组中有美国各州所有的帐户,然后以计数下降(默认)返回前10个(默认)州进行分类:


curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      }
    }
  }
}'

在SQL中,上面聚集概念类似于这样:


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

响应(部分示例):


"hits"  :  { 
    "total"  :  1000 , 
    "max_score"  :  0.0 , 
    "hits"  :  [  ] 
  }, 
  "aggregations"  :  { 
    "group_by_state"  :  { 
      "buckets"  :  [  { 
        "key"  :  "al" , 
        "doc_count"  :  21 
      },  { 
        "key"  :  "tx" , 
        "doc_count"  :  17 
      },  { 
        "key"  :  "id" , 
        "doc_count"  :  15 
      },  { 
        "key"  :  "ma" , 
        "doc_count"  :  15 
      },  { 
        "key"  :  "md" , 
        "doc_count"  :  15 
      },  { 
        "key"  :  "pa" , 
        "doc_count"  :  15 
      },  { 
        "key"  :  "dc" , 
        "doc_count"  :  14 
      },  { 
        "key"  :  "me" , 
        "doc_count"  :  14 
      },  { 
        "key"  :  "mo" , 
        "doc_count"  :  14 
      },  { 
        "key"  :  "nd" , 
        "doc_count"  :  14 
      }  ] 
    } 
  } 
}

我们可以看到,有21个账户在AL(ABAMA)中,然后TX 中有17个账户,随后15个账户中在ID(AHO),等等。

请注意,我们设置的大小size=0为不显示搜索命中,因为我们只希望看到在响应中聚集的结果。

在前一个聚合的基础上,这个例子中(再次仅通过数量降序排列的前10国)计算由国家平均的账户余额:


curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'

注意我们是如何嵌套在average_balance里面聚集group_by_state聚集。这是所有聚合的通用模式。你可以嵌套聚合、内部聚合,从您的数据中任意提取需要的核心总结。

在前一个聚合的基础上,现在让我们来对平均余额降序排序:


curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'

此示例演示,我们可以按年龄段(20-29岁,30-39岁,40-49岁和),然后按性别,最后得到的平均账户余额,每个年龄段,性别进行分组:


curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "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"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}'

在这里,我们不会细讲这里其他很多聚合功能。该聚合参考指南是一个很好的起点,如果你想要做进一步实验的话。

results matching ""

    No results matching ""