Elasticsearch-聚合
2024-04-10 03:20:28  阅读数 1628

零、本文纲要

  • 一、聚合
    1、常见的聚合类型
    2、参与聚合的字段类型
  • 二、聚合DSL
    1、桶(Bucket)聚合
    ① 桶聚合结果排序
    ② 限定桶聚合范围
    2、度量(Metric)聚合
  • 三、RestClient实现聚合
    1、编写DSL语句
    2、解析聚合结果

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

一、聚合

官方文档:Aggregations

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

1、常见的聚合类型

  • 桶(Bucket)聚合

用来对文档做分组:

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

  • 度量(Metric)聚合

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

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

  • 管道(pipeline)聚合

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

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

四、结尾

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