ElasticSearch6.x版本聚合统计在Kibana上的实操和在SpringBoot上的实操

一、教学讲解视频

教学讲解视频地址:视频地址

二、Kibana上操作

1.直方图聚合统计

①概念

直方图聚合是一种基于多桶值聚合,可从文档中提取的数值或数值范围值来进行聚合。它可以对参与聚合的值来动态的生成固定大小的桶。

②代码

“size”: 0 作用是: 不显示具体的内容

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_histogram": {
      "histogram": {
        "field": "area",
        "interval": 5
      }
    }
  }
}

2.强制直方图聚合统计范围

①概念

使用extended_bounds可以进行强制指定直方图的统计起止范围。

②代码

注意:extended_bounds不会过滤分组,即使分组的值超过了extended_bounds的范围区间,也依然会显示。

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_histogram": {
      "histogram": {
        "field": "area",
        "interval": 5,
        "extended_bounds":{
          "min": 0,
          "max": 10
        }
      }
    }
  }
}

3.直方图聚合统计排序

①概念

在直方图聚合统计之后,我们可以对统计结果进行排序,排序分两种,一个根据统计后的key值进行排序。另一种就是根据统计后的count值进行排序。

②代码

根据统计后的key值降序排序

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_histogram": {
      "histogram": {
        "field": "area",
        "interval": 5,
        "order": {
          "_key": "desc"
        }
      }
    }
  }
}

根据统计后的count值降序排序

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_histogram": {
      "histogram": {
        "field": "area",
        "interval": 5,
        "order": {
          "_count": "desc"
        }
      }
    }
  }
}

4.直方图聚合统计偏移

①概念

分组默认从0开始以interval为间隔步进,可以通过offset修改分组的开始位置,这样就可以从offset开始以interval为间隔步进

②代码

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_histogram": {
      "histogram": {
        "field": "area",
        "interval": 5,
        "offset": 3
      }
    }
  }
}

5.日期直方图聚合统计

①概念

interval(时间间隔)的可用表达式:

  • year 1y
  • quarter 1q 季度
  • month 1M 月份
  • week 1w 星期
  • day 1d
  • hour 1h 小时
  • minute 1m 分钟
  • second 1s

②代码

把符合记录的最早时间和最晚时间为范围,根据每月1号(1M)为区间对范围进行切分

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_date_histogram": {
      "date_histogram": {
        "field": "updateTime",
        "interval": "1M",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

6.日期范围聚合统计

①概念

通过range查询某个日期范围内的数据个数统计。

②代码

/M 精确到月份
now 当前时间
time_zone 设置时区,默认是UTC,也就是现在时间会相差8h
假设现在(now)是2023年1月6日,这里就是查询日期范围为[2022-11-01, 2022-12-06]之间的数据个数。

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_date_range": {
      "date_range": {
        "field": "updateTime",
        "format": "yyyy-MM-dd", 
        "time_zone": "+08:00",
        "ranges": [
          {
            "from": "now-2M/M",
            "to": "now-1M"
          }
        ]
      }
    }
  }
}

7.过滤、多重过滤直方图聚合统计

①概念

使用filter在聚合统计前过滤出符合条件的数据。

②代码

先过滤出money字段值大于2500的数据,然后对过滤出的数据进行interval为10的区间范围大小进行聚合统计。

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_filter": {
      "aggs": {
        "test_histogram": {
          "histogram": {
            "field": "area",
            "interval": 10
          }
        }
      },
      "filter": {
        "range": {
          "money": {
            "gte": 2500
          }
        }
      }
    }
  }
}

多重过滤的话,我们可以使用filters实现。
注意:多重过滤是分别过滤然后分别聚合统计。

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_filter": {
      "aggs": {
        "test_histogram": {
          "histogram": {
            "field": "area",
            "interval": 10
          }
        }
      },
      "filters": {
        "filters": {
          "test_range1": {
            "range": {
              "money": {
                "gte": 2800
              }
            }
          },
          "test_range2" :{
            "range": {
              "id": {
                "lte": 5
              }
            }
          }
        }
      }
    }
  }
}

8.空值聚合统计

①概念

使用missing可以把指定字段为null的数据统计出来。

②代码

GET /online_house_achieve/house/_search
{
  "size": 0, 
  "aggs": {
    "test_missing": {
      "missing": {
        "field": "user.password"
      }
    }
  }
}

