es局部更新与版本控制

本文介绍了Elasticsearch中的更新API,用于部分更新文档,如增加计数器或添加字段。更新过程涉及文档的查找、修改和重新索引,但内部在单个片(shard)中完成,以节省网络开销并减少冲突。更新API允许使用脚本进行更复杂的自定义操作,如增加views字段或添加tags。此外,文章讨论了如何处理文档不存在的情况,以及并发更新时的冲突管理和版本控制策略,包括乐观并发控制(OCC)和悲观并发控制(PCC)的应用。
摘要由CSDN通过智能技术生成
更新文档中的一部分
在《更新》一章中,我们讲到了要是想更新一个文档,那么就需要去取回数据,更改数据然后将整个文档进行重新索引。当然,你还可以通过使用更新API来做部分更新,比如增加一个计数器。

正如我们提到的,文档不能被修改,它们只能被替换掉。更新API也必须遵循这一法则。从表面看来,貌似是文档被替换了。对内而言,它必须按照找回-修改-索引的流程来进行操作与管理。不同之处在于这个流程是在一个片(shard) 中完成的,因此可以节省多个请求所带来的网络开销。除了节省了步骤,同时我们也能减少多个进程造成冲突的可能性。

使用更新请求最简单的一种用途就是添加新数据。新的数据会被合并到现有数据中,而如果存在相同的字段,就会被新的数据所替换。例如我们可以为我们的博客添加tags和views字段:

POST /website/blog/1/_update
{
"doc" : {
"tags" : [ "testing" ],
"views": 0
}
}
如果请求成功,我们就会收到一个类似于索引时返回的内容:

{
"_index" : "website",
"_id" : "1",
"_type" : "blog",
"_version" : 3
}
再次取回数据,你可以在_source中看到更新的结果:

{
"_index": "website",
"_type": "blog",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"title": "My first blog entry",
"text": "Starting to get the hang of this...",
"tags": [ "testing" ], <1>
"views": 0 <1>
}
}
新的数据已经添加到了字段_source中。
使用脚本进行更新

我们将会在《脚本》一章中学习更详细的内容,我们现在只需要了解一些在Elasticsearch中使用API无法直接完成的自定义行为。默认的脚本语言叫做MVEL,但是Elasticsearch也支持JavaScript, Groovy 以及 Python。

MVEL是一个简单高效的JAVA基础动态脚本语言,它的语法类似于Javascript。你可以在Elasticsearch scripting docs 以及 MVEL website了解更多关于MVEL的信息。

脚本语言可以在更新API中被用来修改_source中的内容,而它在脚本中被称为ctx._source。例如,我们可以使用脚本来增加博文中views的数字:

POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1"
}
我们同样可以
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值