2

有没有办法在 Elasticsearch 5.3 中使用无痛脚本循环查询结果以计算查询返回的命中之间的差异。

我试图在脚本中的 for 循环中循环结果,但无法在哪个实体上循环,我希望脚本有类似更新 api 的 ctx.payload.hits.hits 可以在 for 循环中使用。

"script": {
        "lang": "painless",
        "inline": "int total = 0; for (int i = 0; i <  ??? ; i++) { total +=  ???[i]._source['age'].value; } return total;"
    }
4

1 回答 1

0

我一直面临同样的问题,我在弹性论坛上发现了这个问题。看起来使用 map-reduce 是实现“通过命中迭代”的最简单方法,因为我还没有找到其他任何东西。由于弹性问题与您的问题完全相同,我猜您已经编写了它,以及后续问题。

这个问题有点不清楚最终目标是什么,但我建议让您熟悉MapReduce,因为它看起来像脚本化度量聚合是基于它的。但是,从文档中阅读,它的实现看起来完全不同,我引用的是:

在所有分片返回结果后在协调节点上执行一次。该脚本提供了对变量 _aggs 的访问权限,该变量是每个分片上 combine_script 的结果的数组。如果未提供 reduce_script,reduce 阶段将返回 _aggs 变量。

所以在我看来,在map_script(和可选的combine_script )执行之后,“减少作业”是在一个节点上执行的。这样,您可以在 map_script 中收集所有需要的数据,并在 reduce_script具有逻辑。但我必须强调,我对这类事情没有太多经验,而且我自己也遇到了一些(不同的)麻烦。

于 2018-07-23T16:52:27.533 回答