# CRUD、强制操作
document 的全量替换、强制创建以及图解 lazy delete 机制
- document 的全量替换
- document 的强制创建
- document 的删除
# document 的全量替换
语法与创建文档是一样的
如果 document id 不存在,那么就是创建;如果 document id 已经存在,那么就是全量替换操作,替换 document 的 json 串内容
document 是不可变的
如果要修改 document 的内容,第一种方式就是全量替换,直接对 document 重新建立索引,替换里面所有的内容
es 会将老的 document 标记为 deleted
然后新增我们给定的一个 document,当我们创建越来越多的 document 的时候,es 会在适当的时机在后台自动删除标记为 deleted 的 document
# document 的强制创建
老师讲解的是:
- 创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建呢?
PUT /index/type/id?op_type=create,PUT /index/type/id/_create
PUT /test_index/test_type/1/_create
{
"test_content": "test test",
"test_content2": "test test23"
}
PUT /test_index/test_type/1?op_type=create
{
"test_content": "test test",
"test_content2": "test test23",
"test_content3": "test test23"
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# document 的强制创建(正确的讲解)
我觉得上面讲解得有问题:
如果已经存在一个 document id 为 1 的时候,再使用以上语法创建,会报错;
会告诉你已经存在了;
那么这个的含义应该是:当你不想要覆盖操作的时候,可以使用 create 显示指定不要覆盖,而是报错
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[test_type][1]: version conflict, document already exists (current version [3])",
"index_uuid": "g4RJx2v8TXK95LdwlhRx5A",
"shard": "2",
"index": "test_index"
}
],
"type": "version_conflict_engine_exception",
"reason": "[test_type][1]: version conflict, document already exists (current version [3])",
"index_uuid": "g4RJx2v8TXK95LdwlhRx5A",
"shard": "2",
"index": "test_index"
},
"status": 409
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# document 的删除
DELETE /test_index/test_type/1
1
这里的删除和更新操作类似,也是一个 lazy delete 机制
← _souce 元数据 并发更新冲突 →