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

OpenSearch:スクロールクエリの実装のデモコード

最終更新日:Dec 28, 2024

環境変数の設定

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 件を超えるドキュメントが含まれている場合は、スクロールクエリを実行して、一致するすべての結果を取得できます。

使用上の注意

  • スクロールクエリは、一致するすべての結果を取得するために使用され、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();
                } // 1 秒間スレッドを休止させて、1 秒あたりのクエリ数(QPS)の過剰によるエラーを防ぎます。
            }


        } catch (OpenSearchException e) {
            e.printStackTrace();
        } catch (OpenSearchClientException e) {
            e.printStackTrace();
        }

    }
}