elasticsearchES

Elasticsearch-聚合

2022-04-05  本文已影响0人  石头耳东

零、本文纲要

tips:Ctrl + F快速定位所需内容进行阅读吧。

一、聚合

官方文档:Aggregations

聚合(aggregations)可以实现对文档数据的统计、分析、运算。

1、常见的聚合类型

用来对文档做分组:

TermAggregation:按照文档字段值分组;
Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组。

用以计算一些值,比如:最大值、最小值、平均值等:

Avg:求平均值;
Max:求最大值;
Min:求最小值;
Stats:同时求max、min、avg、sum等。

其它聚合的结果为基础做聚合。

2、参与聚合的字段类型

keyword、数值、日期、布尔。

二、聚合DSL

1、桶(Bucket)聚合

GET /indexName/_search
{
    "size" : 0, //结果中仅包含聚合数据
    "aggs" : { //定义聚合,也可以写作aggregations
        "AGGNAME" : { //指定聚合名称,自定义
            "terms" : { //指定桶类型
              "field" : "FIELDNAME", //参与聚合的字段
              "size": VALUE //希望获取的聚合结果数量
            }
        }
    }
}

添加order实现结果排序,如下:

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "order": {
          "_count": "asc" //根据_count字段升序排序
        }, 
        "size": 20
      }
    }
  }
}
桶聚合结果排序.png

添加query限制,如下:

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

下图对比了两种搜索,未限制条件时10条可以完整查询到;限制条件后,仅剩4条结果符合限制条件。具体如下:

限定桶聚合范围.png

2、度量(Metric)聚合

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20,
        "order": {
          "scoreAgg.avg": "desc" //根据子查询中的avg降序排序
        }
      },
      "aggs": { //是brandAgg聚合的子聚合,brandAgg聚合后再分组计算
        "scoreAgg": { //子聚合名称
          "stats": { // 聚合类型,可以计算count、min、max、sum、avg
            "field": "score" //聚合字段,此处为score
          }
        }
      }
    }
  }
}
度量(Metric)聚合.png

三、RestClient实现聚合

1、编写DSL语句

// 2. 编写DSL语句
request.source().size(0);
request.source().aggregation(
        AggregationBuilders
                .terms("brandAgg")
                .field("brand")
                .size(10)
);
image.png

2、解析聚合结果

// 4. 解析结果
// 4.1 解析聚合结果
Aggregations aggregations = response.getAggregations();
// 4.2 根据名称获取聚合结果
Terms brandTerms = aggregations.get("brandAgg");
// 4.3 获取桶
List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
// 4.4 遍历
for (Terms.Bucket bucket : buckets) {
    // 4.5 获取key,品牌信息
    String brandName = bucket.getKeyAsString();
    System.out.println(brandName);
}
解析聚合结果.png

四、结尾

以上即为聚合部分的内容,感谢阅读。

上一篇下一篇

猜你喜欢

热点阅读