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 ...

}

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

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

回答:

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

回答:

您可以使用按查询更新API进行批量更新。从ES

2.3开始,此方法有效,否则您需要安装插件。

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": {}

}

}

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

如果您只想更新单个文档,则可以使用部分文档更新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"] } }

以上是 Elasticsearch部分更新脚本:清除数组并替换为新值 的全部内容, 来源链接: utcz.com/qa/431882.html

回到顶部