大佬教程收集整理的这篇文章主要介绍了分组依据的 Elasticsearch 聚合,然后获取最大日期的字段平均值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在 Elasticsearch 中构建一个查询:
a) 按字段分组(即 department_name
)
b) 获取最大日期的文档(即 record_date
)
C) 计算剩余文档的字段的平均值(即risk_index_value
)。
我设法构建了下面的查询,以防我的描述没有帮助:
{
"size":0,"query" : {
"match": {
"record_date": "2021-04-08"
}
},"aggs":{
"assets":{
"terms":{
"fIEld":"department_name","size":10000
},"aggs":{
"risk_avg":{
"avg":{
"fIEld":"risk_index_value"
}
}
}
}
}
}
这个查询在业务逻辑方面完全符合我的要求,但我需要以某种方式始终获取最大日期而不为其提供值。有没有办法做到这一点?我需要使用 REST 高级弹性客户端来执行此操作,但即使是原始查询也会非常有帮助。提前致谢!
编辑:我将添加一些文档示例,以便我的请求更有意义。
假设我们有 11 个文档:
department_name: A
risk_index_value: 10
record_date: 2021-04-28
department_name: A
risk_index_value: 30
record_date: 2021-04-28
department_name: A
risk_index_value: 20
record_date: 2021-04-28
department_name: A
risk_index_value: 100
record_date: 2021-04-20
department_name: A
risk_index_value: 80
record_date: 2021-04-20
department_name: B
risk_index_value: 240
record_date: 2021-04-28
department_name: B
risk_index_value: 220
record_date: 2021-04-28
department_name: B
risk_index_value: 200
record_date: 2021-04-28
department_name: B
risk_index_value: 100
record_date: 2021-04-20
department_name: B
risk_index_value: 90
record_date: 2021-04-20
department_name: C
risk_index_value: 45
record_date: 2021-04-28
因此在下面的数据中,我需要的查询将返回如下内容:
department: A
risk_index_avg: 30
record_date: 2021-04-28
department: B
risk_index_avg: 220
record_date: 2021-04-28
department: C
risk_index_avg: 45
record_date: 2021-04-28
希望这会有所帮助。
我从你的问题中了解到,你想要每个部门最新记录日期的平均风险指数。
"order": { "_key": "desc" }
size = 1
只获得一个最高值。 (这将是最大值)
"aggs": {
"maxKey": {
"terms": {
"field": "<field whose max is required>","size": 1,"order": {
"_key": "desc"
}
}
}
}
我认为,下面是您要查找的查询。
{
"size": 0,"aggs": {
"EachDepartment": {
"terms": {
"field": "department_name","size": 1000
},"aggs": {
"MaxRecordDate": {
"terms": {
"field": "record_date","order": {
"_key": "desc"
}
},"aggs": {
"AvgOfRiskIndex": {
"avg": {
"field": "risk_index_value"
}
}
}
}
}
}
}
}
我尝试使用您提供的示例数据执行此操作并得到以下响应。
{
"aggregations" : {
"EachDepartment" : {
"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [
{
"key" : "A","doc_count" : 5,"MaxRecordDate" : {
"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 2,"buckets" : [
{
"key" : 1619568000000,"key_as_String" : "2021-04-28 00:00:00","doc_count" : 3,"AvgOfRiskIndex" : {
"value" : 20.0
}
}
]
}
},{
"key" : "B","AvgOfRiskIndex" : {
"value" : 220.0
}
}
]
}
},{
"key" : "C","doc_count" : 1,"AvgOfRiskIndex" : {
"value" : 45.0
}
}
]
}
}
]
}
}
}
我希望这能回答您的问题。
编辑:添加了 RestHighLevelClient 代码以创建聚合
AggregationBuilder getAggsBuilder() {
AggregationBuilder departmentAggs = AggregationBuilders.terms("eachDepartments")
.field("department_name")
.size(1000);
AggregationBuilder maxRecordDateAgg = AggregationBuilders.terms("maxRecordDate")
.field("record_date")
.size(1)
.order(BucketOrder.key(false));
AggregationBuilder avgRiskIndexAgg = AggregationBuilders.avg("avgRiskIndex")
.field("risk_index_value");
// add avgRiskIndexAgg to maxRecordDate
maxRecordDateAgg.subAggregation(avgRiskIndexAgg);
//add maxRecordDate to departmentAggs
departmentAggs.subAggregation(maxRecordDateAgg);
return departmentAggs;
}
以上是大佬教程为你收集整理的分组依据的 Elasticsearch 聚合,然后获取最大日期的字段平均值全部内容,希望文章能够帮你解决分组依据的 Elasticsearch 聚合,然后获取最大日期的字段平均值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。