TORIPIYO DIARY

recent events, IoT, programming, security topics

ShellScriptを使ってElasticsearchから10000件以上のデータを取得する方法

Elasticsearchには1度のクエリーで取得できるドキュメントの数に制限があり、通常は1度で10000件まで取得することができます。

stackoverflow.com

10000件以上のドキュメントを取得したい場合はScrollを利用します。

www.elastic.co

Scrollを利用すると、サーバへの1回目のリクエストでは、クエリをボディにセットして投げますが、2度目以降は前のリクエストの応答で取得したscroll_idを用いて、データを取得します。

1回目のリクエス

  • scrollパラメータで、search contextをどれぐらいの期間有効化しておくのか指定します。search contextに指定する値は全てのデータを取得するまでに要する時間を指定しなくて大丈夫です。リクエストを投げる度に、そのリクエストに設定されたscrollパラメータの有効期間が更新されるので、前のリクエストを投げてデータを処理してから次のリクエストを投げるまでの間隔よりも長くなるように指定すれば十分です。大半のケースでは、scroll=1mの指定で十分だと思われます。
POST /twitter/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

2回目以降のリクエス

  • 1回目のリクエストのサーバからの応答で、scroll_idというパラメータを取得する事ができます。2回目以降のリクエストでは、その前の応答で取得したscroll_idの値をリクエストボディに設定する事で、10000件以上のドキュメントを順番に取得していく事ができます。
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

このように、scroll_idを継続的にリクエスト中に投げることで、10000件以上のドキュメントの場合でも取得することが出来ます。

このやり方にならって、Elasticsearchから10000件以上のデータを取得する操作を、シェルスクリプトにすると次のようになります。

  • query.json
    • elastisearchに投げるクエリーを記述
  • search.sh
    • 特定のindexからのみ検索する場合は、index変数を設定
    • TODO processというコメントの箇所に抽出したデータをどうやって処理するのか記載。このsearch.shでは、result.jsonというファイルの中に応答データをそのまま書き込んでいる。

このシェルスクリプトを利用すれば、scrollを使ってElasticsearchで10000件以上のデータを取得することが出来ます。MySQLなどと違って、ちょっと工夫が必要ですね。