(11)Elasticsearch 更新文档或者创建一个新文档

更新整个文档

文档在 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 响应状态码,错误信息类似如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值