Elasticsearch-入门到精通-7 PUT和POST区别


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",
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值