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

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

最終更新日:Apr 02, 2026

DeepPageingIterator を使用すると、スクロール ID を追跡することなく、大規模な結果セットをページングできます。hasNext() および next() の各呼び出しは、基盤となるスクロールセッションを自動的に管理するため、セッションの状態ではなく結果の処理に集中できます。

前提条件

始める前に、以下を確認してください。

  • OpenSearch アプリケーションと、少なくとも 1 つの検索可能なテーブル

  • 必要な権限を持つ RAM ユーザー(「アクセス権限付与ルール」を参照)

  • OpenSearch SDK for Java V4.0.0 がプロジェクトに追加されていること

認証情報の設定

ご利用の AccessKey ペアを環境変数として保存します。認証情報をソースコードにハードコードしないでください。

Linux および macOS

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

<access_key_id><access_key_secret> を、ご利用の RAM ユーザーの AccessKey ID と AccessKey Secret に置き換えます。

Windows

  1. 環境変数ファイルを作成し、ご利用の AccessKey ID と AccessKey Secret を使用して ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET を追加します。

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

重要

Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションにアクセスできます。API 呼び出しおよび日常的な運用および保守には、Resource Access Management (RAM) ユーザーを使用してください。RAM ユーザーの作成方法の詳細については、「RAM ユーザーの作成」および「AccessKey ペアの作成」をご参照ください。RAM ユーザーを使用する場合は、AliyunServiceRoleForOpenSearch ロールに必要な権限が付与されていることを確認してください。「AliyunServiceRoleForOpenSearch」について詳しくは、こちらをご参照ください。

制限事項

スクロールクエリには、次の制約があります。

  • aggregatedistinct、および rank 句はサポートされていません。

  • ソートは単一フィールドのみでサポートされています。

  • config 句の start パラメーターは効果がありません。デフォルト値の 0 が常に使用されます。

仕組み

SDK は、オブジェクトのチェーンを通じてスクロールセッションを構築します。

  1. OpenSearch — ご利用の認証情報と API エンドポイントで初期化されます

  2. OpenSearchClientOpenSearch オブジェクトをラップします

  3. SearcherClientOpenSearchClient オブジェクトをラップします

  4. Config — アプリケーション名、ページあたりのヒット数、返されるフィールド、およびデータ形式を定義します

  5. SearchParams — クエリ、フィルター、ソート条件、および DeepPaging オブジェクトを保持します

  6. DeepPageingIterator — スクロールループを駆動します。next() 呼び出しごとに次のページをフェッチし、スクロール ID を自動的に進めます

ステータスフィールドではなく、エラーコードとメッセージに基づいてエラーが発生したかどうかを判断します。「エラーコード」をご参照ください。

反復スクロールクエリの実装

次の例では、OpenSearch SDK for Java V4.0.0 を使用しています。DeepPageingIterator はスクロール ID の管理を自動的に処理するため、リクエスト間でスクロール ID を渡す必要はありません。

package com.aliyun.opensearch;

import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.generated.OpenSearch;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.search.DeepPageingIterator;
import java.nio.charset.Charset;

public class testScrollIterator {

    // スクロールクエリは、aggregate、distinct、または rank 句をサポートしていません。
    // また、単一フィールドでのソートのみをサポートしています。
    private static String appName = "管理する OpenSearch アプリケーションの名前";
    private static String tableName = "データがアップロードされるテーブルの名前";
    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 -> OpenSearchClient -> SearcherClient。
        OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
        OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
        SearcherClient searcherClient = new SearcherClient(serviceClient);

        // クエリを設定します: アプリケーション名、ページあたりのヒット数、返されるフィールド、データ形式。
        Config config = new Config(Lists.newArrayList(appName));
        // start パラメーターはスクロールクエリに効果がありません。デフォルト値 0 が使用されます。
        config.setStart(start);
        // ページあたり 5 つのドキュメントを返します。
        config.setHits(5);
        // サポートされている形式: JSON および FULLJSON。
        config.setSearchFormat(SearchFormat.FULLJSON);
        config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
        // 注: rerank_size パラメーターは、Rank クラスの setReRankSize メソッドを介して設定します。

        // クエリ、フィルター、ソート条件を定義します。
        SearchParams searchParams = new SearchParams(config);
        // 複数のインデックスフィールドを検索するには、1 回の setQuery 呼び出しですべてのフィールドを指定します。
        // 複数の setQuery 呼び出しは互いに上書きします。最後のものだけが有効になります。
        searchParams.setQuery("name:'opensearch'");
        searchParams.setFilter("cate_id<=3");

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

        // スクロールクエリを有効にするために DeepPaging オブジェクトをアタッチします。
        DeepPaging deep = new DeepPaging();
        searchParams.setDeepPaging(deep);

        // イテレーターを作成します。スクロール ID を自動的に管理します。
        DeepPageingIterator pagesIterator = new DeepPageingIterator(searcherClient, searchParams);
        // ページフェッチ間の間隔をミリ秒単位で設定します。
        // デフォルトは 100 ミリ秒です。スループットのニーズに基づいて調整してください。
        pagesIterator.setPagingIntervals(80);

        // すべてのページを反復処理します。
        // ステータスフィールドではなく、エラーコードとメッセージをチェックして障害を検出します。
        try {
            System.out.println("test");
            while (pagesIterator.hasNext()) {
                System.out.println("デバッグ情報:" + pagesIterator.next());
            }
        } catch (Exception ex) {
            System.out.println("エラーメッセージ:" + ex.getMessage());
        }
    }
}

主要パラメーター

パラメーターメソッド説明デフォルト
ページあたりのヒット数config.setHits(n)ページあたりに返されるドキュメントの数
データ形式config.setSearchFormat(...)戻り形式: JSON または FULLJSON
返されるフィールドconfig.setFetchFields(...)各結果に含まれるフィールドのリスト
クエリsearchParams.setQuery(...)クエリ句。1 回の呼び出しですべてのインデックスフィールドを指定します
フィルターsearchParams.setFilter(...)結果に適用されるフィルター条件
ソートsearchParams.setSort(...)ソートフィールドと方向。スクロールクエリは 1 つのフィールドのみをサポートします
ページング間隔pagesIterator.setPagingIntervals(ms)ページフェッチ間の遅延 (ミリ秒単位)100 ミリ秒

次のステップ