Aggregations - Metrics aggregations

优质
小牛编辑
135浏览
2023-12-01

Metrics aggregations

计算度量这类的聚合操作是以使用一种方式或者从文档中提取需要聚合的值为基础的。这些数据不但可以从文档(使用数据属性)的属性中提取出来,也可以使用脚本生成。

数值计量聚合操作是能够产生具体的数值的一种计量聚合操作。一些聚合操作输出单个的计量数值(例如avg),并且被称作single-value numeric metric aggregation,其他产生多个计量数值(例如 stats)的称作 multi-value numeric metrics aggregation。这两种不同的聚合操作只有在桶聚合的子聚合操作中才会有不同的表现(有些桶聚合可以基于每个的数值计量来对返回的桶进行排序)。

Min Aggregatione 最小值聚合

下面是如何用Java API 使用最小值聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. MinAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .min("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.min.Min;
  1. // sr is here your SearchResponse object
  2. Min agg = sr.getAggregations().get("agg");
  3. double value = agg.getValue();

Max Aggregation 最大值聚合

下面是如何用Java API 使用最大值聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. MaxAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .max("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.max.Max;
  1. // sr is here your SearchResponse object
  2. Max agg = sr.getAggregations().get("agg");
  3. double value = agg.getValue();

Sum Aggregation 求和聚合

下面是如何用Java API 使用求和聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. SumAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .sum("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.sum.Sum;
  1. // sr is here your SearchResponse object
  2. Sum agg = sr.getAggregations().get("agg");
  3. double value = agg.getValue();

Avg Aggregation 平均值聚合

下面是如何用Java API 使用平均值聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. AvgAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .avg("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.avg.Avg;
  1. // sr is here your SearchResponse object
  2. Avg agg = sr.getAggregations().get("agg");
  3. double value = agg.getValue();

Stats Aggregation 统计聚合

统计聚合——基于文档的某个值,计算出一些统计信息(min、max、sum、count、avg), 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。

下面是如何用Java API 使用统计聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. StatsAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .stats("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.stats.Stats;
  1. // sr is here your SearchResponse object
  2. Stats agg = sr.getAggregations().get("agg");
  3. double min = agg.getMin();
  4. double max = agg.getMax();
  5. double avg = agg.getAvg();
  6. double sum = agg.getSum();
  7. long count = agg.getCount();

Extended Stats Aggregation 扩展统计聚合

扩展统计聚合——基于文档的某个值,计算出一些统计信息(比普通的stats聚合多了sum_of_squares、variance、std_deviation、std_deviation_bounds), 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。

下面是如何用Java API 使用扩展统计聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. ExtendedStatsAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .extendedStats("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
  1. // sr is here your SearchResponse object
  2. ExtendedStats agg = sr.getAggregations().get("agg");
  3. double min = agg.getMin();
  4. double max = agg.getMax();
  5. double avg = agg.getAvg();
  6. double sum = agg.getSum();
  7. long count = agg.getCount();
  8. double stdDeviation = agg.getStdDeviation();
  9. double sumOfSquares = agg.getSumOfSquares();
  10. double variance = agg.getVariance();

Value Count Aggregation 值计数聚合

值计数聚合——计算聚合文档中某个值的个数, 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。

该聚合一般域其它 single-value 聚合联合使用,比如在计算一个字段的平均值的时候,可能还会关注这个平均值是由多少个值计算而来。

下面是如何用Java API 使用值计数聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. ValueCountAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .count("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount;
  1. // sr is here your SearchResponse object
  2. ValueCount agg = sr.getAggregations().get("agg");
  3. long value = agg.getValue();

Percentile Aggregation 百分百聚合

百分百聚合——基于聚合文档中某个数值类型的值,求这些值中的一个或者多个百分比, 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。

下面是如何用Java API 使用百分百聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. PercentilesAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .percentiles("agg")
  4. .field("height");

可以提供百分位数,而不是使用默认值:

  1. PercentilesAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .percentiles("agg")
  4. .field("height")
  5. .percentiles(1.0, 5.0, 10.0, 20.0, 30.0, 75.0, 95.0, 99.0);
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
  2. import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
  1. // sr is here your SearchResponse object
  2. Percentiles agg = sr.getAggregations().get("agg");
  3. // For each entry
  4. for (Percentile entry : agg) {
  5. double percent = entry.getPercent(); // Percent
  6. double value = entry.getValue(); // Value
  7. logger.info("percent [{}], value [{}]", percent, value);
  8. }

大概输出:

  1. percent [1.0], value [0.814338896154595]
  2. percent [5.0], value [0.8761912455821302]
  3. percent [25.0], value [1.173346540141847]
  4. percent [50.0], value [1.5432023318692198]
  5. percent [75.0], value [1.923915462033674]
  6. percent [95.0], value [2.2273644908535335]
  7. percent [99.0], value [2.284989339108279]

Percentile Ranks Aggregation 百分比等级聚合

一个multi-value指标聚合,它通过从聚合文档中提取数值来计算一个或多个百分比。这些值可以从特定数值字段中提取,也可以由提供的脚本生成。

注意:请参考百分比(通常)近视值(percentiles are (usually approximate))和压缩(Compression)以获得关于近视值的建议和内存使用的百分比排位聚合。百分比排位展示那些在某一值之下的观测值的百分比。例如,假如某一直大于等于被观测值的95%,则称其为第95百分位数。假设你的数据由网页加载时间组成。你可能有一个服务协议,95%页面需要在15ms加载完全,99%页面在30ms加载完全。

下面是如何用Java API 使用百分比等级聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. PercentilesAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .percentiles("agg")
  4. .field("height");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
  2. import org.elasticsearch.search.aggregations.metrics.percentiles.PercentileRanks;
  1. // sr is here your SearchResponse object
  2. PercentileRanks agg = sr.getAggregations().get("agg");
  3. // For each entry
  4. for (Percentile entry : agg) {
  5. double percent = entry.getPercent(); // Percent
  6. double value = entry.getValue(); // Value
  7. logger.info("percent [{}], value [{}]", percent, value);
  8. }

大概输出:

  1. percent [29.664353095090945], value [1.24]
  2. percent [73.9335313461868], value [1.91]
  3. percent [94.40095147327283], value [2.22]

Cardinality Aggregation 基数聚合

基于文档的某个值,计算文档非重复的个数(去重计数)。。这些值可以从特定数值字段中提取,也可以由提供的脚本生成。

下面是如何用Java API 使用基数聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. CardinalityAggregationBuilder aggregation =
  2. AggregationBuilders
  3. .cardinality("agg")
  4. .field("tags");
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.cardinality.Cardinality;
  1. // sr is here your SearchResponse object
  2. Cardinality agg = sr.getAggregations().get("agg");
  3. long value = agg.getValue();

Geo Bounds Aggregation 地理边界聚合

地理边界聚合——基于文档的某个字段(geo-point类型字段),计算出该字段所有地理坐标点的边界(左上角/右下角坐标点)。

下面是如何用Java API 使用地理边界聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. GeoBoundsBuilder aggregation =
  2. GeoBoundsAggregationBuilder
  3. .geoBounds("agg")
  4. .field("address.location")
  5. .wrapLongitude(true);
使用聚合请求
  1. import org.elasticsearch.search.aggregations.metrics.geobounds.GeoBounds;
  1. // sr is here your SearchResponse object
  2. GeoBounds agg = sr.getAggregations().get("agg");
  3. GeoPoint bottomRight = agg.bottomRight();
  4. GeoPoint topLeft = agg.topLeft();
  5. logger.info("bottomRight {}, topLeft {}", bottomRight, topLeft);

大概会输出:

  1. bottomRight [40.70500764381921, 13.952946866893775], topLeft [53.49603022435221, -4.190029308156676]

Top Hits Aggregation 最高匹配权值聚合

最高匹配权值聚合——跟踪聚合中相关性最高的文档。该聚合一般用做 sub-aggregation,以此来聚合每个桶中的最高匹配的文档。

下面是如何用Java API 使用最高匹配权值聚合

准备聚合请求

下面是如何创建聚合请求的是示例:

  1. AggregationBuilder aggregation =
  2. AggregationBuilders
  3. .terms("agg").field("gender")
  4. .subAggregation(
  5. AggregationBuilders.topHits("top")
  6. );

大多数标准的搜索选项可以使用,比如:from, size, sort, highlight, explain

  1. AggregationBuilder aggregation =
  2. AggregationBuilders
  3. .terms("agg").field("gender")
  4. .subAggregation(
  5. AggregationBuilders.topHits("top")
  6. .explain(true)
  7. .size(1)
  8. .from(10)
  9. );
使用聚合请求
  1. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  2. import org.elasticsearch.search.aggregations.metrics.tophits.TopHits;
  1. // sr is here your SearchResponse object
  2. Terms agg = sr.getAggregations().get("agg");
  3. // For each entry
  4. for (Terms.Bucket entry : agg.getBuckets()) {
  5. String key = entry.getKey(); // bucket key
  6. long docCount = entry.getDocCount(); // Doc count
  7. logger.info("key [{}], doc_count [{}]", key, docCount);
  8. // We ask for top_hits for each bucket
  9. TopHits topHits = entry.getAggregations().get("top");
  10. for (SearchHit hit : topHits.getHits().getHits()) {
  11. logger.info(" -> id [{}], _source [{}]", hit.getId(), hit.getSourceAsString());
  12. }
  13. }

大概会输出:

  1. key [male], doc_count [5107]
  2. -> id [AUnzSZze9k7PKXtq04x2], _source [{"gender":"male",...}]
  3. -> id [AUnzSZzj9k7PKXtq04x4], _source [{"gender":"male",...}]
  4. -> id [AUnzSZzl9k7PKXtq04x5], _source [{"gender":"male",...}]
  5. key [female], doc_count [4893]
  6. -> id [AUnzSZzM9k7PKXtq04xy], _source [{"gender":"female",...}]
  7. -> id [AUnzSZzp9k7PKXtq04x8], _source [{"gender":"female",...}]
  8. -> id [AUnzSZ0W9k7PKXtq04yS], _source [{"gender":"female",...}]

Scripted Metric Aggregation

此功能为实验性的,不建议生产使用,所以也不做过多说明 有兴趣可以自己参考 官方文档