> 文章列表 > elasticsearch——数据聚合

elasticsearch——数据聚合

elasticsearch——数据聚合

聚合的种类

聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

桶(Bucket)聚合:用来对文档做分组

      TermAggregation:按照文档字段值分组

       Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

        Avg:求平均值

        Max:求最大值

        Min:求最小值

        Stats:同时求max、min、avg、sum等

管道(pipeline)聚合:其它聚合的结果为基础做聚合

参与聚合的字段类型必须是:

        keyword

        数值

        日期

        布尔

DSL实现聚合

Bucket聚合

简单聚合

现在,我们要统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。 类型为term类型,DSL示例:

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10
      }
    }
  }
}

结果排序

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。 我们可以修改结果排序方式:

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

限定聚合范围

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lte": 200
      }
    }
  }, 
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10
      }
    }
  }
}
 

aggs代表聚合,与query同级,此时query的作用是?

限定聚合的的文档范围

聚合必须的三要素:

聚合名称 聚合类型 聚合字段

聚合可配置属性有:

size:指定聚合结果数量

order:指定聚合结果排序方式

field:指定聚合字段

Metrics 聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值. 我们可以利用stats聚合:

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10
        , "order": {
          "score_state.avg": "asc"
        }
      }
      , "aggs": {
        "score_state": {
          "stats": {
            "field": "score"
          }
        }
      }
    }
  }
}

RestAPI实现聚合

    @Testvoid testAggTerm() throws IOException {String name="brandAgg";SearchRequest request = new SearchRequest("hotel");request.source().size(0);request.source().aggregation(AggregationBuilders.terms(name).field("brand").size(20));SearchResponse response = client.search(request, RequestOptions.DEFAULT);Aggregations aggregations = response.getAggregations();Terms brandTerms = aggregations.get(name);List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();for (Terms.Bucket bucket:buckets){String key = bucket.getKeyAsString();System.out.println(key);}}

其中包括组装API和结果解析两部分