我有以下文件:
{
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 ...
}
从我所看到的,这包括脚本。
任何人都可以通过拼图的剩余部分来启发我吗?
如果可能的话,我还希望有一些关于如何在批处理语句中制作这些内容的说明。
答案 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
值。当然,根据您的要求,可以在该脚本中执行许多其他更改。