すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:スクロールクエリのデモ

最終更新日:Apr 02, 2026

通常の検索では、最大 5,000 ドキュメントが返されます。バッチデータのエクスポート、分析パイプライン、または機械学習タスクなど、大規模な結果セットを取得する場合は、代わりにスクロールクエリをご利用ください。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • インデックス化されたデータを持つ OpenSearch アプリケーション

  • 必要な権限を持つ Resource Access Management (RAM) ユーザーの AccessKey ペア。 「RAM ユーザーの作成」および「アクセス権限付与ルール」をご参照ください。

  • プロジェクトの依存関係に OpenSearch SDK for Java V4.0.0 が追加済みであること

重要

Alibaba Cloud アカウントのルート認証情報ではなく、RAM ユーザーの AccessKey ペアを使用してください。ルート AccessKey ペアは、すべての API への無制限のアクセス権を持ちます。AccessKey ペアをソースコードやバージョン管理に含めないようにしてください。設定の詳細については、「AliyunServiceRoleForOpenSearch」をご参照ください。

制限事項

制約詳細
サポートされる応答フォーマットfullJSON および JSON のみ
非サポートの句aggregate、distinct、rank
1 回のスクロールページあたりの最大ドキュメント数500
start パラメーターの動作無視されます — 常に位置 0 から開始します

環境変数の設定

デモコードを実行する前に、AccessKey ペアを環境変数として登録してください。

Linux および macOS

<access_key_id> および <access_key_secret> を、RAM ユーザーの AccessKey ID および AccessKey Secret に置き換えてください。

export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>

Windows

  1. 環境変数ファイルを作成し、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET を環境変数として登録します。値には、それぞれ AccessKey ID および AccessKey Secret を指定してください。

  2. 変更を有効にするために Windows を再起動します。

AccessKey ペアの作成の詳細については、「AccessKey ペアを作成する」をご参照ください。

スクロールクエリの仕組み

スクロールクエリは、以下の 3 つのフェーズで実行されます。

  1. 初期リクエスト — 最初の結果バッチとスクロール ID を取得するために、DeepPaging オブジェクトを含むクエリを送信します。

  2. 後続のリクエスト — 前回の応答から取得したスクロール ID を次のリクエストに渡して、次の結果バッチを取得します。結果セットが空になるまで繰り返します。

  3. 有効期限切れ — 各スクロール ID には有効期間(デフォルト:1 分)があります。必要に応じて、各リクエストの前に有効期限を延長してください。

デモコード

以下の例では、name:'opensearch' および cate_id<=3 に一致するすべてのドキュメントを取得し、id を降順でソートします。1 ページあたり 5 ドキュメント、合計 25 ドキュメントの場合、ループは 6 回実行されます。最後の反復では空の結果セットが返されます。

すべてのリクエストでは、DeepPaging オブジェクトを使用してスクロール ID を渡し、有効期間を設定します。

package com.aliyun.opensearch;

import com.aliyun.opensearch.OpenSearchClient;
import com.aliyun.opensearch.SearcherClient;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.dependencies.org.json.JSONObject;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchClientException;
import com.aliyun.opensearch.sdk.generated.commons.OpenSearchException;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.sdk.generated.search.general.SearchResult;
import com.aliyun.opensearch.search.SearchParamsBuilder;
import java.nio.charset.Charset;

public class testScroll {

  // スクロールクエリでは、aggregate、distinct、rank 句はサポートされず、
  // ソートは単一フィールドのみ可能です。
  private static String appName = "管理対象の OpenSearch アプリケーション名";
  private static String host = "ご利用のリージョンにおける OpenSearch API のエンドポイント";

  public static void main(String[] args) {
    // 認証情報を環境変数から読み込みます。
    // このコードを実行する前に、環境変数を設定してください。
    String accesskey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    String secret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");

    System.out.println(
      String.format("file.encoding: %s", System.getProperty("file.encoding"))
    );
    System.out.println(
      String.format("defaultCharset: %s", Charset.defaultCharset().name())
    );

    // クライアントを初期化します。
    OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
    OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
    SearcherClient searcherClient = new SearcherClient(serviceClient);

    // クエリを設定します:アプリケーション名、ページサイズ、応答フォーマット、取得フィールド。
    Config config = new Config(Lists.newArrayList(appName));
    config.setStart(start); // スクロールクエリでは start パラメーターは無視され、位置は常に 0 から開始します。
    config.setHits(5);      // 1 ページあたり 5 ドキュメントを返します。
    config.setSearchFormat(SearchFormat.FULLJSON);
    config.setFetchFields(
      Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id")
    );

    SearchParams searchParams = new SearchParams(config);
    searchParams.setQuery("name:'opensearch'");
    searchParams.setFilter("cate_id<=3");

    Sort sorter = new Sort();
    sorter.addToSortFields(new SortField("id", Order.DECREASE)); // id で降順ソートします。
    searchParams.setSort(sorter);

    // スクロールクエリを有効化するための DeepPaging オブジェクトを作成します。
    // スクロール ID の有効期間を 3 分間に設定します(デフォルト:1 分)。
    DeepPaging deep = new DeepPaging();
    deep.setScrollExpire("3m");
    searchParams.setDeepPaging(deep);

    SearchParamsBuilder paramsBuilder = SearchParamsBuilder.create(searchParams);

    // ステップ 1:最初のスクロールクエリを送信し、最初のスクロール ID を取得します。
    SearchResult searchResult;
    try {
      searchResult = searcherClient.execute(paramsBuilder);
      String result = searchResult.getResult();
      JSONObject obj = new JSONObject(result);

      // ステップ 2:各応答から取得したスクロール ID を使用して、次のバッチを取得します。
      // 25 ドキュメント、1 ページあたり 5 ドキュメントの場合、6 回目の反復で空の結果セットが返されます。
      for (int i = 1; i <= 6; i++) {
        // 最初のスクロールクエリ実行時に返されたスクロール ID を使用して、再度スクロールクエリを実行します。
        deep.setScrollId(
          new JSONObject(obj.get("result").toString())
            .get("scroll_id")
            .toString()
        );
        deep.setScrollExpire("3m"); // 各リクエストの前に有効期間を再設定します。
        searchResult = searcherClient.execute(paramsBuilder);
        result = searchResult.getResult();
        obj = new JSONObject(result);

        System.out.println("クエリ No." + i + " の結果: " + obj.get("result"));

        // QPS 制限内に収めるため、リクエスト間で 1 秒の待機を行います。
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    } catch (OpenSearchException e) {
      e.printStackTrace();
    } catch (OpenSearchClientException e) {
      e.printStackTrace();
    }
  }
}
ステータスフィールドではなく、応答内のエラーコードおよびメッセージを使用してエラーを確認してください。エラーの詳細については、「エラーコード」をご参照ください。

次のステップ