文章目录
PUT 是 强制创建、全量更新操作
POST 是 创建、局部更新操作
看上去PUT和POST都可以创建、更新document,那么在创建document、更新document的时候有什么区别呢?
1、创建document 区别
使用ES自动生成id
我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?
请记住 _index 、 _type 、 _id 三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式是使用 POST 方法让Elasticsearch自动生成唯一 _id :
POST /website/blog/
{ ... }
使用自定义id
然而,如果想使用自定义的 _id ,我们必须告诉Elasticsearch应该在 _index 、 _type 、 _id 三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:
第一种方法使用 op_type 查询参数:
PUT /website/blog/123?op_type=create
{ ... }
或者第二种方法是在URL后加 /_create 做为端点:
PUT /website/blog/123/_create
{ ... }
如果请求成功的创建了一个新文档,Elasticsearch将返回正常的元数据且响应状态码是201 Created 。
另一方面,如果包含相同的 _index 、 _type 和 _id 的文档已经存在,Elasticsearch将返回 409 Conflict 响应状态码,错误信息类似如下:
{
"error" : "DocumentAlreadyExistsException[[website][4] [blog][123]:
document already exists]",
"status" : 409
}
小结:
POST 可以创建ES自动生成id类型的document。
PUT id存在为创建,否则为全量替换。
另外PUT还可以 使用op_type=create或_create实行强制创建document。
2、更新document 区别
PUT
全量替换
文档在Elasticsearch中是不可变的——我们不能修改他们。如果需要更新已存在的文档,我们可以使用《索引文档》 章节提到的 index API 重建索引(reindex) 或者替换掉它。
PUT,就是全量替换,POST可以实现局部替换。
这里说的全量、局部,其实是指针对用户而言的,底层ES处理的时候,都会将旧的数据标记delete,重新创建一条记录,当然版本号都会+1.
例如,id为123是一条已经存在的记录,使用PUT时,那么id=123的这条数据,不管之前有多少个字段,那么是100个字段,那么执行完以下这条数据之后,也就只剩下3个字段了:title、text、date。
PUT /website/blog/123
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
响应数据:
{
"_index" : "website",