ElasticSearch-更新与更新冲突

在上一篇博客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":"[email protected]",
    "score":80,
    "favorite":["music","football"]
  }
}

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

# 通过将本将张三的信息中score加1
curl -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:更新失败之后重试次数

你可能感兴趣的:(elasticsearch)