首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ElasticSearch聚合-桶/脚本度量

ElasticSearch聚合-桶/脚本度量
EN

Stack Overflow用户
提问于 2021-12-10 10:26:53
回答 1查看 161关注 0票数 0

我试图为索引中的每个文档计算速率函数速率(val,ts)= v2-v1/t2-t1

我的映射的形式是:{“name”:关键字“,"value":"double",”时间戳“:”整型“}。

因此,举个例子,如果索引中有两个文档:

Doc1:{“名称”:名称1,“值”:5,“时间戳”:2} doc2:{name":name1,"value":10,“时间戳”:3 },

我需要得到结果(ts=3)= (10-5)/(3-2)。

在elasticsearch中有什么方法可以做到吗?

我试图用以下形式编写自己的度量脚本:

代码语言:javascript
复制
GET test1/_search
{
"size":15,
"aggs":{
  "sum_the_hard_way": {
    "scripted_metric": {
      "init_script": {
        "source": "state.values = []; state.timestamps = [];"
      },
      "map_script": {
        "source": "state.values.add(doc['value'].value);state.timestamps.add(doc['timestamp'].value);"
      },
      "combine_script": {
        "source": "def rates = []; for ( int i = 0; i <= state.values.size()-1 ; i++ ) { rate[i+1] = (state.value[i+1]- state.value[i])/(state.timestamp[i+1]- state.timestamp[i]);} return values"
      },
      "reduce_script": {
        "source": "def vals = []; for (a in states) { vals.add(a) } return vals"
      }
    }
  }
}
}

但这不管用,我有

“理由”:"index_out_of_bounds_exception:索引0超出长度界限

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-10 18:50:51

TLDR;

你的代码中有一种类型。我希望我已经修好了。

代码语言:javascript
复制
GET /so_agg_painless/_search
{
  "size":15,
  "aggs":{
    "sum_the_hard_way": {
      "scripted_metric": {
        "init_script": {
          "source": """
            state.values = [];
            state.timestamps = [];
          """
        },
        "map_script": {
          "source": """
            state.values.add(doc['value'].value);
            state.timestamps.add(doc['timestamp'].value);
          """
        },
        "combine_script": {
          "source": """
            def rates = [];
            for ( int i = 0; i <= state.values.size()-2 ; i++ ) {
              def nom = (state.values[i+1]- state.values[i]);
              def denom = (state.timestamps[i+1]- state.timestamps[i]);
              rates.add(nom/denom);
            } 
            return rates
            """
        },
        "reduce_script": {
          "source": """
            def vals = [];
            for (a in states) { 
              vals.add(a) 
            }
            return vals
            """
        }
      }
    }
  }
}

嘿,伙计,你的代码有很多排字,这就是它失败的原因。但是我认为逻辑是完美的,所以对你来说是很好的,所以非常接近。

您需要注意代码中的那些s

也可以在我发布的代码中看到。使用"""。因此,您可以缩进代码,它使它更容易阅读和修复。

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

https://stackoverflow.com/questions/70303030

复制
相关文章

相似问题

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