zoukankan      html  css  js  c++  java
  • 【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就可以对全部数据进行排序了。

  • 相关阅读:
    架构阅读笔记9
    架构阅读笔记8
    架构阅读笔记7
    架构阅读笔记6
    架构阅读笔记5
    git安装使用详解
    mysql主从
    人定胜天
    jquery即点击改
    无限极分类/数组处理
  • 原文地址:https://www.cnblogs.com/musecho/p/15273253.html
Copyright © 2011-2022 走看看