12、ES实战:度量聚合之一

度量聚合从文档中提取出来的值并进行计算。这些值通常从文档中的字段(使用数据字段)中提取出来,单也可以使用脚本进行计算。
数字型度量聚合是一种特殊类型的度量聚合,输出数字型的值。聚合输出一个数字指标(例如平均值聚合)称之为单值数字型度量聚合,产生多个指标值(例如统计聚合)称之为多值数字型度量聚合。当这些聚合直接作为一些分组聚合的子聚合时,单值和多值数字型度量聚合的内容就会发挥巨大的作用。例如分组聚合可以对度量聚合后的返回的值进行排序。

1、 最小值聚合;
2、 最大值聚合;
3、 平均值聚合;
4、 和聚合;
5、 值计数聚合;
6、 统计聚合;

1、最小值聚合

最小值聚合一个单值度量聚合,它跟踪并返回从聚合文档中提取的数值之间的最小值。这些值可以从文档中的特定数值字段中提取,也可以由提供的脚本生成。
Note:最小和最大聚合操作数据的双重表示。因此,当其绝对值大于2*53时,其结果可能是近似的。
计算所有文档的最小价格值:

POST /sales/_search?size=0
{
   
     
    "aggs" : {
   
     
        "min_price" : {
   
      "min" : {
   
      "field" : "price" } }
    }
}

返回值:

{
   
     
    ...

    "aggregations": {
   
     
        "min_price": {
   
     "value": 10.0}           //聚合返回的名称
    }
}

可以看出,聚合的名称(min_price以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.min.Min;

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

MinAggregationBuilder aggregation = AggregationBuilders
                .min("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

Min agg = response.getAggregations().get("agg");
double value = agg.getValue();

2、最大值聚合

最大值一个单值度量聚合,它跟踪并返回从聚合文档中提取的数值之间的最大值。这些值可以从文档中的特定数值字段中提取,也可以由提供的脚本生成。
Note:最小和最大聚合操作数据的双重表示。因此,当其绝对值大于2*53时,其结果可能是近似的。
计算所有文档的最大价格值:

POST /sales/_search?size=0
{
   
     
    "aggs" : {
   
     
        "max_price" : {
   
      "max" : {
   
      "field" : "price" } }
    }
}

返回值:

{
   
     
    ...
    "aggregations": {
   
     
        "max_price": {
   
     "value": 200.0}         //聚合返回的名称
    }
}

可以看出,聚合的名称(max_price以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.max.Max;

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

MaxAggregationBuilder aggregation = AggregationBuilders
                .max("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

Max agg = response.getAggregations().get("agg");
double value = agg.getValue();

3、平均值聚合

统计聚合是计算汇总文档中提取的数值平均值的单个值度量汇总。这些值可以从文档中的特定数值字段中提取,也可以由提供的脚本生成。
假设数据由代表考试成绩的文件组成(学生在0到100之间),我们可以用分数来表示他们的分数:

POST /exams/_search?size=0
{
   
     
    "aggs" : {
   
     
        "avg_grade" : {
   
      "avg" : {
   
      "field" : "grade" } }
    }
}

以上聚合计算所有文档的平均级别。聚合类型为AVG,字段设置定义文档的数值字段,平均值将计算在。以上将返回以下内容:

{
   
     
    ...
    "aggregations": {
   
     
        "avg_grade": {
   
     "value": 75.0}
    }
}

可以看出,聚合的名称(avg_grade以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.avg.Avg;

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

AvgAggregationBuilder aggregation = AggregationBuilders
                .avg("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

Avg agg = response.getAggregations().get("agg");
double value = agg.getValue();

4、和聚合

和聚合是汇总汇总文档中提取的数值的单值度量汇总。这些值可以从文档中的特定数值字段中提取,也可以由提供的脚本生成。
假设数据由代表销售记录的文件组成,我们可以将所有帽子的销售价格与:

POST /sales/_search?size=0
{
   
     
    "query" : {
   
     
        "constant_score" : {
   
     
            "filter" : {
   
     
                "match" : {
   
      "type" : "hat" }
            }
        }
    },
    "aggs" : {
   
     
        "hat_prices" : {
   
      "sum" : {
   
      "field" : "price" } }
    }
}

返回值:

{
   
     
    ...
    "aggregations": {
   
     
        "hat_prices": {
   
     "value": 450.0}
    }
}

可以看出,聚合的名称(intraday_return以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.sum.Sum;

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

SumAggregationBuilder aggregation = AggregationBuilders
                .sum("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

Sum agg = response.getAggregations().get("agg");
double value = agg.getValue();

5、值计数聚合

值计数聚合是一个单值度量聚合,它计算从聚合文档中提取的值的数量。这些值可以从文档中的特定字段中提取,也可以由提供的脚本生成。通常情况下,这个集合将用于与其他单值聚集一起。
例如,在计算AVG时,可能会对平均值的计算数感兴趣。

POST /sales/_search?size=0
{
   
     
    "aggs" : {
   
     
        "types_count" : {
   
      "value_count" : {
   
      "field" : "type" } }
    }
}

返回值:

{
   
     
    ...
    "aggregations": {
   
     
        "types_count": {
   
     "value": 7}
    }
}

可以看出,聚合的名称(types_count以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount;

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

ValueCountAggregationBuilder aggregation = AggregationBuilders
                .count("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

ValueCount agg = response.getAggregations().get("agg");
long value = agg.getValue();

5、统计聚合

统计聚合一个多值度量聚合,对聚合文档中提起的数字型计算进行统计。这些值可以从文档中的特定字段中提取,也可以由提供的脚本生成。通常情况下,这个集合将用于与其他单值聚集一起。
例如,在计算AVG时,可能会对平均值的计算数感兴趣。

POST /sales/_search?size=0
{
   
     
    "aggs" : {
   
     
        "grades_stats" : {
   
      "stats" : {
   
      "field" : "grade" } }
    }
}

以上聚合计算所有文档的等级统计信息。聚合类型是统计数据,字段设置定义了统计数据将被计算的文档的数值字段。以上将返回以下内容:

{
   
     
    ...

    "aggregations": {
   
     
        "grades_stats": {
   
     
            "count": 2,
            "min": 50.0,
            "max": 100.0,
            "avg": 75.0,
            "sum": 150.0
        }
    }
}

可以看出,聚合的名称(grades_stats以上)也作为关键字在响应的结果中返回。
Java API调用
导入聚合定义类:

import org.elasticsearch.search.aggregations.metrics.stats.Stats;

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

StatsAggregationBuilder aggregation = AggregationBuilders
                .stats("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
				.setTypes(typeName);
srb.addAggregation(aggregation);
			
SearchResponse response =  srb.execute().actionGet();

// sr is here your SearchResponse object
Stats agg = response.getAggregations().get("agg");
double min = agg.getMin();
double max = agg.getMax();
double avg = agg.getAvg();
double sum = agg.getSum();
long count = agg.getCount();

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: