《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
);
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
其中代码@1:missing(0)表示如果文档中没有取平均值的字段时,则使用该值进行计算,本例中使用0参与计算。
其返回结果如下:
{
“took”:2,
“timed_out”:false,
“_shards”:{
“total”:5,
“successful”:5,
“skipped”:0,
“failed”:0
},
“hits”:{
“total”:39,
“max_score”:0,
“hits”:[
]
},
“aggregations”:{
“avg#avg-aggregation”:{
“value”:1.2820512820512822
}
}
}
Weighted Avg Aggregation 加权平均聚合
加权平均算法,∑(value * weight) / ∑(weight)。
加权平均(weghted_avg)支持的参数列表:
- value
提供值的字段或脚本的配置。例如定义计算哪个字段的平均值,该值支持如下子参数:
- field
用来定义平均值的字段名称。
- missing
用来定义如果匹配到的文档没有avg字段,使用该值来参与计算。
- weight
用来定义权重的对象,其可选属性如下:
- field
定义权重来源的字段。
- missing
如果文档缺失权重来源字段,以该值来代表该文档的权重值。
- format
数值类型格式化。
- value_type
用来指定value的类型,例如ValueType.DATE、ValueType.IP等。
示例如下:
POST /exams/_search
{
“size”: 0,
“aggs” : {
“weighted_grade”: {
“weighted_avg”: {
“value”: {
“field”: “grade”
},
“weight”: {
“field”: “weight” // @2
}
}
}
}
}
从文档中抽取属性为weight的字段的值来当权重值。
其JAVA示例如下:
public static void test_weight_avg_aggregation() {
RestHighLevelClient client = EsClient.getClient();
try {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(“aggregations_index02”);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
WeightedAvgAggregationBuilder avg = AggregationBuilders.weightedAvg(“avg-aggregation”)
.value(
(new MultiValuesSourceFieldConfig.Builder())
.setFieldName(“num”)
.setMissing(0)
.build()
)
.weight(
(new MultiValuesSourceFieldConfig.Builder())
.setFieldName(“num”)
.setMissing(1)
.build()
)
// .valueType(ValueType.LONG)
;
avg.toString();
sourceBuilder.aggregation(avg);
sourceBuilder.size(0);
sourceBuilder.query(
QueryBuilders.termQuery(“sellerId”, 24)
);
searchRequest.source(sourceBuilder);
SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}