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" : {}
}