9.平均、最大、最小和求和的聚合统计

①概念

使用avg max min sum可以对某字段分别进行求平均、求最大、求最小和求和的操作。

②代码

平均

GET /online_house_achieve/house/_search
{
  "size": 0, 
   "aggs" : {
      "avg_grade" : { "avg" : { "field" : "area" } }
   }
}

最大

GET /online_house_achieve/house/_search
{
  "size": 0, 
   "aggs" : {
      "max_grade" : { "max" : { "field" : "area" } }
   }
}

最小

GET /online_house_achieve/house/_search
{
  "size": 0, 
   "aggs" : {
      "min_grade" : { "min" : { "field" : "area" } }
   }
}

求和

GET /online_house_achieve/house/_search
{
  "size": 0, 
   "aggs" : {
      "sum_grade" : { "sum" : { "field" : "area" } }
   }
}

一次性查询最大、最小、平均、求和
写法一

GET /online_house_achieve/house/_search
{
  "size": 0,
  "aggs":{
    "max_area":{
      "max":{
        "field":"area"
      }
    },
    "min_area":{
      "min":{
        "field":"area"
      }
    },
    "avg_area":{
      "avg":{
        "field":"area"
      }
    },
    "sum_area":{
      "sum":{
        "field":"area"
      }
    }
  }
}

写法二

GET /online_house_achieve/house/_search
{
  "size":0,
  "aggs":{
    "area_stats":{
      "stats":{
        "field":"area"
      }
    }
  }
}

10.去重聚合统计

①概念

area_count 取名,随便定义即可。
使用cardinality即可实现去重。

②代码

GET /online_house_achieve/house/_search
{
  "size":0,
  "aggs":{
    "area_count":{
      "cardinality": {
        "field": "area"
      }
    }
  }
}

11.分组聚合统计

①概念

根据category字段分组,然后求每个分组的area字段的平均值

②代码

GET /online_house_achieve/house/_search
{
  "size": 0,
  "aggs":{
    "group_search":{
      "terms":{
        "field":"category"
      },
      "aggs":{
        "avg_area":{
          "avg":{
            "field":"area"
          }
        }
      }
    }
  }
}

12.分组聚合统计之取Top N

①概念

使用top_hits可以对分组后的结果,取前N条数据。

②代码

GET /online_house_achieve/house/_search
{
  "size": 0,
  "aggs":{
    "group_search":{
      "terms":{
        "field":"category"
      },
      "aggs":{
        "top_area_hits":{
          "top_hits":{
            "sort":[
              {
                "area":{
                  "order":"desc"
                }
              }
            ],
            "_source":{
              "includes":["area","id","category"]
            },
            "size": 3
          }
        }
      }
    }
  }
}

13.百分位聚合统计

①概念

百分位数(percentiles):统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。

举个栗子~

今年是单位体检的日子,所有人到体检中心来测身高。
单位一共100个人,所有人的身高都在 163cm-190cm 之间。同事 A 的身高值是180cm处于百分位70%。也就是说第70百分位数为180cm。
那么我们就可以理解,同事 A 的身高比公司中70%的人都高,比其他30%的人要矮。

②代码

这里默认展示1%、5%、25%、50%、75%、95%、99%对应的具体数值

GET /online_house_achieve/house/_search
{
  "size":0,
  "aggs":{
    "area_percentiles":{
      "percentiles":{
        "field": "area",
        "keyed": false
      }
    }
  }
}

当然,如果不想用系统默认的百分位,也可以自己指定~
指定值去查百分位占比

GET /online_house_achieve/house/_search
{
  "size": 0,
  "aggs":{
    "area_percentiles":{
      "percentile_ranks":{
        "field": "area",
        "values": [22, 50, 73],
        "keyed": false
      }
    }
  }
}

指定百分位占比去查对应值
这里也相当于是在查中位数

GET /online_house_achieve/house/_search
{
  "size":0,
  "aggs":{
    "area_percentiles":{
      "percentiles":{
        "field":"area",
        "percents":[50],
        "keyed":false
      }
    }
  }
}

三、SpringBoot上操作

以下在SpringBoot操作的代码都是根据上面的Kibana操作的代码转换而来

