5.7.1:更新整个文档
ES中并不存在所谓的更新操作,而是用新文档替换旧文档;
在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引。旧版本文档不会立即消失
,但你也不能去访问它
PUT /website/blog/123
{
"title": "My first blog entry2",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
5.7.2:局部更新[partial _update]
上面介绍的是更新整个文档,但是往往会出现这种情况,文档非常大,但是只想更新其中的一个数据,这个时候通过检索,修改,然后重建整文档的索引方法来更新文档就不合适了,所以需要使用局部的更新;
但是仍然需要注意的是,无论是整个文档更新还是局部的更新,都是先找到旧的,然后标记删除,然后在添加新的文档
所以这个过程大概是这样:
1. 从旧文档中检索JSON
2. 修改它
3. 删除旧文档
4. 索引新文档
POST /website/blog/123/_update
{
"doc" : {
"tags" : [ "testing" ],
"views": 0
}
}
注意,在局部更新中,要使用POST + _update
5.7.3:使用脚本进行局部更新[Groovy]
这时候当API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。
默认的脚本语言是Groovy,一个快速且功能丰富的脚本语言,语法类似于Javascript。它在一个沙盒(sandbox)中运行,以防止恶意用户毁坏Elasticsearch或攻击服务器
脚本能够使用update API改变source字段的内容,它在脚本内部以ctx.source表示。
例如,我们可以使用脚本增加博客的views数量:
POST /website/blog/123/_update
{
"script" : "ctx._source.views+=1"
}
5.7.4:更新可能不存的文档
在局部更新操作中,如果遇到了不存在的文档,会出现失败的操作;
有时候也需要对不存在的文档进行更新【创建】
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1"
}
报错: "type": "document_missing_exception" 因为当前并不存在这个文档
使用关键字:upsert 当文档不存在的时候,那么就创建这个文档
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 2
}
}
在局部更新中,使用upsert脚本:
当文档不存在的时候,会走upsert语句 |
---|
当文档已经存在的时候,会走script语句 |