[英]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.