zoukankan      html  css  js  c++  java
  • 【ElasticSearch】script中进行比较,date类型转为long型

    1.需求

    选出前5条当前响应时间最大的url数据


    2.实现

    用key_id分组url,在内部选出最大taskFinishTime那条数据,根据其responseTime进行排序。


    对buckets数据排序,要求排序字段是个值,不能是聚合。

    所以这里使用scripted_metric统计last_response_time,就可以直接取到值。

    (之前试过根据taskFinishTime排序,选出top hits 1的数据,显示其responseTime。但这种结果中有buckets,没法用作排序字段)


    script中涉及:

    taskFinishTime的是date类型的,取到的doc['taskFinishTime'].value不能直接和long类型的变量state.taskFinishTime作比较。

    所以进行转换Date->Instant->Long,Date转Long语句doc['taskFinishTime'].value.toInstant().toEpochMilli()


    es语句

    GET /aaa/_search
    {
      "size": 0,
      "query": {
        "bool": {
          "filter": {
            "range": {
              "taskFinishTime": {
                "gte": 1630825435000,
                "lte": 1630911835000
              }
            }
          },
          "must": [
            {
              "exists": {
                "field": "result.http_request.responseTime"
              }
            },
            {
              "exists": {
                "field": "result.http_request.statusCode"
              }
            }
          ]
        }
      },
      "aggs": {
        "group_by_url": {
          "terms": {
            "field": "key_id.keyword",
            "size": 10000
          },
          "aggs": {
            "url_nodealias": {
              "top_hits": {
                "size": 1,
                "_source": {
                  "includes": [
                    "nodealias"
                  ]
                }
              }
            },
            "last_response_time": {
              "scripted_metric": {
                "init_script": "state.taskFinishTime = 0L; state.responseTime = 0L;",
                "map_script": "if(doc['taskFinishTime'].value.toInstant().toEpochMilli() > state.taskFinishTime) {state.taskFinishTime = doc['taskFinishTime'].value.toInstant().toEpochMilli(); state.responseTime = doc['result.http_request.responseTime'].value;}",
                "combine_script": "return state",
                "reduce_script": "long finalTaskFinishTime = 0L; double finalResponseTime = 0L; for (a in states){if(finalTaskFinishTime < a.taskFinishTime) {finalTaskFinishTime = a.taskFinishTime; finalResponseTime = a.responseTime;}} return finalResponseTime"
              }
            },
            "bucket_sort_temp": {
              "bucket_sort": {
                "sort": [
                  {
                    "last_response_time.value": {
                      "order": "desc"
                    }
                  }
                ],
                "size": 5
              }
            }
          }
        }
      }
    }
    
  • 相关阅读:
    Java基础-四要素之一《继承》
    Java基础-四要素之一《多态》
    Java基础-四大特性理解(抽象、封装、继承、多态)
    Java基础-父类-子类执行顺序
    Java基础--重写(Overriding,覆盖)-重载(Overloading)
    Java基础-数据类型转换
    Java基础-转义字符
    Java基础-数据类型int,short,char,long,float,double,boolean,byte
    算法-科学计算法
    Java基础-JVM堆与栈
  • 原文地址:https://www.cnblogs.com/musecho/p/15304036.html
Copyright © 2011-2022 走看看