Update API 更新文档


Update API | Elasticsearch Reference [7.6] | Elastic

语法

POST /<index>/_update/<_id>

使用 update 仍会导致 document 重新建立索引,但是 update 删除了一些网络往返开销,减少了 Get 和 Index 操作时间发生 version 冲突的可能性。

示例

POST twitter/_doc/
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
# 更新文档字段
POST test/_update/1
{
    "doc" : {
        "name" : "assad"
    }
}
# 更新文档字段并修改文档属性,不更新 version 
POST test/_update/1
{
    "doc" : {
        "name" : "new_name"
    },
    "detect_noop": false
}
# 更新文档字段,当不存在时候,使用 doc 中的内容进行 upsert 操作
POST test/_update/1
{
    "doc" : {
        "name" : "new_name"
    },
    "doc_as_upsert" : true
}

update api 支持通过 document script 进行更新,在该脚本中可以通过 ctx 对象访问变量:_source_index_type_id_version_routing_now(当前时间戳)。

# 新增一个文档
PUT test/_doc/1
{
    "counter" : 1,
    "tags" : ["red"]
}
# 更新 counter 字段,自增值
POST test/_update/1
{
    "script" : {
        "source": "ctx._source.counter += params.count",
        "lang": "painless",
        "params" : {
            "count" : 4
        }
    }
}
# 向 arrays 字段中添加元素
POST test/_update/1
{
    "script" : {
        "source": "ctx._source.tags.add(params.tag)",
        "lang": "painless",
        "params" : {
            "tag" : "blue"
        }
    }
}
# 向 arrays 字段中删除元素
POST test/_update/1
{
    "script" : {
        "source": "if (ctx._source.tags.contains(params.tag)) { ctx._source.tags.remove(ctx._source.tags.indexOf(params.tag)) }",
        "lang": "painless",
        "params" : {
            "tag" : "blue"
        }
    }
}
# 增加新的字段
POST test/_update/1
{
    "script" : "ctx._source.name = 'assad'"
}
# 删除字段
POST test/_update/1
{
    "script" : "ctx._source.remove('name')"
}
# 在脚本中变更操作动作
POST test/_update/1
{
    "script" : {
        "source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",
        "lang": "painless",
        "params" : {
            "tag" : "green"
        }
    }
}

当 update 的文档不存在,upsert 所指定的元素将会作为一个新文档插入。如果文档已经存在,则执行该脚本。

POST test/_update/1
{
    "script" : {
        "source": "ctx._source.counter += params.count",
        "lang": "painless",
        "params" : {
            "count" : 4
        }
    },
    "upsert" : {
        "counter" : 1
    }
}

如果无论文档是否存在都要强制运行该脚本,可以设置 scripted_upsert = true

POST sessions/_update/dh3sgudg8gsrgl
{
    "scripted_upsert":true,
    "script" : {
        "id": "my_web_session_summariser",
        "params" : {
            "pageViewEvent" : {
                "url":"foo.com/bar",
                "response":404,
                "time":"2014-01-01 12:32"
            }
        }
    },
    "upsert" : {}
}