アプリ王国って?

OpenSearchのScrollAPIを使ってみた

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

経緯

とある調査で大量のログを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=="
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です