はじめに
こんにちは。この記事はElastic stack(Elasticsearch) Adventclendarの16日目です。
今回はElasticsearchのReindex APIの小ネタを紹介していきます。
Reindex APIとは
ElasticsearchのAPIでIndexからIndexへデータを転送するAPIです。
このAPIを使うことで、IndexのMappingを更新して新しいIndexを作成するといったことがElasticsearch内で完結してできます。
そんなReindex APIでできることを小ネタとして紹介していきます。
scriptを使ってIndex名の数字をインクリメントする。
Index名でバージョンを管理する際に便利な技です。
例えば「-1」という命名規則のIndexを「-2」にReindexするとします。*の部分にはさまざまなIndex名が入ります。
このようなときに一つずつIndex名を指定してReindexするのではなく、一括でReindexしてみます。
この動作をscriptを使って実現すると以下のようになります。
POST _reindex
{
"source": {
"index": "adventcalendar-1"
},
"dest": {
"index": "xxx"
},
"script": {
"source": """
int version = Integer.parseInt(ctx._index.substring(ctx._index.indexOf("-")+1, ctx._index.length()));
version = version + 1;
ctx._index = ctx._index.substring(0, ctx._index.indexOf("-")+1) + String.valueOf(version);
"""
}
}
やっていることとしては、ctx._indexでIndex名にアクセスして、version番号を取得したのち、インクリメントしてctx._indexに戻しているだけです。
scriptの中身はpainlessなのでこのような処理も可能になります。
Reindexが長すぎてTimeoutする場合の対処
Reindex APIを使用した際に対象のIndexのサイズが大きいとReindexが終わらずにGateway Timeoutを返されてしまうことがあります。
この場合、対処法としてはリクエストにwait_for_completion=false
をつけて実行することです。
そうすると、Reindex APIにリクエストを受け付けた段階で、すぐにレスポンスを返し、バックエンドでReindex処理を実行し続けます。
Reindexの処理を中断する
長いReindexを走らせたあと、自分のミスに気が付いて中断したくなることもよくあることです。
その場合はTask APIを使って処理を中断できます。
まずは、Task APIでReindex処理のIDを調べます。
リクエスト
GET _cat/tasks
結果
indices:data/write/reindex Hu66H8zuSeSsyHql434ClA:208844 - transport 1544961647974 12:00:47 11.6s 127.0.0.1 Hu66H8z
indices:data/write/bulk Hu66H8zuSeSsyHql434ClA:208989 Hu66H8zuSeSsyHql434ClA:208844 transport 1544961658339 12:00:58 1.3s 127.0.0.1 Hu66H8z
indices:data/write/bulk[s] Hu66H8zuSeSsyHql434ClA:208994 Hu66H8zuSeSsyHql434ClA:208989 transport 1544961658340 12:00:58 1.3s 127.0.0.1 Hu66H8z
indices:data/write/bulk[s] Hu66H8zuSeSsyHql434ClA:208993 Hu66H8zuSeSsyHql434ClA:208989 transport 1544961658340 12:00:58 1.3s 127.0.0.1 Hu66H8z
indices:data/write/bulk[s] Hu66H8zuSeSsyHql434ClA:208992 Hu66H8zuSeSsyHql434ClA:208989 transport 1544961658340 12:00:58 1.3s 127.0.0.1 Hu66H8z
indices:data/write/bulk[s][p] Hu66H8zuSeSsyHql434ClA:209006 Hu66H8zuSeSsyHql434ClA:208992 direct 1544961659439 12:00:59 221.6ms 127.0.0.1 Hu66H8z
Reindex処理のIDがHu66H8zuSeSsyHql434ClA:208844
であることがわかります。
では、上のIDの処理をキャンセルしましょう。
リクエスト
POST _tasks/Hu66H8zuSeSsyHql434ClA:208844/_cancel
そして、もう一度taskを調べると、、、
cluster:monitor/tasks/lists Hu66H8zuSeSsyHql434ClA:212440 - transport 1544962017169 12:06:57 116.7micros 127.0.0.1 Hu66H8z
cluster:monitor/tasks/lists[n] Hu66H8zuSeSsyHql434ClA:212441 Hu66H8zuSeSsyHql434ClA:212440 direct 1544962017169 12:06:57 56.7micros 127.0.0.1 Hu66H8z
無事キャンセルされていることがわかります。
まとめ
以上、Reindex APIの小ネタを紹介していきました。
日頃の開発やIndexの管理などで非常に便利なAPIなので、皆さんもぜひ活用してみてください。
それではまた。