用聚合分析结果

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

比如,下面这个请求使用一个 terms 聚合将索引 bank 中的所有账户按州分组,并按降序返回账户最多的前 10 个州。

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

响应中的 桶 (buckets) 是字段 state 的值。 doc_count 显示每个州的账户数量。 比如,你可以看到在 ID (Idaho) 州有 27 个账户。 因为请求中设置了 size=0,所以响应中只包含聚合的结果(译者注: aggregations部分有数据,而hits.hits为空)

{
  "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"
          }
        }
      }
    }
  }
}

与按结果的计数排序不同,你可以使用嵌套聚合的结果进行排序,方法是在 terms 聚合中指定顺序:

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

除了这些基本的桶(bucket)度量聚合(metrics aggregation) 之外,Elasticsearch 还提供了专门的聚合,用于操作 多字段(multiple fields) 和分析特定类型的数据,如日期、IP地址和地理数据。 你还可以将单个聚合的结果输入管道聚合以进行进一步分析。

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