在ElasticSearch Bulk JavaScript API中使用脚本更新索引

时间:2018-11-20 13:40:08

标签: javascript elasticsearch

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动作时或更多项目?

1 个答案:

答案 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 },
  ],
});