1.直方图聚合统计

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 HistogramAggregationBuilder aggregationBuilder = AggregationBuilders
          .histogram("test_histogram")
          .field("area")
          .interval(5);
 searchSourceBuilder.aggregation(aggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedHistogram parsedHistogram = aggregations.get("test_histogram");
 parsedHistogram.getBuckets().forEach(bucket -> {
     logger.info("key: {}", bucket.getKey()); //阶梯值
     logger.info("count: {}", bucket.getDocCount()); //获取总数
 });

2.强制直方图聚合统计范围

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 HistogramAggregationBuilder aggregationBuilder = AggregationBuilders
          .histogram("test_histogram")
          .field("area")
          .interval(5)
          .extendedBounds(0, 10);
 searchSourceBuilder.aggregation(aggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedHistogram parsedHistogram = aggregations.get("test_histogram");
 parsedHistogram.getBuckets().forEach(bucket -> {
     logger.info("key: {}", bucket.getKey()); //阶梯值
     logger.info("count: {}", bucket.getDocCount()); //获取总数
 });

3.直方图聚合统计排序

根据统计后的key值降序排序

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HistogramAggregationBuilder aggregationBuilder = AggregationBuilders
        .histogram("test_histogram")
        .field("area")
        .interval(5)
        .order(BucketOrder.aggregation("_key", false));
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedHistogram parsedHistogram = aggregations.get("test_histogram");
parsedHistogram.getBuckets().forEach(bucket -> {
    logger.info("key: {}", bucket.getKey()); //阶梯值
    logger.info("count: {}", bucket.getDocCount()); //获取总数
});

根据统计后的count值降序排序

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HistogramAggregationBuilder aggregationBuilder = AggregationBuilders
        .histogram("test_histogram")
        .field("area")
        .interval(5)
        .order(BucketOrder.aggregation("_count", false));
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedHistogram parsedHistogram = aggregations.get("test_histogram");
parsedHistogram.getBuckets().forEach(bucket -> {
    logger.info("key: {}", bucket.getKey()); //阶梯值
    logger.info("count: {}", bucket.getDocCount()); //获取总数
});

4.直方图聚合统计偏移

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HistogramAggregationBuilder aggregationBuilder = AggregationBuilders
        .histogram("test_histogram")
        .field("area")
        .interval(5)
        .offset(3);
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedHistogram parsedHistogram = aggregations.get("test_histogram");
parsedHistogram.getBuckets().forEach(bucket -> {
    logger.info("key: {}", bucket.getKey()); //阶梯值
    logger.info("count: {}", bucket.getDocCount()); //获取总数
});

5.日期直方图聚合统计

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
DateHistogramAggregationBuilder dateHistogramAggregationBuilder = AggregationBuilders
        .dateHistogram("test_date_histogram")
        .field("updateTime")
        .dateHistogramInterval(DateHistogramInterval.MONTH)
        .format("yyyy-MM-dd HH:mm:ss");
searchSourceBuilder.aggregation(dateHistogramAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedDateHistogram parsedDateHistogram = aggregations.get("test_date_histogram");
parsedDateHistogram.getBuckets().forEach(bucket -> {
    logger.info("keyString: {}", bucket.getKeyAsString()); //字符串阶梯值
    logger.info("key: {}", bucket.getKey()); //阶梯值
    logger.info("count: {}", bucket.getDocCount()); //获取总数
});

6.日期范围聚合统计

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 DateRangeAggregationBuilder dateRangeAggregationBuilder = AggregationBuilders
         .dateRange("test_date_range")
         .field("updateTime")
         .format("yyyy-MM-dd")
         .timeZone(DateTimeZone.forOffsetHours(8))
         .addRange("now-2M/M", "now-1M");
 searchSourceBuilder.aggregation(dateRangeAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedRange parsedRange = aggregations.get("test_date_range");
 parsedRange.getBuckets().forEach(bucket -> {
     logger.info("key: {}", bucket.getKey());
     logger.info("fromString: {}", bucket.getFromAsString());
     logger.info("toString: {}", bucket.getToAsString());
     logger.info("count: {}", bucket.getDocCount());
 });

7.过滤、多重过滤直方图聚合统计

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
FilterAggregationBuilder filterAggregationBuilder = AggregationBuilders
        .filter("test_filter", QueryBuilders.rangeQuery("money").gte(2500));
HistogramAggregationBuilder histogramAggregationBuilder = AggregationBuilders
        .histogram("test_histogram")
        .field("area")
        .interval(10);
filterAggregationBuilder.subAggregation(histogramAggregationBuilder);
searchSourceBuilder.aggregation(filterAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedFilter parsedFilter = aggregations.get("test_filter");
logger.info("过滤总数:{}", parsedFilter.getDocCount());
ParsedHistogram parsedHistogram = parsedFilter.getAggregations().get("test_histogram");
parsedHistogram.getBuckets().forEach(bucket -> {
    logger.info("key: {}", bucket.getKey()); //阶梯值
    logger.info("count: {}", bucket.getDocCount()); //获取总数
});

多重过滤

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

FiltersAggregationBuilder filtersAggregationBuilder = AggregationBuilders
        .filters("test_filter",
                QueryBuilders.rangeQuery("money").gte(2800),
                QueryBuilders.rangeQuery("id").lte(5));
HistogramAggregationBuilder histogramAggregationBuilder = AggregationBuilders
        .histogram("test_histogram")
        .field("area")
        .interval(10);
filtersAggregationBuilder.subAggregation(histogramAggregationBuilder);
searchSourceBuilder.aggregation(filtersAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedFilters parsedFilters = aggregations.get("test_filter");
parsedFilters.getBuckets().forEach(bucket -> {
    if("0".equals(bucket.getKey())) {
        logger.info("第一个过滤聚合后的结果...");
        ParsedHistogram parsedHistogram = bucket.getAggregations().get("test_histogram");
        parsedHistogram.getBuckets().forEach(e -> {
            logger.info("key:{}", e.getKey()); //阶梯值
            logger.info("count:{}", e.getDocCount()); //获取总数
        });
    } else if ("1".equals(bucket.getKey())) {
        logger.info("第二个过滤聚合后的结果...");
        ParsedHistogram parsedHistogram = bucket.getAggregations().get("test_histogram");
        parsedHistogram.getBuckets().forEach(e -> {
            logger.info("key:{}", e.getKey()); //阶梯值
            logger.info("count:{}", e.getDocCount()); //获取总数
        });
    }
});

8.空值聚合统计

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MissingAggregationBuilder missingAggregationBuilder = AggregationBuilders
        .missing("test_missing")
        .field("user.password");
searchSourceBuilder.aggregation(missingAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedMissing parsedMissing = aggregations.get("test_missing");
logger.info("count: {}", parsedMissing.getDocCount()); // 获取总数

9.平均、最大、最小和求和的聚合统计

平均

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_area").field("area");
 searchSourceBuilder.aggregation(avgAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedAvg parsedAvg = aggregations.get("avg_area");
 logger.info("平均值:{}", parsedAvg.getValue());

最大

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("max_area").field("area");
 searchSourceBuilder.aggregation(maxAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedMax parsedMax = aggregations.get("max_area");
 logger.info("最大值:{}", parsedMax.getValue());

最小

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("min_area").field("area");
searchSourceBuilder.aggregation(minAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedMin parsedMin = aggregations.get("min_area");
logger.info("最小值:{}", parsedMin.getValue());

求和

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_area").field("area");
searchSourceBuilder.aggregation(sumAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedSum parsedSum = aggregations.get("sum_area");
logger.info("求和:{}", parsedSum.getValue());

一次性查询最大、最小、平均、求和
写法一

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders
        .max("max_area").field("area");
MinAggregationBuilder minAggregationBuilder = AggregationBuilders
        .min("min_area").field("area");
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders
        .avg("avg_area").field("area");
SumAggregationBuilder sumAggregationBuilder = AggregationBuilders
        .sum("sum_area").field("area");
searchSourceBuilder
        .aggregation(avgAggregationBuilder)
        .aggregation(maxAggregationBuilder)
        .aggregation(minAggregationBuilder)
        .aggregation(sumAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedMax parsedMax = aggregations.get("max_area");
ParsedMin parsedMin = aggregations.get("min_area");
ParsedAvg parsedAvg = aggregations.get("avg_area");
ParsedSum parsedSum = aggregations.get("sum_area");
logger.info("最大值:{}", parsedMax.getValue());
logger.info("最小值:{}", parsedMin.getValue());
logger.info("平均值:{}", parsedAvg.getValue());
logger.info("求和值:{}", parsedSum.getValue());

写法二

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
StatsAggregationBuilder statsAggregationBuilder = AggregationBuilders
        .stats("area_status").field("area");
searchSourceBuilder.aggregation(statsAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedStats parsedStats = aggregations.get("area_status");
logger.info("最大值:{}", parsedStats.getMax());
logger.info("最小值:{}", parsedStats.getMin());
logger.info("平均值:{}", parsedStats.getAvg());
logger.info("求和值:{}", parsedStats.getSum());

10.去重聚合统计

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 CardinalityAggregationBuilder cardinalityAggregationBuilder = AggregationBuilders
         .cardinality("area_count").field("area");
 searchSourceBuilder.aggregation(cardinalityAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedCardinality parsedCardinality = aggregations.get("area_count");
 logger.info("统计个数:{}", parsedCardinality.getValue());

11.分组聚合统计

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders
        .terms("group_search")
        .field("category");
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_area").field("area");
termsAggregationBuilder.subAggregation(avgAggregationBuilder);
searchSourceBuilder.aggregation(termsAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedTerms parsedTerms = aggregations.get("group_search");
parsedTerms.getBuckets().forEach(bucket -> {
    logger.info("分组值:{}", bucket.getKey());
    logger.info("分组包含个数:{}", bucket.getDocCount());
    ParsedAvg parsedAvg = bucket.getAggregations().get("avg_area");
    logger.info("分组后的平均值:{}", parsedAvg.getValue());
});

12.分组聚合统计之取Top N

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders
         .terms("group_search")
         .field("category");
 String[] include = {"area", "id", "category"};
 String[] exclude = {};
 TopHitsAggregationBuilder topHitsAggregationBuilder = AggregationBuilders
         .topHits("top_area_hits")
         .sort("area", SortOrder.DESC)
         .fetchSource(include, exclude);
 termsAggregationBuilder.subAggregation(topHitsAggregationBuilder);
 searchSourceBuilder.aggregation(termsAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedTerms parsedTerms = aggregations.get("group_search");
 parsedTerms.getBuckets().forEach(bucket -> {
     logger.info("分组值:{}", bucket.getKey());
     logger.info("分组包含个数:{}", bucket.getDocCount());
     ParsedTopHits parsedTopHits = bucket.getAggregations().get("top_area_hits");
     SearchHit[] hits = parsedTopHits.getHits().getHits();
     for (SearchHit hit : hits) {
         logger.info("数据:{}", hit.getSourceAsString());
    }
 });

13.百分位聚合统计

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
PercentilesAggregationBuilder percentilesAggregationBuilder = AggregationBuilders
        .percentiles("area_percentiles")
        .field("area")
        .keyed(false);
searchSourceBuilder.aggregation(percentilesAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedPercentiles parsedPercentiles = aggregations.get("area_percentiles");
parsedPercentiles.forEach(e -> {
    logger.info("百分位数:{}", e.getPercent());
    logger.info("对应数值:{}", e.getValue());
});

指定值去查百分位占比

SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
double[] values = {22, 50, 73};
PercentileRanksAggregationBuilder percentileRanksAggregationBuilder = AggregationBuilders
        .percentileRanks("area_percentiles", values)
        .field("area")
        .keyed(false);
searchSourceBuilder.aggregation(percentileRanksAggregationBuilder);
searchSourceBuilder.size(0);
searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = search.getAggregations();
ParsedPercentileRanks parsedPercentileRanks = aggregations.get("area_percentiles");
parsedPercentileRanks.forEach(e -> {
    logger.info("百分位数:{}", e.getPercent());
    logger.info("对应数值:{}", e.getValue());
});

指定百分位占比去查对应值

 SearchRequest searchRequest = new SearchRequest();
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 double[] values = {50};
 PercentilesAggregationBuilder percentilesAggregationBuilder = AggregationBuilders
         .percentiles("area_percentiles")
         .percentiles(values)
         .field("area")
         .keyed(false);
 searchSourceBuilder.aggregation(percentilesAggregationBuilder);
 searchSourceBuilder.size(0);
 searchRequest.indices("online_house_achieve").types("house").source(searchSourceBuilder);
 SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 Aggregations aggregations = search.getAggregations();
 ParsedPercentiles parsedPercentiles = aggregations.get("area_percentiles");
 parsedPercentiles.forEach(e -> {
     logger.info("百分位数:{}", e.getPercent());
     logger.info("对应数值:{}", e.getValue());
 });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这里是杨杨吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值