簡體   English   中英

在 OpenSearch 更新操作中需要外部版本支持

[英]Need external version support in OpenSearch Update operation

我正在使用 OpenSearch 為 JSON 個文檔編制索引並使它們可搜索。 所有文檔都有 EPOCH 格式的更新時間戳字段。 問題是我可以獲得更新請求,其中文檔正文包含較舊的更新時間。 如果當前文檔更新時間早於存儲在 OpenSearch 中的現有文檔中的更新時間字段,我的應用程序應跳過更新

為了滿足要求,我在 HTTP 請求/test_index/_update/123?version=1674576432910&version_type=external中添加了外部版本。

但我收到錯誤

驗證失敗:1:內部版本控制不能用於樂觀並發控制。 請改用 if_seq_no 和 if_primary_term

我閱讀了if_seq_noif_primary_term字段。 它們不能用來解決我的問題。 還有其他人遇到過這個問題並解決了嗎? 請分享。 或者,如果有人知道我可以安裝任何插件來支持它,請分享。

您應該使用“if_seq_no”和“if_primary_term”參數來執行樂觀並發控制。

要解決您的問題,您可以先使用文檔 ID 從 OpenSearch 檢索現有文檔,然后檢查更新時間戳字段。 如果現有時間戳比更新請求中的時間戳新,則可以跳過更新。 否則,您可以在更新請求中包含“if_seq_no”和“if_primary_term”參數以及更新的文檔。 “if_seq_no”參數應設置為現有文檔的序號,“if_primary_term”參數應設置為現有文檔的主詞條。

您可以為此使用更新 API...或基於 _seq_no 和 _primary_term 字段組合的樂觀並發控制 (OCC) 機制。

遺憾的是,OpenSearch 和 ElasticSearch 都不支持更新請求中的外部版本。 而且我看不到在不久的將來會添加該功能。 您可以使用腳本來解決您的特定問題。 OpenSearch 支持多種腳本語言,包括 Painless 腳本。 您可以編寫一個腳本來比較特定字段(在您的情況下更新時間戳)。 如果條件為真,它將提前 go 並使用新值更新字段。

{
    "script": {
        "lang": "painless",
        "source": "if (params.updateTimestamp > ctx._source.updateTimestamp) {for (entry in params.entrySet()) {ctx._source[entry.getKey()] = entry.getValue();}}"
    }
}

您可以在上面看到一個示例腳本,如果新文檔具有較舊的時間戳,它將靜默跳過任何更新。 您甚至可以拋出異常並從您的應用程序中處理它。 這樣您就可以跟蹤此類問題的請求數量。

您可以使用與存儲腳本類似的腳本並在更新請求中使用它。 您可以在本文中獲得更多詳細信息,包括示例 HTTP 請求和 Java 代碼。

暫無
暫無

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

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