首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch:可以处理聚合结果吗?

Elasticsearch:可以处理聚合结果吗?
EN

Stack Overflow用户
提问于 2014-11-18 10:35:14
回答 2查看 4.1K关注 0票数 3

我使用和聚合计算服务进程的持续时间。执行过程的每一步都将保存在调用Id下的Elasticsearch中。

这就是我所监测的:

代码语言:javascript
复制
Duration of Request-Processing for ID #123 (calling service #1)

Duration of Server-Response for ID #123 (calling service #1)

**Complete Duration for ID #123**

Duration of Request-Processing for ID #124 (calling service #1)

Duration of Server-Response for ID #124 (calling service #1)

**Complete duration for ID #124**

过滤器:

代码语言:javascript
复制
{
"from" : 0, "size" :0,

    "query" : {
        "filtered" : {
            "query" : { "match_all" : {}},
            "filter" : {
                "term" : { 
                    "callingId" : "123",
                }
            }
        }
    },
    "aggs" : {
        "total_duration" : { "sum" : { "field" : "duration" } },
        "max_duration":{"max": {"field":"duration"}},   
        "min_duration":{"min":{"field":"duration"}}
        }
    }
    }

这将返回整个过程的持续时间,并告诉我进程的哪一部分是最快的,哪一部分是最慢的。

接下来,我要计算所有已完成进程的平均持续时间( by serviceId )。在这种情况下,我只关心每个服务的总持续时间,所以我可以对它们进行统计。

如何从total_durations创建平均值、最小值和最大值?

编辑:我添加了一些样本数据,我希望你可以使用它。

Call1:

代码语言:javascript
复制
{
"callerId":"U1",
"operation":"Initialize",
"status":"INITIALIZED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U1",
"operation":"Calculate",
"status":"STARTED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U1",
"operation":"Finish",
"status":"FINISHED",
"duration":1200,
"serviceId":"1"
}

sum: 1202

Call2:

代码语言:javascript
复制
{
"callerId":"U2",
"operation":"Initialize",
"status":"INITIALIZED",
"duration":2,
"serviceId":"1"
}

{
"callerId":"U2",
"operation":"Calculate",
"status":"STARTED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U2",
"operation":"Finish",
"status":"FINISHED",
"duration":1030,
"serviceId":"1"
}

sum: 1033

所有服务的聚合-调用服务ID #1 -这是我想要计算的:

代码语言:javascript
复制
Max: 1202
Min: 1033
AVG: 1116
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-19 07:55:18

稍微复杂一点,但这里是这样的(仅在1.4中,因为有这类聚合):

代码语言:javascript
复制
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "serviceId": 1
        }
      }
    }
  },
  "aggs": {
    "executionTimes": {
      "scripted_metric": {
        "init_script": "_agg['values'] = new java.util.HashMap();",
        "map_script": "if (_agg.values[doc['callerId'].value]==null) {_agg.values[doc['callerId'].value]=doc['duration'].value;} else {_agg.values[doc['callerId'].value].add(doc['duration'].value);}",
        "combine_script":"someHashMap = new java.util.HashMap();for(x in _agg.values.keySet()) {value=_agg.values[x]; sum=0; for(y in value) {sum+=y}; someHashMap.put(x,sum)}; return someHashMap;",
        "reduce_script": "finalArray = []; finalMap = new java.util.HashMap(); for(map in _aggs){for(x in map.keySet()){if(finalMap.containsKey(x)){value=finalMap.get(x);finalMap.put(x,value+map.get(x));} else {finalMap.put(x,map.get(x))}}}; finalAvgValue=0; finalMaxValue=-1; finalMinValue=-1; for(key in finalMap.keySet()){currentValue=finalMap.get(key);finalAvgValue+=currentValue; if(finalMinValue<0){finalMinValue=currentValue} else if(finalMinValue>currentValue){finalMinValue=currentValue}; if(currentValue>finalMaxValue) {finalMaxValue=currentValue}}; finalArray.add(finalMaxValue); finalArray.add(finalMinValue); finalArray.add(finalAvgValue/finalMap.size()); return finalArray",
        "lang": "groovy"
      }
    }
  }
}

而且,我不是说这是最好的方法,但只有一个我能找到。而且,我并不是说解决方案的形式是最好的。很可能,它可以被清理和改进。不过,我想证明这是可能的。不过,请记住,它在1.4版中是可用的。

该方法的基本思想是使用脚本来构建一个数据结构,该结构应该包含您需要的信息,根据脚本度量聚合按不同的步骤计算。此外,聚合只对一个serviceId执行。如果您想对所有的serviceIds都这样做,我想您可能需要重新考虑一下脚本中的数据结构。

对于上面的查询和所提供的确切数据,输出如下:

代码语言:javascript
复制
{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 6,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "executionTimes": {
         "value": [
            1202,
            1033,
            "1117.5"
         ]
      }
   }
}

根据value中的脚本,数组reduce_script中值的顺序是max、min、avg。

票数 3
EN

Stack Overflow用户

发布于 2014-11-19 15:08:07

在即将发布的2.0.0版本中将有一个新的特性,称为"Reducers“。还原器将允许您计算集合之上的聚合。

相关职位:https://github.com/elasticsearch/elasticsearch/issues/8110

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26992154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档