【ElasticSearch】踩坑 對terms的buckets進行bucket_sort排序


【ElasticSearch】踩坑 對terms的buckets進行bucket_sort排序

1.需求和實現

選出可用性最高的前15個數據展示:

先按照key_id.keyword進行url分組,然后子聚合算出可用性,再用bucket_sort對avail_perc排序,size取15。

然后我覺得反正只要15個,terms的size也取了15。


以下是實現的es語句

GET /aaa/_search
{
  "query": {。。。
  },
  "aggs": {
    "group_by_url": {
      "terms": {
        "field": "key_id.keyword",
        "size": 15
      },
      "aggs": {
        "all_num": {
          "value_count": {
            "field": "_id"
          }
        },
        "not_exceed": {
          "filter": {
            "script": {
              "script": "doc['result_new.http_request_statusCode.isAlert'].value==false && doc['result_new.http_request_responseTime.isAlert'].value==false"
            }
          },
          "aggs": {
            "not_exceed_num": {
              "value_count": {
                "field": "_id"
              }
            }
          }
        },
        "avail_perc": {
          "bucket_script": {
            "buckets_path": {
              "all_num_1": "all_num",
              "not_exceed_thres_num": "not_exceed>not_exceed_num"
            },
            "script": "(params.not_exceed_thres_num / params.all_num_1)*100"
          }
        },
        "bucket_sort_temp": {
          "bucket_sort": {
            "sort": [
              {
                "avail_perc": {
                  "order": "asc"
                }
              }
            ],
            "size": 15
          }
        }
      }
    }
  }
}

2.問題

發現terms的size和bucket_sort的size取15和5的結果不完全相同。


3.原因

我的語句實際上進行了兩次排序,第一次是用terms對默認的doc_count進行排序,第二次才是用bucket_sort對avail_perc排序。所以如果terms的size取的小,在terms排序那里,想要的結果已經被截掉了。


*官網說明:根據terms分組聚合,如果不指定order屬性,默認是按照doc_count降序排列的

The order of the buckets can be customized by setting the order parameter. By default, the buckets are ordered by their doc_count descending.


4.解決

terms的size取值大一點,盡可能使terms的默認排序 對bucket_sort的排序 不產生影響。

比如我這里,url的數量最多有10000個,terms的size取值要>=10000,就能夠不截斷任何url。那么bucket_sort就可以對全部數據進行排序了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM