この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
経緯
とある調査で大量のログをOpenSearchから取得したくなりました
最初はsizeを100,000で設定して一括で取得しようとしたのですが、sizeの最大値は10,000とのことでしたので、エラーメッセージで推奨されたスクロールAPIを使用することにしました
OpenSearchのScrollAPIを実際に使ってみた
検索(1回目)
1回目は以下のクエリを実行します
レスポンスとして結果とscroll_idが返るので、scroll_idをメモしておきます
GET _search?pretty&scroll=1h
{ "version": true, "size": 10000, "sort": [ { "time": { "order": "asc", "unmapped_type": "boolean" } } ], "aggs": { "2": { "date_histogram": { "field": "time", "fixed_interval": "3h", "time_zone": "Asia/Tokyo", "min_doc_count": 1 } } }, "stored_fields": [ "*" ], "script_fields": { "body_bytes_sent_int": { "script": { "source": "if (doc.containsKey('body_bytes_sent') ) { \n\treturn Integer.parseInt(doc['body_bytes_sent.keyword'].value)\n}", "lang": "painless" } } }, "docvalue_fields": [ { "field": "time", "format": "date_time" } ], "_source": { "excludes": [] }, "query": { "bool": { "must": [], "filter": [ { "bool": { "should": [ { "query_string": { "fields": [ "request_body" ], "query": "*birthday*" } } ], "minimum_should_match": 1 } }, { "match_phrase": { "request_uri": "/api/account/profile_update" } }, { "match_phrase": { "app_version": "ios_4.0.29" } }, { "range": { "time": { "gte": "2023-07-14T15:00:00.000Z", "lte": "2023-07-21T14:59:59.999Z", "format": "strict_date_optional_time" } } } ], "should": [], "must_not": [] } }, "highlight": { "pre_tags": [ "@kibana-highlighted-field@" ], "post_tags": [ "@/kibana-highlighted-field@" ], "fields": { "*": {} }, "fragment_size": 2147483647 }
}
検索(2回目以降)
2ページ目以降は以下のクエリを実行すると取得できます
2回目の実行時は2ページ目、3回目の実行時は3ページ目が返る感じです
scroll_idパラメータには上で取得した値をセットします
scrollパラメータにはスナップショットを保存する期間をセットします
scrollパラメータなしで実行するとスナップショットが破棄?されてヒットしなくなるので気をつけてください
GET _search/scroll
{ "scroll" : "1h", "scroll_id": "FGlnY...(省略)...MUQ=="
}
スナップショットの削除
DELETE _search/scroll
{ "scroll_id": "FGlnY...(省略)...MUQ=="
}