一、前言
这几天对接ES遇到几个坑,我们将一张库存表同步到ES发现Docs Count和我们表中的数据对不上,需要加上Docs deleted才对得上,也不知道批量写入数据为什么有些数据就会成 Docs deleted。
二、ID和版本号
ES中每一个Document都有一个_id和_version。
1、_id:文档的唯一ID。
有两种方式生成,第一种是ES自动生成,Base64编码20位的唯一ID.另外一种是手动指定ID,比如来自数据库的自增ID或UUID,但要确保是唯一的。
2、_version:文档的版本号。
新增 _version为1
更新 _version变为2
通过 get /store_stock/_stats,可以发现count为1,deleted也为1.
结论:更新(重新写入,数据内容不变)实际上原来老的文档标记为删除状态,并新增一个新的文档,版本号为原来文档版本号+1。删除文档也同样如些,先标记deleted逻辑删除状态,ES会在适当的时候清除已标记为deleted的文档。
至于我们的问题是因为开始是使用数据库的自增ID做为ES的ID(文档内容中也含有ID),但我们数据库的ID是有断层的情况(测试环境做了物理删除,有跳跃的情况),然后ES就凌乱了,后面不管3721,把ID换成ES内部自增ID就好了。