2015-11-22 31 views
3

重新索引數據我已經加入新的映射(主要是現有油田的not_analyzed版本),我現在必須弄清楚如何重新索引的現有數據。我試圖按照彈性搜索網站上的指南,但這太混亂了。我也試過使用插件(elasticsearch-reindex,allegro/elasticsearch-reindex-tool)。 我看過ElasticSearch - Reindexing your data with zero downtime這是一個類似的問題。我希望不必依靠外部工具(如果可能),並嘗試使用批量API(如原始插入)如何真正在elasticsearch

我可以很容易地重建整個索引,因爲它只是一個只讀數據,但它不會真正起作用從長遠來看,如果我在製作時需要添加更多的字段等。 我想知道是否有人知道ES的相關新手易於理解/遵循解決方案或步驟。我在版本2上,並使用Windows。

+0

您使用的是哪種版本的ElasticSearch?如果您使用的是2.3,則可以使用本機_reindex API。它可以做你正在尋找的東西。我不確定你指的是哪個指南(「彈性搜索網站上的指南」),但是這是reindex api上的文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current /docs-reindex.html 如果我沒有弄錯,可以重新索引到相同的索引中,從而有效地保留數據。有文檔版本問題,但您必須注意。 –

+0

是的,幾個月前我有這個問題,但我也注意到reindex API可用...無法驗證是否可以重新索引到相同的索引 – metase

+0

看來你不能重新索引到同一索引 – metase

回答

0

重新標定裝置來讀取數據,在elasticsearch刪除數據,並再次攝取數據。沒有像「改變現有數據映射到位」這樣的事情。您提到的所有重新索引工具都只是read-> delete->攝取的包裝器。
您可以隨時調整新索引的映射並稍後添加字段。所有的新字段都將根據這個映射進行索引。或者如果您不控制新字段,則使用動態映射。
查看Change default mapping of string to "not analyzed" in Elasticsearch,瞭解如何使用動態映射獲取字符串的not_analyze字段。

重新索引是非常昂貴的。更好的方法是創建一個新索引並刪除舊索引。爲了實現零停機,請爲所有客戶使用索引別名。考慮一個名爲「data-version1」的索引。在步驟:

  • 創建索引「的數據VERSION1」,並給它命名爲「數據」
  • 只使用別名「數據」,在所有的客戶端應用程序
  • 更新您的映射一個別名:創建一個名爲「數據版本2」,並把所有的數據在
  • 新指數(用新的映射)切換從VERSION1到版本2:滴上VERSION1別名「數據」和創建版本2的別名「數據」(或先創建,然後放下)。在這兩個步驟之間的時間您的客戶將沒有(或雙重)數據。但是在刪除和創建別名之間的時間應該很短,您的客戶不應該認出它。

這是很好的做法,始終使用別名。

+0

感謝您的回覆。我想更傾向於「零宕機」的方法。我可以再次推入另一個數據集,這需要15-20分鐘的時間,並且新版本的映射既有分析域也有未分析域(這是備份計劃)。真的,我想探索另一種在生產時不必這樣做的選擇 – metase

+0

只有在創建新索引時才能添加新的映射 - 抱歉,在我的文章中不清楚。我在上面添加了這個。大多數用戶在每個時間段都有單獨的指數(可以說每天)。然後,新的字段和/或新的映射應用於所有新創建的索引。我還在帖子中增加了一些關於零宕機的想法。 – dtrv

0

我面臨同樣的問題。但我找不到任何資源來更新當前的索引映射和分析器。我的建議是使用scroll and scan api並用新映射和新字段將數據重新索引到新索引。

0

隨着版本2.3.4新的API _reindex是否可用它將做什麼它說。基本用法是

{ 
    "source": { 
     "index": "currentIndex" 
    }, 
    "dest": { 
     "index": "newIndex" 
    } 
} 
+0

您可以從「currentIndex」重新索引到臨時索引,然後返回到「currentIndex」。您可以使用op_type和version_type參數來控制處理重複/覆蓋數據的方式。 –

+0

這就是我最終做的 – metase