Elasticserachでreindexを使ってみる
経緯
Elasticsearhのmappingsは追加はできても変更ができない。 変更したい場合は、indexを削除する必要がある。 でも、結構間違えたりするのでreindexでデータを退避したので その方法を書いておく
流れ
- reindexする元のsettingsとmappingsを使用して、reindex先のindexを作成
- reindexをする
- 適宜失敗データの対処をする
- reindex元のindexを削除
- reindex元に修正後のsettings, mappingsを作成
- 2.の逆方向のreindexをする
シナリオ
以下、サンプルコードを貼っていくが、
- reindex元のindex = original
- reindex先のindex = destination
って感じの前提でみてください。
1. reindexする元のsettingsとmappingsを使用して、reindex先のindexを作成
GET /original/_settings GET /original/_mapping PUT /destination/ { "settings": {}, "mapping": {} }
2. reindexをする
POST _reindex { "source": { "index": "destination" }, "dest": { "index": "original" } }
3. 適宜失敗データの対処をする
失敗データがレスポンスされるので適宜対処する
4. reindex元のindexを削除
DELETE /original
5. reindex元に修正後のsettings, mappingsを作成
適宜修正
- keyword型 => text型
- integer型 => keyword型
などの修正の場合はおそらくreindexで戻してくる時にエラーは出ないが、 それ以外の時は注意する。
6. 2.の逆方向のreindexをする
POST _reindex { "source": { "index": "original" }, "dest": { "index": "destination" } }
最後に
70万件程度のデータで180秒ほどの時間がかかった。 思ったよりも手軽にできそう。