有没有办法在Elasticsearch 7中无痛运行睡眠命令?

yvt65v4c  于 2023-01-04  发布在  ElasticSearch
关注(0)|答案(2)|浏览(171)

在Elasticsearch的旧版本中,我们可以:

% curl -XPOST 'localhost:9200/online-shop/shirts/1/_update' -d '{
 "script": "Thread.sleep(10000); ctx._source.price = 2" 
}'

如何在Elasticsearch 7中实现无痛睡眠?
1.为文档编制索引,然后对其进行更新(update1)。

  1. Update1在后台启动,并包括等待时间(睡眠)。
    1.在休眠期间,发出另一个update命令(update2)来修改文档,这一更改发生在update1获取原始文档和重新索引操作之间。
  2. update1没有取消update2的更改,而是失败了,因为文档已经是版本2。此时,您有机会重试update1并应用版本3中的更改。(请参见清单3.6)
qyyhg6bp

qyyhg6bp1#

在ES5中可以用Groovy来做这个,但是从ES6开始,就不能用Painless来做了。我也不知道为什么需要这样做。
由于是通过curl调用,因此可以在shell中简单地执行此操作

% sleep 10s
% curl -XPOST 'localhost:9200/online-shop/shirts/1/_update' -d '{
 "script": "ctx._source.price = 2" 
}'
8wtpewkr

8wtpewkr2#

在《无痛》中,你得想出一个非常昂贵的剧本,比如:

curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_doc/1/_update?pretty' -d '{
  "script" : {
    "lang": "painless",
    "source": "long total = 0; for (int i = 0; i < 1000000000; ++i) { ctx._source.price += total }"
  }
}'

但这会给予你一个错误,如:

"type" : "painless_error",
        "reason" : "The maximum number of statements that can be executed in a loop has been reached."

这是因为有一个硬编码的maxLoopCounter值被触发。
我最终放弃了在虚拟设置上编写昂贵的脚本,并最终克隆了Elasticsearch repo,更改了一个数字,然后做了如下操作:

./gradlew ':distribution:archives:$DISTRIBUTION_NAME_GOES_HERE:assemble' --parallel

其中$DISTRIBUTION_NAME_GOES_HERE可以是linux-tar或您需要的任何Elasticsearch发行版-您可以在settings.gradle文件中找到完整的列表。Java版本需要匹配(例如export JAVA_HOME=/path/to/java-home-where-you-untar-the-expected-version
除非你找到一种方法来制作一个没有那么多数据的昂贵的脚本。在这种情况下,你不会看到这整个混乱:)

相关问题