通常の検索では、最大 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
環境変数ファイルを作成し、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数をファイルに追加してから、環境変数に AccessKey ID と AccessKey シークレットを設定します。
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();
}
}
}