簡體   English   中英

Elasticsearch在更新文檔時重新編制索引?

[英]Elasticsearch Reindexing while updating documents?

如果我更改了索引的映射並想要重新索引,該怎么辦?

我目前正在使用尚未具有reindex功能的Java API,因此使用bulk可以解決我的問題。 所以解決方案看起來像這樣

ref 如何通過Java API重新索引ElasticSearch

很久以前

  • 創建索引MY_INDEX_1
  • 為MY_INDEX_1創建映射
  • 創建別名MY_INDEX_1 - > MY_INDEX
  • 在MY_INDEX中創建文檔

是時候重新索引!

  • 項目清單
  • 創建索引MY_INDEX_2
  • 為MY_INDEX_2創建映射
  • 滾動搜索+批量從MY_INDEX_1到MY_INDEX_2的所有文檔

重命名和刪除舊索引

  • 創建別名MY_INDEX_2 - > MY_INDEX
  • 刪除別名MY_INDEX_1 - > MY_INDEX
  • 刪除索引MY_INDEX_1

但是,在重新索引所有文檔時會發生什么,從一個用戶更新在開頭重新編制索引的文檔。 或者重新索引和重命名別名之間的上述幸福感?

可能的解決方案 ?

  • 一種方法是使用外部版本,例如它不會覆蓋具有更高版本的文檔
  • 或者可以用另一種方式解決?
  • 或者在重命名別名和刪除my_index_1之間,重新索引自重建索引以來已編入索引的所有文檔? 但是,在重命名別名和第二次重建索引之間,文檔已經更新了
  • 或者我們應該在重建索引時鎖定? 似乎是一個糟糕的解決方案..

我認為這是你真正的問題:

但是,在重新索引所有文檔時會發生什么,從一個用戶更新在開頭重新編制索引的文檔。 或者重新索引和重命名別名之間的上述幸福感?

我剛剛問了一個非常接近的問題 ,但仍有問題需要單獨解決。 但是,我的研究讓我回答了這個問題。 有關詳細信息和參考,請參閱問題。

要回答您的問題,請在重建索引之前創建第二個別名。 我稱之為duplicate_write_alias並且你有你的應用程序,如果它看到了這個第二個別名,先通過兩個別名寫入舊索引和新索引。 (該命令對取消潛在比賽非常重要)。 索引完成后,索引過程將刪除此duplicate_write_alias ,並將MY_INDEX別名移動到新的MY_INDEX_2 ,如上所述。 一個原子命令中執行別名切換。

正如我在我的問題中所提到的,你仍然需要處理潛在的'索引不存在'錯誤,因為你的應用程序檢查是否存在別名和刪除了別名之間的剩余競爭。 我希望有一個比'總是寫兩次並忽略錯誤'或'檢查並希望最好'的答案更好的答案......

我認為還有另一種(更丑陋的方式):你可以在重建索引時禁用源索引的寫操作,這會導致暫時不可用的api,你不必:

  • 保持第二個存儲以保持真相
  • 處理不一致
  • 標記要在遷移后刪除的刪除文檔
  • 您可以使用彈性搜索引擎存儲在indecies之間創建快照
  • 您可以通知api用戶稍后再次發送更改(索引完成時)

缺點:

  • 至少對於寫操作,您有停機時間
  • 如果索引不能設置為allow-writes-again模式(自動恢復等),則需要更多邏輯來處理錯誤
  • 保持多個索引會導致使用更多的存儲空間。

有關詳細信息,請訪問: https//www.elastic.co/guide/en/elasticsearch/reference/6.2/index-modules.html

暫無
暫無

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

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