ElasticSearch-更新与更新冲突

来源:互联网 发布:淘宝刷到单能赚钱吗 编辑:程序博客网 时间:2024/05/29 09:32

在上一篇博客ElasticSearch-简介,对索引操作中知道,如果插入一条数据,该ID存在的情况下,文档将会覆盖旧的文档,然后重新索引整个文档。那么有没有办法使其部分更新,例如在某个请求时对计数器增加。

update请求最简单的一种形式是接收文档的一部分作为doc参数,它只是与现有的文档合并。对象被合并到一起,覆盖现有的字段,增加的新的字段。例如在张三的信息中增加scorefavorite字段

curl -XPOST 'http://localhost:9200/grade3/class2/1/_update' -d '{    "doc":{        "score":80,        "favorite":["music","football"]    }}'

此时,就完成了对张三的信息的更改,我们查询一下张三的信息,获得:

{  "_index" : "grade3",  "_type" : "class2",  "_id" : "1",  "_version" : 2,  "found" : true,  "_source" : {    "name":"张三",    "age":18,    "email":"xxx@163.com",    "score":80,    "favorite":["music","football"]  }}

除了上面这种方法之外,ElasticSearch还提供了脚本来实现部分更新:

# 通过将本将张三的信息中score加1curl -XPOST 'http://localhost:9200/grade3/class2/1/_update' -d '{    "script":"ctx._source.score+=1"}'

更新冲突

在上一篇博客ElasticSearch-冲突处理,介绍了在覆盖更新时冲突的出现和解决,但它使用于覆盖更新情况,此时我们需要对文档部分更新,该如何解决这种冲突呢?

updateAPI中,可以通过设置参数retry_on_conflict来自动完成,这个参数决定了update失败之后重试的次数,它的默认值为0。

curl -XPOST 'http://localhost:9200/grade3/class2/1/_update?retry_on_conflict=5' -d '{    "script":"ctx._source.score+=1"}'

  • retry_on_conflict:更新失败之后重试次数
原创粉丝点击