1、什么是文档
对象JSON序列化后是一个文档
2、如何唯一确定一个文档
_index + _type + _id
id可以由外部指定,也可以由ES自动生成
3、ES更新文档流程
先GET原始文档,然后修改,最后将整个文档进行再次索引处理
4、ES中_version变更
对应于增删查改操作,ES中索引、put和删除操作时,无论文档有没有变化,它的_version都会增加
5、如何处理修改冲突
乐观并发控制:所有更新或删除文档的API都支持version参数,从而实现乐观并发控制
使用场景1:ES作为持久化层
问题描述:不同进程同时对某一个文档进行修改
解决方案:先Get操作获取了_version,在修改时传入之前获取得version参数,只有当前文档version与指定version参数相等时才执行更新,否则提示失败
使用场景2:MySQL作为持久化层,ES只是用于搜索
问题描述:当主库(MySQL)中数据发生更改,需要更新ES,可能存在并发修改?
解决方案:ES比较外部version是否大于文档_version,才能更新成功,例如PUT /website/blog/123?version=5&version_type=external
使用场景3:无关顺序的更新(局部更新:新增字段或改变字段值)
问题描述:对于很多的局部更新来说,文档有没有发生变化实际上不重要
解决方案:设定retry_on_conflict,规定自动完成这项请求的次数