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

OpenSearch:スクロールクエリを実装するためのデモコード

最終更新日:Feb 27, 2025

通常の検索では、最大 5,000 件のドキュメントが返されます。ただし、シナリオによっては、分析のためにさらに多くの結果が必要になる場合があります。この場合、スクロールクエリを実行して、より多くの検索結果を取得できます。

環境変数を設定する

ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数と ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を構成します。

重要
  • Alibaba Cloud アカウントの AccessKey ペアを使用すると、すべての API 操作にアクセスできます。API 操作の呼び出しや日常の O&M の実行には、Resource Access Management (RAM) ユーザーを使用することをお勧めします。RAM ユーザーの使用方法については、「RAM ユーザーを作成する」をご参照ください。

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

  • RAM ユーザーの AccessKey ペアを使用する場合は、Alibaba Cloud アカウントを使用して、必要な権限が AliyunServiceRoleForOpenSearch ロールに付与されていることを確認してください。詳細については、「AliyunServiceRoleForOpenSearch」および「アクセス認証ルール」をご参照ください。

  • プロジェクトコードなど、他の人が簡単にアクセスできる資料に AccessKey ペアを含めないことをお勧めします。そうしないと、AccessKey ペアが漏洩し、アカウント内のリソースが安全でなくなる可能性があります。

  • Linux および macOS

    次のコマンドを実行します。<access_key_id> および <access_key_secret> を、使用する RAM ユーザーの AccessKey ID と AccessKey シークレットに置き換えます。

    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 シークレットを設定します。

    2. AccessKey ペアを有効にするには、Windows を再起動します。

OpenSearch SDK for Java V4.0.0 を使用したスクロールクエリを実装するためのデモコード

機能と適用可能なシナリオ

通常のクエリの戻り結果には、5,000 件を超えるドキュメントを含めることはできません。結果に 5,000 件を超えるドキュメントが含まれている場合は、スクロールクエリを実行して、一致するすべての結果を取得できます。

使用上の注意

  • スクロールクエリの戻り結果は、fullJSON 形式と JSON 形式のみをサポートしています。

  • スクロールクエリは、一致するすべての結果を取得するために使用され、aggregate、distinct、または rank 句はサポートしていません。

  • config 句で指定した start パラメーターは、スクロールクエリには適用されません。デフォルト値 0 が使用されます。表示する結果ページを指定することはできません。スクロールクエリの場合、各結果セットのドキュメント数は 500 を超えることはできません。

  • 最初のスクロールクエリを実行すると、スクロール ID が返されます。ドキュメントデータを取得するには、このスクロール ID を使用してスクロールクエリを再度実行します。

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

