在Upserts api这样的操作中,我正在对bulk使用ElasticSearch Update 操作来创建或更新当前索引中的现有文档
{
index: myIndex,
type: '_doc',
body: [
{ index: {_id: docItemID1 } },
docItem1,
{ index: {_id: docItemID2 } },
docItem2
]
}
这正常。现在,我想使用tag
标志和scripted_upsert
更新操作将新值更新/附加到文档项中的script
字段,如下所示:
{
"scripted_upsert":true,
"script" : {
"source": "if ( !ctx._source.tags.contains(params.tag) ) ctx._source.tag.concat( params.tag)",
"lang": "painless",
"params" : {
"tag" : "blue"
}
},
"upsert" : {
"tag" : ["red","green"]
}
}
现在,我想使用scripted_upsert
来充分利用两个世界的优势,所以我想像这样的事情-如果正确(这是我的问题)
{
"script" : {
"source": "if ( !ctx._source.tags.contains(params.tag) ) ctx._source.tag.concat( params.tag)",
"lang": "painless",
"params" : {
"tag" : myNewTag
}
},
"upsert" : docItem
}
其中docItem
将包含一个tag
项目以进行更新。此标签项是逗号分隔的标签列表,例如red,green
。
这种方法正确吗?如果是这样的话,那是bulk
API的正确主体,即当将body
用作具有更新[]
且带有加号script
标志的动作的scripted_upsert
动作时或更多项目?
答案 0 :(得分:1)
是的,docs say:
如果您希望不管文档是否存在都运行脚本-[...]-然后将
scripted_upsert
设置为true
因此,同时拥有“ upsert”和“ script”两个部分是可行的方法,但是您必须保留"scripted_upsert":true
(最后一个代码片段中没有)。
使用elasticsearch-js lib,它像这样:
await client.bulk({
index: 'myIndex',
type: 'myType',
body [
{ update: { _id: docId } },
{ script: { source, params }, scripted_upsert: true, upsert: docItem },
],
});