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
環境変数ファイルを作成し、ご利用の AccessKey ID と AccessKey Secret を使用して
ALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRETを追加します。変更を有効にするには、Windows を再起動します。
Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションにアクセスできます。API 呼び出しおよび日常的な運用および保守には、Resource Access Management (RAM) ユーザーを使用してください。RAM ユーザーの作成方法の詳細については、「RAM ユーザーの作成」および「AccessKey ペアの作成」をご参照ください。RAM ユーザーを使用する場合は、AliyunServiceRoleForOpenSearch ロールに必要な権限が付与されていることを確認してください。「AliyunServiceRoleForOpenSearch」について詳しくは、こちらをご参照ください。
制限事項
スクロールクエリには、次の制約があります。
aggregate、distinct、およびrank句はサポートされていません。ソートは単一フィールドのみでサポートされています。
config 句の
startパラメーターは効果がありません。デフォルト値の0が常に使用されます。
仕組み
SDK は、オブジェクトのチェーンを通じてスクロールセッションを構築します。
OpenSearch— ご利用の認証情報と API エンドポイントで初期化されますOpenSearchClient—OpenSearchオブジェクトをラップしますSearcherClient—OpenSearchClientオブジェクトをラップしますConfig— アプリケーション名、ページあたりのヒット数、返されるフィールド、およびデータ形式を定義しますSearchParams— クエリ、フィルター、ソート条件、およびDeepPagingオブジェクトを保持します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 ミリ秒 |