Elasticsearch部分更新脚本:清除数组并替换为新值

5 elasticsearch

我有类似的文件:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

我的文档可能很大(但是这些MyProp字段不是),并且从头开始生成的文档很昂贵。

有时我需要更新这些批次-因此进行部分更新(节省“索引客户端”的处理能力和带宽,从而节省时间)并用新值替换MyProp值将是有益的。

原始文件示例:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

更新文档的示例(或更确切地说,外观):

{
  MyProp: ["dolor", "sit"]
  ... lots of stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

从我所看到的,这包括脚本。

谁能用剩下的难题启发我?

赏金添加:

如果可能的话,我还想在批处理语句中提供一些说明。

Val*_*Val 4

您可以使用查询更新 API来进行批量更新。这从 ES 2.3 开始有效,否则你需要安装一个插件

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp += newProp",
    "params": {
      "newProp": "sit"
    }
  },
  "query": {
    "match_all": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用任何您想要的查询来选择MyProp需要更新的文档。例如,您可以通过查询来选择具有某些MyProp要替换的特定值的文档。

上面只会向现有数组添加一个新值。如果你需要完全替换MyProp数组,那么你也可以将脚本更改为:

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp = newProps",
    "params": {
      "newProps": ["dolor", "sit"]
    }
  },
  "query": {
    "match_all": {}
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您还需要启用动态脚本才能使其正常工作。

更新

如果您只想更新单个文档,可以使用部分文档更新 API,如下所示:

POST test/type1/1/_update
{
    "doc" : {
        "MyProp" : ["dolor", "sit"]
    }
}
Run Code Online (Sandbox Code Playgroud)

这将有效地替换MyProp指定文档中的数组。

如果您想走批量路线,则不需要编写脚本来实现您想要的:

POST index/type/_bulk
{ "update" : {"_id" : "1"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }
{ "update" : {"_id" : "2"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }
Run Code Online (Sandbox Code Playgroud)