比如有一张通话记录表,里面有用户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个桶 } } } } } }