在 Elasticsearch 中文档是 不可改变 的,不能修改它们。 相反,如果想要更新现有的文档,需要 重建索引 或者进行替换, 我们可以使用相同的 index API 进行实现。
PUT /policy_document/policy_document/333
{
"level":"国家",
"plat_from":11,
"reference_number":"333",
"title":"省级文明单位颁发文件333号",
"from_type":1,
"id":"333",
"_id_":"222",
"launch_date":1485878400000,
"launch_department":"国家科技局3"
}
PUT /policy_document/policy_document/333
{
"level":"国家",
"plat_from":11,
"reference_number":"333",
"title":"省级文明单位颁发文件444号",
"from_type":1,
"id":"333",
"_id_":"222",
"launch_date":1485878400000,
"launch_department":"国家科技局444"
}
返回内容为:
{
"_index": "policy_document",
"_type": "policy_document",
"_id": "333",
"_version": 2,
"result": "updated",
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"created": false
}
可以看到返回的内容中, created 标志设置成 false ,_version版本也发生了变化,是因为相同的索引、类型和 ID 的文档已经存在。 在内部,Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档。
GET /policy_document/policy_document/333
查询后发现,现在的文档内容是新的那个:
{
"_index": "policy_document",
"_type": "policy_document",
"_id": "333",
"_version": 2,
"found": true,
"_source": {
"level": "国家",
"plat_from": 11,
"reference_number": "333",
"title": "省级文明单位颁发文件444号",
"from_type": 1,
"id": "333",
"_id_": "222",
"launch_date": 1485878400000,
"launch_department": "国家科技局444"
}
}
GET policy_document/policy_document/_search
{
"query": {
"match": {
"title": "省级文明单位颁发文件333号"
}
}
}
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
后面我们会介绍 update API, 这个 API 可以用于 partial updates to a document 。 虽然它似乎对文档直接进行了修改,但实际上 Elasticsearch 按前述完全相同方式执行以下过程:
唯一的区别在于, update API 仅仅通过一个客户端请求来实现这些步骤,而不需要单独的 get 和 index 请求。