2017-10-18 148 views
0

因此,我們需要將Elasticsearch文檔從一個索引重新索引到另一個索引。我們正在使用reindex API。儘管有時文檔已經存在於目標索引中。設置version_type: "external"可以使目標索引中的文檔更新,這非常有效,除非它執行完整更新,我希望它在該文檔上執行部分更新。 像設置ctx.op = "partial"就好,但它顯然沒有實施到今天。 任何可以實現這一點的替代想法將不勝感激。Elasticsearch reindex API部分更新

PS:我想避免查詢每個文檔的源索引,並用upsert單獨發送到目的地,由於性能原因,與reindex API相比,它似乎很慢。

回答

0

免責聲明:此答案已更新。

要實現部分更新,您可以定義script)。

從理論上講,您可以將所需的任何轉換應用於要重新編制索引的文檔。

(原來的答案結束)


實現自定義重新索引與合併

正如指出的問題的作者,如果需要合併兩個沒有幫助文件,已經存在於結果索引中的文件和新文件。

Elasticsearch _reindex方法被引入version 2.3並被認爲是實驗;它看起來好像只是一個scroll查詢與bulk insert API的組合。我做出這個結論基於這樣this page權威指南中的建議,以重新編制這樣你的數據的事實:

重新索引所有的文件從舊索引效率,使用滾動從舊檢索文檔批索引和批量API將它們推送到新索引中。

現在,爲了解決部分更新的需要。重新索引 - 合併的方法可以粗略地分爲四個階段:

  1. 從索引乙從索引讀取文件A
  2. 讀取文檔
  3. 合併文件
  4. 插入新的文檔轉換成乙

階段1和4實際上是reindex調用的原始場景;現在需要與其他索引合併併合並文檔。

我建議編寫一個自定義腳本,並使用scroll以流式方式讀取索引A,批量API用於從索引B檢索文檔,用於合併文檔的自定義代碼和用於插入文檔的批量API。這種腳本的性能至少可以與原始的reindex實現相媲美。 (同時請確保您使用index performance tuning tips查看此頁面,特別是增加/禁用index.refresh_interval。)

當然還有其他選項,與ElasticSearch無關,並且此問題的作者可能已經考慮了哪些選項像轉儲這兩個索引,將它們與自定義代碼結合起來並插入新索引)。

希望這會有所幫助。

+0

是的,但除非我弄錯了,這種轉換將應用於來自源索引的數據,而不適用於目標文檔本身 – SebScoFr

+0

@SebScoFr是的,您是對的。我將刪除我的答案,因爲它不相關。 –