【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就可以对全部数据进行排序了。

posted @ 2021-09-15 17:33  musecho  阅读(1725)  评论(0编辑  收藏  举报