在Elasticsearch中文档是不可改变的,不能修改他们。相反,如果想要更新现有的文档,需要重建索引或者进行替换,我们可以使用相同的index API 进行实现,在 索引文档 中已经进行了讨论。

    1. PUT /website/blog/123
    2. {
    3. "title": "My first blog entry",
    4. "text": "I am starting to get the hang of this...",
    5. "date": "2014/01/02"
    6. }

    在响应体中,我们能看到Elasticsearch 已经增加了 _version 字段值:

    {
      "_index" :   "website",
      "_type" :    "blog",
      "_id" :      "123",
      "_version" : 2,
      "created":   false 
    }
    

    created 标志设置成false,是因为相同的索引、类型和ID 的文档已经存在。

    在内部,Elasticsearch已将旧文档标记为已删除,并增加一个全新的文档。尽管你不能再对旧文档进行访问,但它并不会立即消失。当继续索引更多的数据,Elasticsearch会在后台清理这些已删除的文档。

    在本章的后面部分,我们会介绍 update API,这个API 可以用于partial updates to a document 。虽然它似乎对文档直接进行了修改,但实际上Elasticsearch按前述完全相同方式执行以下过程:

    1. 从旧文档构建JSON
    2. 更改该JSON
    3. 删除旧文档
    4. 索引一个新文档

    唯一的区别在于,update API 仅仅通过一个客户端请求来实现这些步骤,而不需要单独的get 和 index 请求。