通常の検索では、最大 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
環境変数ファイルを作成し、
ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRETを環境変数として登録します。値には、それぞれ AccessKey ID および AccessKey Secret を指定してください。変更を有効にするために Windows を再起動します。
AccessKey ペアの作成の詳細については、「AccessKey ペアを作成する」をご参照ください。
スクロールクエリの仕組み
スクロールクエリは、以下の 3 つのフェーズで実行されます。
初期リクエスト — 最初の結果バッチとスクロール ID を取得するために、
DeepPagingオブジェクトを含むクエリを送信します。後続のリクエスト — 前回の応答から取得したスクロール ID を次のリクエストに渡して、次の結果バッチを取得します。結果セットが空になるまで繰り返します。
有効期限切れ — 各スクロール 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();
}
}
}ステータスフィールドではなく、応答内のエラーコードおよびメッセージを使用してエラーを確認してください。エラーの詳細については、「エラーコード」をご参照ください。
次のステップ
エラーコード — スクロールクエリのエラーを診断および解決する
アクセス権限付与ルール — OpenSearch 用の RAM ユーザーの権限を設定する