如 Figure 11, “局部更新文档” 所示,updateAPI 结合了先前说明的读取和写入模式。
以下是部分更新一个文档的步骤:
- 客户端向Node 1 发送更新请求。
- 他将请求转发到主分片所在的Node3
- Node 3 从主分片检索文档,修改_source 字段中的JSON,并且尝试重新索引主分片的文档。如果文档已经被另一个进程修改,他会重试步骤3,超过retry_on_conflict次后放弃。
- 如果Node3 成功地更新文档,他将新版本的文档并行转发到Node 1和Node 2上的副本分片,重新建立索引。一旦所有副本分片都返回成功,Node 3 向协调节点也返回成功,协调节点向客户端返回成功。
update API 还接受在 新建、索引和删除文档章节中介绍的 routing 、 replication 、 consistency 和 timeout 参数。
基于文档的复制
当主分片把更改转发到副本分片时,他不会转发更新请求。相反,他转发完整文档的新版本。请记住,这些更改将会异步转发到副本分片,并且不能保证他们以相同的顺序到达。如果Elasticsearch仅转发更改请求,则可能以错误的顺序应用更改,导致得到损坏的文档。
