Figure 11, “局部更新文档” 所示,updateAPI 结合了先前说明的读取和写入模式。
局部更新文档 - 图1
以下是部分更新一个文档的步骤:

  1. 客户端向Node 1 发送更新请求。
  2. 他将请求转发到主分片所在的Node3
  3. Node 3 从主分片检索文档,修改_source 字段中的JSON,并且尝试重新索引主分片的文档。如果文档已经被另一个进程修改,他会重试步骤3,超过retry_on_conflict次后放弃。
  4. 如果Node3 成功地更新文档,他将新版本的文档并行转发到Node 1和Node 2上的副本分片,重新建立索引。一旦所有副本分片都返回成功,Node 3 向协调节点也返回成功,协调节点向客户端返回成功。

update API 还接受在 新建、索引和删除文档章节中介绍的 routingreplicationconsistencytimeout 参数。

基于文档的复制

当主分片把更改转发到副本分片时,他不会转发更新请求。相反,他转发完整文档的新版本。请记住,这些更改将会异步转发到副本分片,并且不能保证他们以相同的顺序到达。如果Elasticsearch仅转发更改请求,则可能以错误的顺序应用更改,导致得到损坏的文档。