背景
比如有一張通話記錄表,裏面有用戶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個桶
}
}
}
}
}
}