在 Elasticsearch 中文档是 不可改变 的,不能修改它们。 相反,如果想要更新现有的文档,需要 重建索引 或者进行替换, 我们可以使用相同的 index API 进行实现。
1.新增一个文档
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"
}
2.我们使用相同的id,但是改变文档的部分内容,再次put一次
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 会在后台清理这些已删除文档。
3.使用id为222查询此文档
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" } }
4.而我们使用title或者其他字段去检索之前的那个文档,发现之前的文档已经无法检索到了
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 按前述完全相同方式执行以下过程:
- 从旧文档构建 JSON
- 更改该 JSON
- 删除旧文档
- 索引一个新文档
唯一的区别在于, update API 仅仅通过一个客户端请求来实现这些步骤,而不需要单独的 get 和 index 请求。