【问题标题】:Elasticsearch bulk update with same script for multiple documents使用相同脚本对多个文档进行 Elasticsearch 批量更新
【发布时间】:2020-09-07 21:05:51
【问题描述】:

我正在尝试为多个文档运行批量更新语句。但是,我想为他们所有人执行相同的script

我们来看下面的例子:

POST _bulk
{ "update": {"_id": "1", "_index": "test", "retry_on_conflict" : 3} }
{ "script": { "source": "ctx._source.count2 = params.count2", "lang": "painless", "params": { "count2": 4 }}}
{ "update": {"_id": "2", "_index": "test", "retry_on_conflict" : 3} }
{ "script": { "source": "ctx._source.count2 = params.count2", "lang": "painless", "params": { "count2": 4 }}}
{ "update": {"_id": "3", "_index": "test", "retry_on_conflict" : 3} }
{ "script": { "source": "ctx._source.count2 = params.count2", "lang": "painless", "params": { "count2": 4 }}}

在我的具体场景中,脚本更复杂。 有什么办法可以重复使用相同的脚本语句?

我故意不想使用update_by_query 命令,因为它缺少冲突重试机制。

谢谢

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您绝对可以将脚本存储在 ES 中,然后在批量更新中引用它:

    首先,存储您的脚本:

    POST _scripts/my-script
    {
      "script": {
        "lang": "painless",
        "source": "ctx._source.count2 = params.count2"
      }
    }
    

    然后,使用它:

    POST _bulk
    { "update": {"_id": "1", "_index": "test", "retry_on_conflict" : 3} }
    { "script": { "id": "my-script", "params": { "count2": 4 }}}
    { "update": {"_id": "2", "_index": "test", "retry_on_conflict" : 3} }
    { "script": { "id": "my-script", "params": { "count2": 4 }}}
    { "update": {"_id": "3", "_index": "test", "retry_on_conflict" : 3} }
    { "script": { "id": "my-script", "params": { "count2": 4 }}}
    

    【讨论】:

    • 除了将我的代码存储在集群中还有其他方法吗?
    • 在 5.x 之前,可以将脚本存储在文件系统上,但在 6.0 中已弃用和删除。是什么让您难以在集群状态下存储脚本?
    • 在数据库中管理代码的体验很糟糕,但这是一个不错的选择。谢谢!
    • 酷,很高兴它有帮助!将脚本放在文件系统的配置文件夹中的另一种选择也不是最佳选择,因为您必须在集群的每个节点上保存脚本 并在每次更新后重新启动节点。 . 谈论可怕 :-) 多年来,我一直在管理具有数十个节点和数百个脚本的集群......没有任何问题......它只需要纪律。
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2016-05-02
    • 2018-04-28
    • 1970-01-01
    • 2021-12-24
    • 2023-04-02
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多