在Elasticsearch中插入两个相同id的文档会发生什么?
Elasticsearch 同索引插入已存在ID文档的处理逻辑
默认情况下,使用标准写入接口提交ID已存在的文档,不会忽略新内容,会直接全量覆盖原有ID对应的文档,底层逻辑为标记删除旧文档、写入新文档,同时文档的版本号会自动+1,旧文档的所有字段都会被新提交的字段完全替换。
不同的写入参数/接口会对应不同的处理逻辑,具体区别如下:
- 常规index写入(无特殊参数):如执行
PUT /<索引名>/_doc/<已有ID> {"字段1":"值1"},直接全量覆盖旧文档,旧文档未在新内容中声明的字段会丢失。 - 要求ID不存在才写入:添加
op_type=create参数,或直接使用_create接口,如执行PUT /<索引名>/_create/<已有ID> {"字段1":"值1"},此时如果ID已存在,ES会返回409冲突错误,不会修改原有文档,也不会写入新内容。 - 仅更新部分字段:使用
_update接口,如执行POST /<索引名>/_update/<已有ID> {"doc":{"字段1":"值1"}},此时只会更新声明的字段,原有文档的其他字段会保留,不会被覆盖。
补充说明:如果写入时指定了版本号做乐观锁控制,还会先校验版本号是否匹配,版本号不匹配时会直接返回冲突,不会执行任何写入/覆盖操作。
内容的提问来源于stack exchange,提问作者TeimasTeimoso
相关产品推荐
相关产品推荐

