弹性无痛“状态”替代方案

k3bvogb1  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(292)

这是我第一次尝试一个无痛的脚本,但是几乎每个例子都使用一个“state”对象,这在我的版本中是不可用的。

"aggs": {
    "terms": {
      "scripted_metric": {
        "init_script": "state.id_map = [:]; state.sum = 0.0;",
        "map_script": """
          def id = doc['record_id.ID'].value;
          if (!state.id_map.containsKey(id)) {
            state.id_map[id] = true;
            state.sum += doc['VAL'].value;
          }
        """,
        "combine_script": """
            def sum = state.sum;
            def stats = [:];
            stats.sum = sum;
            return stats
        """,
        "reduce_script": "return states"
      }
    }
  }

结果:未定义变量[状态]。
省略它也没有帮助。

"init_script": "Map id_map = new HashMap(); double sum = 0.0;",
        "map_script": """
          def id = doc['record_id.ID'].value;
          if (!id_map.containsKey(id)) {
            id_map[id] = true;
            sum += doc['VAL'].value;
          }
        """,

结果是:“变量[id\u map]未定义。”在map\u脚本部分
早期版本的替代方法是什么?

5jvtdoz2

5jvtdoz21#

上面的脚本在版本6.4以后的版本中可以正常工作。
因为您运行的是es 5.x,所以需要稍微更改一下语法:
替换 stateparams._agg 替换 statesparams._aggs 这样地:

"aggs": {
    "terms": {
      "scripted_metric": {
        "init_script": "params._agg.id_map = [:]; params._agg.sum = 0.0;",
        "map_script": """
          def id = doc['record_id.ID'].value;
          if (!params._agg.id_map.containsKey(id)) {
            params._agg.id_map[id] = true;
            params._agg.sum += doc['VAL'].value;
          }
        """,
        "combine_script": """
            def sum = params._agg.sum;
            def stats = [:];
            stats.sum = sum;
            return stats
        """,
        "reduce_script": "return params._aggs"
      }
    }
  }

相关问题