Elasticsearch 的重新索引 (reindex)

為什麼需要重新索引呢? 因為當你用不論什麼方法試圖改變現有索引的欄位型態, 他是不會生效的. 一個索引裡面的欄位一旦被定義了, 直到索引消失的那一刻, 他都會死守他的欄位型態!

Elasticsearch 能夠讓你有一些預設的mapping, 但千萬別太相信他, 否則你會在早上八點的時候發現這個世界的黑暗.

elasticsearch 以 utc+0 時間運作, 每天早上八點就是潛在災難的發生時間 ( 誤.. 是索引的創建時間

首先, 請先創建能讓索引乖乖聽話的模板, 不懂的同學先到這邊看一下哦 Elasticsearch 的映射

然後呢, 因為索引的映射是在他出生那一刻就定好了, 咱辦? 這邊提供三種解決方案, 假設你的索引名稱是myindex

1.你不在乎那個索引裡面的舊資料

刪除整個索引, 資料一定是砍掉了
簡易指數: ★★★★★
災難指數: ★★★★★

好啊你, 吃軟不吃硬是吧, 看我把你辦了
curl -XDELETE http://127.0.0.1:9200/myindex
然後下次資料進來的時候, 索引再次生成, 你就可以看到正確的映射了
同時你可能會聽到辦公室開始有奇怪的哭嚎聲.


2.你在乎索引裡面的舊資料, 允許短暫的downtime

就一下下而已, 理解下, 理解下
簡易指數: ★★★
災難指數: ★

這方式的話, 是我比較常用的, 可以用我做好的腳本. elasticsearch-reindex-script
原理就是先創建一個myindex_dummy, 並且他有命中到你配置的模板, 所以他的映射會是正確的.
然後把資料轉移過去, 砍掉現在的myindex, 然後在轉移回來. 以四兩撥千金的姿態完成這項任務.


3.你在乎索引裡面的舊資料, 業務面不允許任何downtime

鐵人挑戰, 開始
用 alias 的方式做, 明天驗證補上結果 (:з」∠)

https://www.elastic.co/blog/changing-mapping-with-zero-downtime