elasticsearch更新文档数据

文本方式批量更新多字段

使用更新请求最简单的一种用途就是添加新数据。新的数据会被合并到现有数据中,而如果存在相同的字段,就会被新的数据所替换。例如我们可以为我们的博客添加tagsviews字段:

POST /website/blog/1/_update
{
  "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}

如果请求成功,我们就会收到一个类似于索引时返回的内容

使用脚本进行更新
默认的脚本语言叫做MVEL,但是Elasticsearch也支持JavaScript, Groovy 以及 Python。MVEL是一个简单高效的JAVA基础动态脚本语言,它的语法类似于Javascript。

脚本语言可以在更新API中被用来修改_source中的内容,而它在脚本中被称为ctx._source。例如,我们可以使用脚本来增加博文中views的数字:

POST /website/blog/1/_update
{
   "script" : "ctx._source.views+=1"
}

我们同样可以使用脚本在tags数组中添加新的tag。在这个例子中,我们把新的tag声明为一个变量,而不是将他写死在脚本中。这样Elasticsearch就可以重新使用这个脚本进行tag的添加,而不用再次重新编写脚本了:

POST /website/blog/1/_update
{
   "script" : "ctx._source.tags+=new_tag",
   "params" : {
      "new_tag" : "search"
   }
}

获取文档,后两项发生了变化:

{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "1",
   "_version":  5,
   "found":     true,
   "_source": {
      "title":  "My first blog entry",
      "text":   "Starting to get the hang of this...",
      "tags":  ["testing", "search"], <1>
      "views":  1 <2>
   }
}
  1. tags数组中出现了search
  2. views字段增加了。

我们甚至可以使用ctx.op来根据内容选择是否删除一个文档:

POST /website/blog/1/_update
{
   "script" : "ctx.op = ctx._source.views == count ? 'delete' : 'none'",
    "params" : {
        "count": 1
    }
}

更新一篇可能不存在的文档

想象一下,我们可能需要在Elasticsearch中存储一个页面计数器。每次用户访问这个页面,我们就增加一下当前页面的计数器。但是如果这是个新的页面,我们不能确保这个计数器已经存在。如果我们试着去更新一个不存在的文档,更新操作就会失败。

为了防止上述情况的发生,我们可以使用upsert参数来设定文档不存在时,它应该被创建:

POST /website/pageviews/1/_update
{
   "script" : "ctx._source.views+=1",
  "upsert": {
       "views": 1
   }
}

首次运行这个请求时,upsert的内容会被索引成新的文档,它将views字段初始化为1。当之后再请求时,文档已经存在,所以脚本更新就会被执行,views计数器就会增加。

为了避免丢失数据,更新API会在获取步骤中获取当前文档中的_version,然后将其传递给重新索引步骤中的索引请求。如果其他的进程在这两部之间修改了这个文档,那么_version就会不同,这样更新就会失败。

对于很多的局部更新来说,文档有没有发生变化实际上是不重要的。例如,两个进程都要增加页面浏览的计数器,谁先谁后其实并不重要 —— 发生冲突时只需要重新来过即可。

你可以通过设定retry_on_conflict参数来设置自动完成这项请求的次数,它的默认值是0

POST /website/pageviews/1/_update?retry_on_conflict=5 <1>
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 0
   }
}
  1. 失败前重新尝试5次
这个参数非常适用于类似于增加计数器这种无关顺序的请求


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch中,更新数据有几种方式。其中一种方式是通过将旧文档标记为已删除,并增加一个全新的文档更新数据。虽然无法直接访问旧版本的文档,但它们并不会立即消失。随着索引更多的数据Elasticsearch会在后台清理这些已删除的文档。 另一种方式是使用ElasticSearch提供的丰富的操作数据的API来更新数据。可以使用相同的index API进行实现,通过执行PUT请求来替换现有的文档。这意味着无法直接修改文档,而是需要通过重建索引或替换的方式来更新文档。例如,可以执行以下请求来更新文档:PUT /website/blog/123 { "title": "My first blog entry", "text": "I am starting to get the hang of this...", "date": "2014/01/02" }<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [elasticsearch 更新修改数据(添加和删除字段等)](https://blog.csdn.net/qq_36951116/article/details/113353034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [关于ElasticSearch更新数据的几种方式](https://blog.csdn.net/weixin_38809962/article/details/79768002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值