LoginSignup
11

More than 5 years have passed since last update.

ElasticsearchのReindex APIで小ネタ紹介

Posted at

はじめに

こんにちは。この記事は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なので、皆さんもぜひ活用してみてください。
それではまた。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11