Elasticsearch聚合使您能够获得关于搜索结果的元信息,并回答诸如“德克萨斯州有多少帐户持有人”或“田纳西州的平均帐户余额是多少”之类的问题。您可以在一个请求中搜索文档、过滤搜索结果并使用聚合来分析结果。

    例如,以下请求使用terms汇总将bank索引中的所有帐户按状态分组,并按降序返回帐户数量最多的十个州:

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword"
    8. }
    9. }
    10. }
    11. }

    cURL:

    curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" } } } } '
    

    响应中的 bucketsstate 字段的值。doc_count 显示每个状态下的帐户数量。例如,您可以看到在ID (Idaho)中有27个帐户。因为请求集 size=0, 所以响应只包含聚合结果。

    {
      "took": 29,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped" : 0,
        "failed": 0
      },
      "hits" : {
         "total" : {
            "value": 1000,
            "relation": "eq"
         },
        "max_score" : null,
        "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
          } ]
        }
      }
    }
    

    您可以组合聚合来构建更复杂的数据摘要。例如,下面的请求在先前的group_by_state 聚合中嵌套一个avg 聚合,以计算每个状态的平均帐户余额。

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

    cURL:

    curl -X GET "localhost:9200/bank/_search?pretty" -H 'Content-Type: application/json' -d' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } '
    

    除了这些基本的过滤和度量聚合之外,Elasticsearch还提供了专门的聚合,用于操作多个字段和分析特定类型的数据,如日期、IP地址和地理数据。您还可以将单个聚合的结果提供给管道聚合以进行进一步分析。

    聚合提供的核心分析功能支持使用机器学习等高级功能来检测异常。