簡體   English   中英

是否可以基於 _id 以外的給定字段在 elasticsearch 中插入文檔?

[英]Is it possible to upsert documents in elasticsearch based on a given field other than _id?

我有一個包含以下文檔的索引

{ "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進行 upsert

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

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

不,在一個 go 中是不可能的。

doc_as_upsert是為更新 API保留的,該更新需要請求的 URI 路徑中的_id


但是,您可以通過Update by query API在不知道_id的情況下更新文檔:

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"
      }
    }
  }
}

upserting是不可能的,因為ctx['_id']是只讀的 但是,您可以使用它刪除文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM