from 30

30歳からwebエンジニアになったけど、思ったよりも苦しいので、その苦闘の記録をば

Elasticserachでreindexを使ってみる

経緯

Elasticsearhのmappingsは追加はできても変更ができない。 変更したい場合は、indexを削除する必要がある。 でも、結構間違えたりするのでreindexでデータを退避したので その方法を書いておく

流れ

  1. reindexする元のsettingsとmappingsを使用して、reindex先のindexを作成
  2. reindexをする
  3. 適宜失敗データの対処をする
  4. reindex元のindexを削除
  5. reindex元に修正後のsettings, mappingsを作成
  6. 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秒ほどの時間がかかった。 思ったよりも手軽にできそう。