ElasticSearch[4]操作篇-更新和删除
About 2 min
更新文档
文档在elasticsearch中是不可变的. 但是可以通过重建索引进行替换.
如果我们要修改上面截图中的age
字段, 可以将之前的PUT方法中的age
值修改并重新运行, 即可.
注意此时的_version字段会增加1, 这个设计如同数据库中我们使用乐观锁. 都是通过版本号实现.
局部更新
上面通过全文更新过于繁琐. 现在就介绍一种更加简单的方式进行更新.
比如更改上面文档中的age:
POST /megacorp/employee/3/_update
{
"doc": {
"age" : 40
}
}
执行之后, 重新查询:
结果已经变成我们设置的值了.
通过脚本更新
POST /megacorp/employee/3/_update
{
"script" : "ctx._source.age+=1"
}
ctx._source
表示的是_source
注意如果不确定更新的字段是否存在, 可以使用upsert
指定初始值创建.
POST /megacorp/employee/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 1
}
}
更新和冲突
如果版本号发生冲突, 并且在更新先后不重要的情况下. 可以尝试再次更新.
这可以通过设置参数 retry_on_conflict
来自动完成, 这个参数规定了失败之前 update 应该重试的次数, 它的默认值为0 。
POST /megacorp/employee/1/_update?retry_on_conflict=5
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 0
}
}
删除
DELETE /school-demo/school/1