ElasticSearch 聚合结果排序

ElasticSearch 聚合结果排序

简单的指标聚合结果并根据聚合结果排序如下

以接口id聚合,以平均响应时间排序

{
  "size": 0,
  "aggs": {
    "api": {
      "terms": {
        "field": "api.id",
        "order": {
          "reponseTime": "asc"
        },
        "size": 10
      },
      "aggs": {
        "reponseTime": {
          "sum": {
            "field": "response.time"
          }
        },
        "requestTime": {
          "sum": {
            "field": "requestTime.time"
          }
        },
        "complexTime": {
          "bucket_script": {
            "buckets_path": {
              "requestTime": "requestTime",
              "reponseTime": "reponseTime"
            },
            "script": "params.requestTime / params.reponseTime"
          }
        }
      }
    }
  }
}

复杂的指标聚合结果计算后再根据计算结果进行排序如下

想当然写法,其实不行,会报以下错误
The provided aggregation [complexTime] either does not exist, or is a pipeline aggregation and cannot be used to sort the buckets.

{
  "size": 0,
  "aggs": {
    "api": {
      "terms": {
        "field": "api.id",
        "order": {
          "complexTime": "asc"
        },
        "size": 10
      },
      "aggs": {
        "reponseTime": {
          "sum": {
            "field": "response.time"
          }
        },
        "requestTime": {
          "sum": {
            "field": "requestTime.time"
          }
        },
        "complexTime": {
          "bucket_script": {
            "buckets_path": {
              "requestTime": "requestTime",
              "reponseTime": "reponseTime"
            },
            "script": "params.requestTime / params.reponseTime"
          }
        }
      }
    }
  }
}

参考以下页面得到,解决方案
https://github.com/elastic/elasticsearch/issues/8486
https://github.com/elastic/elasticsearch/issues/32153

{
  "size": 0,
  "aggs": {
    "api": {
      "terms": {
        "field": "api.id"
      },
      "aggs": {
        "reponseTime": {
          "sum": {
            "field": "response.time"
          }
        },
        "requestTime": {
          "sum": {
            "field": "requestTime.time"
          }
        },
        "complexTime": {
          "bucket_script": {
            "buckets_path": {
              "requestTime": "requestTime",
              "reponseTime": "reponseTime"
            },
            "script": "params.requestTime / params.reponseTime"
          }
        },
        "sort": {
          "bucket_sort": {
            "sort": [
              {
                "complexTime": {
                  "order": "asc"
                },
                "requestTime.total": {
                  "order": "asc"
                }
              }
            ],
            "size": 10
          }
        }
      }
    }
  }
}
posted @ 2023-01-30 16:00  临渊不羡渔  阅读(292)  评论(0编辑  收藏  举报