当我们索引一个文档时,如何确定我们是创建了一个新的文档还是覆盖了一个已经存在的文档呢?
请牢记_index,_type以及_id组成了唯一的文档标记,所以为了确定我们创建的是全新的内容,最简单的方法就是使用POST方法,让Elasticsearch自动创建不同的_id:
POST /website/blog/
{ ... }
然而,我们可能已经决定好了_id,所以需要告诉Elasticsearch只有当同_index,_type以及_id的文档不存在时才接受我们的请求。实现这个目的有两种方法,他们实质上是一样的,你可以选择你认为方便的那种:
第一种是在查询中添加op_type参数:
PUT /website/blog/123?op_type=create
{ ... }
或者在请求最后添加 /_create:
PUT /website/blog/123/_create
{ ... }
如果成功创建了新的文档,Elasticsearch将会返回常见的元数据以及201 Created的HTTP反馈码。
而如果存在同名文件,Elasticsearch将会返回一个409 Conflict的HTTP反馈码,以及如下方的错误信息:
~~~
{
"error" : "DocumentAlreadyExistsException[[website][4] [blog][123]:
document already exists]",
"status" : 409
}
~~~