【问题标题】:Is it possible to upsert documents in elasticsearch based on a given field other than _id?是否可以根据 _id 以外的给定字段在弹性搜索中插入文档?
【发布时间】:2021-07-01 05:29:44
【问题描述】:

我有一个包含如下文档的索引

{ "StartId": "123a", "EndId": "123b", "Tag": "tag1" }
{ "StartId": "234a", "EndId": "234b", "Tag": "tag2" }
{ "StartId": "345a", "EndId": "345b", "Tag": "tag3" }
{ "StartId": "456a", "EndId": "456b", "Tag": "tag4" }

现在我有一个新文档 { "StartId": "567a", "EndId": "567b", "Tag": "tag5" }

如果索引中已经存在来自新文档的StartId,我想用新文档中的数据更新它,否则我想插入新文档。

我知道如何通过_id更新插入

POST test/_update/1
{
  "doc": {
    "name": "new_name"
  },
  "doc_as_upsert": true
}

但是是否可以通过_id 以外的任何字段进行更新插入?如果是,我该怎么做?

【问题讨论】:

    标签: elasticsearch upsert


    【解决方案1】:

    不,不可能一次性完成。

    doc_as_upsert 是为 Update API 保留的,它需要在请求的 URI 路径中使用 _id


    但是,您可以在不知道_id 的情况下通过Update by query API 更新文档:

    POST test-index/_update_by_query
    {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
          if (ctx._source['StartId'] == params['StartId']) {
            ctx._source.putAll(params['upsertWith']);
          }
        """,
        "lang": "painless",
        "params": {
          "StartId": "567a",
          "upsertWith": {
            "name": "new_name"
          }
        }
      }
    }
    

    但是更新插入是不可能的,因为ctx['_id'] is read-only。但是,您可以使用它来delete 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多