前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch写入时既要upsert又要实现部分更新

Elasticsearch写入时既要upsert又要实现部分更新

原创
作者头像
bellen
发布2022-02-14 17:02:23
3K0
发布2022-02-14 17:02:23
举报

背景

客户为了实现search after功能,必须有一个modify_at字段在更新doc的时候不能修改,也就是更新的时候如果请求body里包含了这个modify_at字段,就不更新;但是同时又要保证upsert功能,在没有该文档的时候,就新增该文档。

梳理一下,客户的需求就是在upsert的同时,实现部分更新。

实现方式

部分更新文档的话就需要通过update API 实现,通过指定文档id来实现部分更新,部分更新可以通过plainless script或者指定doc字段来实现

另外,update API 可以实现upsert功能,在body中指定upsert字段来实现。

综上,最终通过如下方式解决了客户的需求:

  • 第一次写入,POST my_index/_update/1 通过script脚本实现部分更新,以及指定upsert功能在文档1不存在时就插入:
代码语言:txt
复制
{
  "script": {
    "source": "ctx._source.a = params.a;ctx._source.b = params.b;",
    "lang": "painless",
    "params": {
      "a": 1,
      "b": 1
    }
  },
  "upsert": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}

或者通过指定doc字段实现部分更新:

代码语言:txt
复制
{
  "doc": {
    "a": 1,
    "b": 1
  },
  "upsert": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}
  • 查看写入结果, GET my_index/_doc/1
代码语言:txt
复制
{
  "_index": "x",
  "_id": "1",
  "_version": 1,
  "_seq_no": 12,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}
  • 后续更新,方式和第一次写入相同,只不过传值不同,客户端对是要插入还是更新无感
代码语言:txt
复制
{
  "script": {
    "source": "ctx._source.a = params.a;ctx._source.b = params.b;",
    "lang": "painless",
    "params": {
      "a": 2,
      "b": 2
    }
  },
  "upsert": {
    "a": 2,
    "b": 2,
    "modify_at": 1634819527790
  }
}

或者

代码语言:txt
复制
{
  "doc": {
    "a": 2,
    "b": 2
  },
  "upsert": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}
  • 获取结果,GET my_index/_doc/1
代码语言:txt
复制
{
  "_index": "x",
  "_id": "1",
  "_version": 2,
  "_seq_no": 13,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "a": 2,
    "b": 2,
    "modify_at": 1634819527790
  }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 实现方式
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档