この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
経緯
とある調査で大量のログを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=="
}