Elasticsearch 7.3.0 翻译 - 《Aggregations》 度量聚合 加权平均聚合

加权平均聚合

单值度量聚合,计算从聚合文档中提取的数值的加权平均值。这些值可以从文档中的特定数字字段中提取。

计算常规平均值时,每个数据点都有一个相等的“权重”……,它对最终值的贡献相等。另一方面,加权平均值对每个数据点的权重不同。每个数据点贡献给最终值的量从文档中提取,或由脚本提供。

加权平均数公式:∑(value * weight) / ∑(weight)

一般的平均值可以看作是加权平均值,其中每个值的隐式权重为1。

 

Table 4. weighted_avg Parameters(加权平均参数)

Parameter NameDescriptionRequiredDefault Value

value

提供值的字段或脚本的配置

Required

 

weight

提供权重的字段或脚本的配置

Required

 

format

数字响应格式化程序

Optional

 

value_type

纯脚本或未映射字段的值提示

Optional

 

 

值和权重对象具有每个字段特定的配置:

Table 5. value Parameters (value 参数)

Parameter NameDescriptionRequiredDefault Value

field

应从中提取值的字段

Required

 

missing

缺省值

Optional

 

Table 6. weight Parameters (权重 参数)

 

Parameter NameDescriptionRequiredDefault Value

field

应从中提取权重的字段

Required

 

missing

缺省值

Optional

 

示例

如果我们的文档中的“grade”字段包含0-100个数字分数,而“weight”字段包含任意数字权重,则可以使用以下方法计算加权平均值:

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                },
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}

响应如下:

{
    ...
    "aggregations": {
        "weighted_grade": {
            "value": 70.0
        }
    }
}

虽然每个字段允许多个值,但只允许一个权重。如果聚合遇到具有多个权重的文档(例如,权重字段是多值字段),它将引发异常。如果出现这种情况,则需要为“权重”字段指定一个脚本,并使用该脚本将多个值组合成要使用的单个值。

此单个权重将独立应用于从值字段中提取的每个值。

此示例演示如何使用单个权重平均具有多个值的单个文档:

POST /exams/_doc?refresh
{
    "grade": [1, 2, 3],
    "weight": 2
}

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                },
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}

三个值(1、2和3)将作为独立值包括在内,所有值的权重均为2:

{
    ...
    "aggregations": {
        "weighted_grade": {
            "value": 2.0
        }
    }
}

聚合结果返回2.0,这与我们手工计算时预期的结果相匹配:((1*2) + (2*2) + (3*2)) / (2+2+2) == 2

脚本

值和权重都可以从脚本而不是字段派生。作为一个简单的例子,下面将使用脚本向文档中的等级和权重添加一个:

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "script": "doc.grade.value + 1"
                },
                "weight": {
                    "script": "doc.weight.value + 1"
                }
            }
        }
    }
}

缺省值

缺少参数定义如何处理缺少值的文档。默认行为对于值和权重是不同的:

默认情况下,如果缺少值字段,则忽略该文档,并将聚合移到下一个文档。如果缺少“权重”字段,则假定其权重为1(类似于正常平均值)。

这两个默认值都可以用缺少的参数覆盖:

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade",
                    "missing": 2
                },
                "weight": {
                    "field": "weight",
                    "missing": 3
                }
            }
        }
    }
}

开心每一天,感兴趣的可以加博主微信V:ao610389 (需备注:sone_thor_es) 

好的,以下是一个简单的ElasticSearch聚合的Java API示例: ```java import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.sum.Sum; import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount; import static org.elasticsearch.index.query.QueryBuilders.rangeQuery; public class ElasticSearchAggregationExample { public static void main(String[] args) { // 创建ElasticSearch客户端 Client client = // ...; // 构建查询条件 QueryBuilder query = QueryBuilders.boolQuery() .must(rangeQuery("timestamp").gte("2022-01-01T00:00:00").lte("2022-01-31T23:59:59")); // 构建聚合条件 AggregationBuilder aggregation = AggregationBuilders .dateHistogram("sales_over_time") .field("timestamp") .dateHistogramInterval(DateHistogramInterval.DAY) .subAggregation( AggregationBuilders .terms("product_types") .field("product_type") .subAggregation( AggregationBuilders.sum("total_sales").field("sales"), AggregationBuilders.count("transaction_count").field("transaction_id") ) ); // 执行查询 SearchResponse response = client.prepareSearch("my_index") .setQuery(query) .addAggregation(aggregation) .execute() .actionGet(); // 解析聚合结果 Histogram histogram = response.getAggregations().get("sales_over_time"); for (Histogram.Bucket bucket : histogram.getBuckets()) { System.out.println("Date: " + bucket.getKeyAsString()); Terms productTypes = bucket.getAggregations().get("product_types"); for (Terms.Bucket productType : productTypes.getBuckets()) { System.out.println("Product Type: " + productType.getKeyAsString()); Sum totalSales = productType.getAggregations().get("total_sales"); System.out.println("Total Sales: " + totalSales.getValue()); ValueCount transactionCount = productType.getAggregations().get("transaction_count"); System.out.println("Transaction Count: " + transactionCount.getValue()); } } // 关闭客户端 client.close(); } } ``` 这个示例通过ElasticSearch的Java API执行了一个聚合,其中包含了两层嵌套聚合,分别按照日期和产品类型对销售数据进行了汇总,输出了每个日期和产品类型的销售总额和交易次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值