美文网首页大数据&云计算Elasticsearch实践与分析系统运维专家
Elasticsearch写入时既要upsert又要实现部分更新

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

作者: bellengao | 来源:发表于2022-01-21 11:27 被阅读0次

背景

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

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

实现方式

部分更新文档的话就需要通过[update API] (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html) 实现,通过指定文档id来实现部分更新,部分更新可以通过plainless script或者指定doc字段来实现

另外,update API 可以实现upsert功能,在body中指定upsert字段来实现。
综上,最终通过如下方式解决了客户的需求:

  • 第一次写入,POST my_index/_update/1
    通过script脚本实现部分更新,以及指定upsert功能在文档1不存在时就插入:
{
  "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字段实现部分更新:

{
  "doc": {
    "a": 1,
    "b": 1
  },
  "upsert": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}
  • 查看写入结果, GET my_index/_doc/1
{
  "_index": "x",
  "_id": "1",
  "_version": 1,
  "_seq_no": 12,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}
  • 后续更新,方式和第一次写入相同,只不过传值不同,客户端对是要插入还是更新无感
{
  "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
  }
}

或者

{
  "doc": {
    "a": 2,
    "b": 2
  },
  "upsert": {
    "a": 1,
    "b": 1,
    "modify_at": 1634819527790
  }
}

  • 获取结果,GET my_index/_doc/1
{
  "_index": "x",
  "_id": "1",
  "_version": 2,
  "_seq_no": 13,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "a": 2,
    "b": 2,
    "modify_at": 1634819527790
  }
}

相关文章

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

    背景 客户为了实现search after功能,必须有一个modify_at字段在更新doc的时候不能修改,也就是...

  • upsert在mysql中的实现(附spark应用)

    upsert概述以及在mysql中的实现 spark写入mysql使用upsert 总结 upsert概述以及在m...

  • mongo学习(一)——CRUD命令

    插入数据 更新数据 upsert、multi为可选属性,默认为false upsert=true时,通过 未匹配到...

  • Mysql 实现upsert已有更新操作

    在看到了mongoTemplate的操作之后,觉得这种东西是很符合我们程序员世界的操作的,但是看到mysql的jd...

  • postgresql实战—窗口函数

    RETURNING返回更新后的数据 INSERT INTO ……RETURNING */id UPSERT:INS...

  • 既要,又要,还要

    记得有这样一个梗,一个人在找工作的时候说:“我想要一个工资高、待遇好、不辛苦又离家近的工作。”当时听到这个梗的时候...

  • 既要,又要,还要……

    蔡志忠说:人不能光想百分之百拥有一切,就算是上帝,有时候也需要妥协。 对照反思自我,一直如此贪心,想要的太多太多。...

  • 写好楷书,字体结构很重要

    最近在练习楷书,我觉得楷书最难的部分就是字体的结构,既要对称,又要均匀,稍微有一笔写歪了,或者长了,或者短了,整个...

  • 补习班

    矛盾:既要提高成绩,又要与报酬挂钩。既要丰富知识,又要短期内让各方都满意。

  • 既要牢记,又要忘却

    既要牢记,又要忘却 牢记自己的责任和使命 忘却自己的责任和使命,只专注在现在要做成的事情上,如此不断重复,必将成功。

网友评论

    本文标题:Elasticsearch写入时既要upsert又要实现部分更新

    本文链接:https://www.haomeiwen.com/subject/nyjehrtx.html