更新整个文档
文档在 es 中是不可变的——我们不能修改他们。如果要更新已经存在的文档,我们可以使用《索引文档》章节提到的API重建索引(reindex)或者替换掉它。
curl -X PUT "localhost:9200/website/blog/123" -H 'Content-Type: application/json' -d'
{
"title":"My first blog entry",
"text":"I am starting to get the hang of this...",
"date":"2014/01/02"
}
'
在响应中,我们可以看到 es 把 _version 增加了。
{"_index":"website","_type":"blog","_id":"123","_version":2,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"created":false}
created 标识为 false,因为同索引、同类型下面已经存在相同 id 的文档。
在内部,es 已经标记为旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。 es 会在你继续索引更多数据的时候清理被删除的文档。
创建一个新文档
当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已存在的?
请记住 _index, _type, _id 三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式就是使用POST方法,es 自动生成唯一的 _id:
POST /website/blog/
{...}
然而,如果想使用自定义的 _id,我们必须告诉 es 应该在 _index、 _type、 _id 三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:
第一种方法是使用 op_type 查询参数:
PUT /website/blog/123?op_type=create
{...}
第二种方法是在URL后加 /_create 作为端点
PUT /website/blog/123/_create
{...}
如果请求成功创建了一个新文档, es 将返回正常的元数据而且响应码是 201 created。
另一方面,如果包含相同的 _index,_type 和 _id 的文档已经存在,es 将返回 409 Conflict 响应状态码,错误信息类似如下: