在_update_by_query期间插入丢失的文档

时间:2018-09-06 09:01:13

标签: elasticsearch insert-update

我有一个包含2个字段的映射:消息+权重。
每个文档的“消息”都是唯一的。
每次检索文档时,我都必须增加“权重”。
如果找不到,我必须插入具有默认值的新文档。

运行_update_by_query时,有没有办法自动插入文档(如果找不到)?

POST /testindex/_update_by_query?conflicts=proceed
{
    "script": {
        "inline": "ctx._source.weight++",
        "lang": "painless"
    },
    "query": {
        "match": {
            "message": "iphone"
        }
    }
}

我需要它像SQL一样起作用:INSERT…在重复键更新上

1 个答案:

答案 0 :(得分:1)

由于message字段对于所有文档都是唯一的,因此可以将其用作文档ID。这样一来,您就可以利用Update API,尤其是upsert功能。

基本上,您可以更新文档(将weight递增),如果不存在,则可以创建文档(使用weight: 1):

POST testindex/_doc/iphone/_update
{
    "script" : {
        "source": "ctx._source.weight++",
        "lang": "painless"
    },
    "upsert" : {
        "weight" : 1
    }
}