elasticsearch分組排序取top N

背景

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章