OpenSearch SDK for Java によって提供されるデモコード

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) {
    // AccessKey ペアを指定します。
    // 環境変数から AccessKey ID と AccessKey シークレットを取得します。このコードを実行する前に、環境変数を設定する必要があります。
    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 openSearch = new OpenSearch(accesskey, secret, host);

    // OpenSearch オブジェクトをパラメーターとして使用して、OpenSearchClient オブジェクトを作成します。
    OpenSearchClient serviceClient = new OpenSearchClient(openSearch);

    // OpenSearchClient オブジェクトをパラメーターとして使用して、SearcherClient オブジェクトを作成します。
    SearcherClient searcherClient = new SearcherClient(serviceClient);

    // Config オブジェクトを作成し、config 句を使用して、アプリケーション名、ページング関連のパラメーター、戻り結果のデータ形式などのパラメーターを設定します。
    Config config = new Config(Lists.newArrayList(appName));

    config.setStart(start); // config 句で指定した start パラメーターは、スクロールクエリには適用されません。デフォルト値 0 が使用されます。
    config.setHits(5); // 各ページに表示するドキュメント数を指定します。この例では、数は 5 に設定されています。

    // 戻り結果のデータ形式を指定します。サポートされている形式は JSON と FULLJSON です。この例では、データ形式は FULLJSON に設定されています。
    config.setSearchFormat(SearchFormat.FULLJSON);

    // 検索結果に返すフィールドを指定します。
    config.setFetchFields(
      Lists.newArrayList(
        "id",
        "name",
        "phone",
        "int_arr",
        "literal_arr",
        "float_arr",
        "cate_id"
      )
    );
    // 注:config 句の rerank_size パラメーターは、Rank クラスの setReRankSize メソッドを使用して指定されます。

    // SearchParams オブジェクトを作成します。
    SearchParams searchParams = new SearchParams(config);

    // query 句を指定します。複数のキーワードを指定して、複数のインデックスフィールドに基づいてクエリを実行できます。この場合、1 つの setQuery 呼び出しでインデックスフィールドを指定する必要があります。個別の setQuery 呼び出しで各インデックスフィールドを指定すると、最後の句が前の句を上書きします。
    searchParams.setQuery("name:'opensearch'");

    // フィルター条件を指定します。
    searchParams.setFilter("cate_id<=3"); // SearchParamsBuilder クラスを使用してフィルター条件を設定することもできます。

    // ソート条件を指定します。
    Sort sorter = new Sort();
    sorter.addToSortFields(new SortField("id", Order.DECREASE)); // ドキュメントのソート基準となるフィールドとソート方法を指定します。この例では、ドキュメントは id フィールドに基づいて降順にソートされます。

    // Sort オブジェクトをクエリパラメーターとして追加します。
    searchParams.setSort(sorter);

    // 反復スクロールクエリを実装するために DeepPaging オブジェクトを作成します。
    DeepPaging deep = new DeepPaging();
    // 次のスクロールクエリで使用されるスクロール ID の有効期間を分単位で指定します。デフォルト値:1m。この例では、値は 3m に設定されています。
    deep.setScrollExpire("3m");

    // DeepPaging オブジェクトをクエリパラメーターとして追加します。
    searchParams.setDeepPaging(deep);

    // SearchParamsBuilder オブジェクトを作成します。SearchParams のユーティリティクラスである SearchParamsBuilder クラスを使用すると、クエリ関連のパラメーターを簡単に設定できます。
    SearchParamsBuilder paramsBuilder = SearchParamsBuilder.create(
      searchParams
    );

    // フィルター条件を指定します。
    //        paramsBuilder.addFilter("cate_id<=0", "AND");

    // クエリを実行し、結果を返します。ステータス情報ではなく、エラーコードとメッセージに基づいてエラーが発生したかどうかを判断します。エラーの詳細については、「エラーコード」のトピックを参照してください。
    SearchResult searchResult;
    try {
      searchResult = searcherClient.execute(paramsBuilder);
      String result = searchResult.getResult();
      JSONObject obj = new JSONObject(result);

      // 戻り結果に 25 件のドキュメントが含まれており、各ページに表示されるドキュメント数が 5 に設定されている場合、戻り結果の 6 ページ目は空になります。
      for (int i = 1; i <= 6; i++) {
        // 最初のスクロールクエリを実行すると、スクロール ID が返されます。ドキュメントデータを取得するには、このスクロール ID を使用してスクロールクエリを再度実行します。
        deep.setScrollId(
          new JSONObject(obj.get("result").toString())
            .get("scroll_id")
            .toString()
        );
        deep.setScrollExpire("3m"); // 次のスクロールクエリで使用されるスクロール ID の有効期間を分単位で指定します。デフォルト値:1m。この例では、値は 3m に設定されています。デフォルト値を使用しない場合は、スクロールクエリを実行するたびに有効期間を設定する必要があります。
        searchResult = searcherClient.execute(paramsBuilder);
        result = searchResult.getResult();
        obj = new JSONObject(result);

        // 検索結果を表示します。
        System.out.println("クエリ番号 " + i + " の結果: " + obj.get("result"));
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        } // クエリ/秒 (QPS) が過剰になることによって発生するエラーを防ぐために、スレッドを 1 秒間休止します。
      }
    } catch (OpenSearchException e) {
      e.printStackTrace();
    } catch (OpenSearchClientException e) {
      e.printStackTrace();
    }
  }
}