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

时间:2016-11-27 00:38:25

标签: elasticsearch

我有以下文件:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}

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

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

原始文件示例:

{
  MyProp: ["lorem", "ipsum", "dolor"]
  ... lots of stuff here ...
}

更新文档的示例(或者说应该看起来如何):

{
  MyProp: ["dolor", "sit"]
  ... lots of stuff here ...
}

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

任何人都可以通过拼图的剩余部分来启发我吗?

Bounty补充道:

如果可能的话,我还希望有一些关于如何在批处理语句中制作这些内容的说明。

2 个答案:

答案 0 :(得分:2)

您可以使用update by query API进行批量更新。这从ES 2.3开始就有效,否则你需要install a plugin

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp += newProp",
    "params": {
      "newProp": "sit"
    }
  },
  "query": {
    "match_all": {}
  }
}

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

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

POST index/_update_by_query
{
  "script": {
    "inline": "ctx._source.myProp = newProps",
    "params": {
      "newProps": ["dolor", "sit"]
    }
  },
  "query": {
    "match_all": {}
  }
}

请注意,您还需要enable dynamic scripting才能实现此目的。

<强>更新

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

POST test/type1/1/_update
{
    "doc" : {
        "MyProp" : ["dolor", "sit"]
    }
}

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

如果您想要进行批量生产,您不需要编写脚本来实现您的目标:

POST index/type/_bulk
{ "update" : {"_id" : "1"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }
{ "update" : {"_id" : "2"} }
{ "doc" : {"MyProp" : ["dolor", "sit"] } }

答案 1 :(得分:0)

_bulk更新是否适合您?

POST test/type1/_bulk
{"update":{"_id":1}}
{"script":{"inline":"ctx._source.MyProp += new_param","params":{"new_param":"bla"},"lang":"groovy"}}
{"update":{"_id":2}}
{"script":{"inline":"ctx._source.MyProp += new_param","params":{"new_param":"bla"},"lang":"groovy"}}
{"update":{"_id":3}}
{"script":{"inline":"ctx._source.MyProp += new_param","params":{"new_param":"bla"},"lang":"groovy"}}
....

您还需要为groovy启用内联脚本。以上操作是在bla字段中为列出的文档添加MyProp值。当然,根据您的要求,可以在该脚本中执行许多其他更改。