環境変数の設定
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 件を超えるドキュメントが含まれている場合は、スクロールクエリを実行して、一致するすべての結果を取得できます。
使用上の注意
スクロールクエリは、一致するすべての結果を取得するために使用され、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();
}
}
}