背景
比如有一张通话记录表,里面有用户UID,电话号number,用户所属国家country,通话时长talktime几个主要字段。现在的需求是要获取平均通话时长最长的top 20个国家。
实现
先过滤掉一些不需要的数据,然后根据country分桶,在桶内求平均通话时长。最后根据每个桶的平均通话时长取top 20的桶。
GET talk-information-2020.04.21/_search
{
"query": {
"bool": {
"must":[
{
"exists":{
"field": "country" //必须存在国家字段
}
}
],
"filter": {
"range": {
"talktime": {
"gte": 1000 //通话时长大于等于1秒
}
}
}
}
},
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country.keyword", //根据国家分桶
"size": 100000 //分桶数量(根据实际数据确定)
},
"aggs": {
"avg_time": {
"avg": {
"field": "talktime" //桶内求平均通话时长
}
},
"country_bucket_sort": {
"bucket_sort": {
"sort": [
{"avg_time": {"order": "desc"}} //根据平均通话时长对桶排序
],
"size": 10 //取前10个桶
}
}
}
}
}
}