環境変数の設定
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 を使用した検索機能を実装するためのデモコード
注:ステータス情報ではなく、エラーコードとメッセージに基づいてエラーが発生したかどうかを判断します。
エラーの詳細については、エラーコード を参照してください。
OpenSearch SDK for Java によって提供されるデモコード
package com.aliyun.opensearch;
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 com.aliyun.opensearch.search.SearchResultDebug;
import java.nio.charset.Charset;
public class testSearch {
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(0);
config.setHits(5);
// 返される結果のデータ形式を指定します。サポートされている形式は、XML、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 メソッドを使用して指定します。
// kvpairs 句を指定します。この例では、uniq プラグインが distinct 句に追加されています。これにより、reserved パラメーターが false に設定されている場合、total パラメーターと viewtotal パラメーターの値が正確になります。
//config.setKvpairs("duniqfield:cate_id");
// SearchParams オブジェクトを作成します。
SearchParams searchParams = new SearchParams(config);
// 検索クエリを指定します。複数の検索クエリを指定して、複数のインデックスフィールドに基づいてクエリを実行できます。この場合、1 つの setQuery 呼び出しでインデックスフィールドを指定する必要があります。個別の setQuery 呼び出しで各インデックスフィールドを指定すると、最後の検索クエリによって前の検索クエリが上書きされます。
searchParams.setQuery("name:'opensearch'");
// distinct 句を指定します。
Distinct dist = new Distinct();
dist.setKey("cate_id"); // distinct 抽出に使用するフィールドを指定します。
dist.setDistCount(1); // 一度に抽出されるドキュメントの数を指定します。
dist.setDistTimes(1); // 抽出の回数を指定します。
dist.setReserved(false); // 抽出後に残りのドキュメントを保持するかどうかを指定します。
dist.setUpdateTotalHit(false); // reserved パラメーターが false に設定されている場合、破棄されたドキュメントの数を totalHits パラメーターの値から減算するかどうかを指定します。
dist.setDistFilter("cate_id<=3"); // 抽出するドキュメントを選択するためのフィルター条件を指定します。
dist.setGrade("1.2"); // distinct 抽出のしきい値を指定します。
// duniqfield パラメーターは、config 句で kvpairs 句の形式で指定されます。
// distinct 句をクエリパラメーターとして追加します。
searchParams.addToDistincts(dist);
// aggregate 句を指定します。
Aggregate agg = new Aggregate();
agg.setGroupKey("cate_id"); // 集計するフィールドを指定します。
agg.setAggFun("count()"); // 集計関数を指定します。
agg.setAggFilter("cate_id=1"); // 集計フィルターを指定します。
agg.setRange("0~10"); // 集計範囲を指定します。
agg.setAggSamplerThresHold("5"); // サンプリングされた集計のしきい値を指定します。
agg.setAggSamplerStep("5"); // サンプリングされた集計のステップを指定します。
agg.setMaxGroup("5"); // 返されるグループの最大数を指定します。
// aggregate 句をクエリパラメーターとして追加します。
//searchParams.addToAggregates(agg);
// 集計する複数のフィールドを指定します。
Set<Aggregate> Aggregates = new HashSet();
Aggregate aggregate1 = new Aggregate();
aggregate1.setGroupKey("cate_id");
aggregate1.setAggFun("count()");
Aggregates.add(aggregate1);
Aggregate aggregate2 = new Aggregate();
aggregate2.setGroupKey("cate_id_1");
aggregate2.setAggFun("count()");
Aggregates.add(aggregate2);
searchParams.setAggregates(Aggregates);
// biz パラメーターを指定します。
Map hashMap = new HashMap();
hashMap.put("biz","type:web");
searchParams.setCustomParam(hashMap);
// フィルター条件を指定します。
// searchParams.setFilter("id > \"0\""); // SearchParamsBuilder クラスを使用してフィルター条件を設定することもできます。
// 並べ替え条件を指定します。
Sort sorter = new Sort();
sorter.addToSortFields(new SortField("id", Order.DECREASE)); // ドキュメントの並べ替え基準となるフィールドと並べ替え方法を指定します。この例では、ドキュメントは id フィールドに基づいて降順に並べ替えられます。
sorter.addToSortFields(new SortField("RANK", Order.INCREASE)); // 複数のドキュメントの id フィールドの値が同じ場合は、ドキュメントを RANK フィールドに基づいて昇順に並べ替えます。
// この例では、ドキュメントは tag_match フィールドに基づいて並べ替えられます。キーと値のペアを config 句に設定する必要があります。
//sorter.addToSortFields(new SortField("tag_match(\"kk1\",int_array,10,\"max\",\"false\",\"false\")", Order.INCREASE));
//config.setKvpairs("kk1:10");
// 並べ替え条件をクエリパラメーターとして追加します。
searchParams.setSort(sorter);
// 大まかな並べ替え式と細かい並べ替え式を指定します。この例では、デフォルトの式が使用されています。
Rank rank = new Rank();
rank.setFirstRankName("default");
rank.setSecondRankName("default");
rank.setReRankSize(5); // 細かい並べ替え式に基づいて並べ替えるドキュメントの数を指定します。
// 並べ替え式をクエリパラメーターとして追加します。
searchParams.setRank(rank);
// re_search パラメーターを指定します。パラメーターの値は検索クエリと同じである必要があります。
//strategy:threshold,params:total_hits#10 => "strategy:threshold" はクエリ戦略を示します。サポートされている戦略は 1 つだけです。
// total_hits パラメーターを使用してしきい値を設定します。クエリの最初の実行の total_hits パラメーターの値が指定されたしきい値より小さい場合、クエリは再実行されます。
Map<String, String> reSearchParams = new HashMap<String, String>();
reSearchParams.put("re_search", "strategy:threshold,params:total_hits#10");
// 関連付けられたクエリの from_request_id を指定します。
reSearchParams.put("from_request_id", "159851481919726888064081");
//searchParams.setCustomParam(reSearchParams);
// summary 句を作成します。この例では、SearchParamsBuilder オブジェクトを使用して、検索結果の概要がクエリパラメーターとして追加されます。
Summary summ = new Summary("name");
summ.setSummary_field("name"); // 検索結果の概要を設定するフィールドを指定します。このフィールドは TEXT タイプである必要があり、フィールドを分析できるようにします。
summ.setSummary_len("50"); // セグメントの長さを指定します。
summ.setSummary_element("em"); // 検索クエリを赤で強調表示するために使用される HTML タグを指定します。
summ.setSummary_ellipsis("..."); // セグメントを接続するために使用されるコネクタを指定します。
summ.setSummary_snippet("1"); // セグメントの数を指定します。
// summary 句をクエリパラメーターとして追加します。
//searchParams.addToSummaries(summ);
// raw_query パラメーターを指定します。パラメーターの値は検索クエリと同じである必要があります。
searchParams.setRawQuery("opensearch");
// SearchParamsBuilder オブジェクトを作成します。SearchParams のユーティリティクラスである SearchParamsBuilder クラスを使用すると、クエリ関連のパラメーターを簡単に設定できます。
SearchParamsBuilder paramsBuilder = SearchParamsBuilder.create(searchParams);
// SearchParamsBuilder オブジェクトを使用して、前に作成した summary 句をクエリパラメーターとして追加します。
paramsBuilder.addSummary("name", 50, "em", "...", 1);
// フィルター条件を指定します。
paramsBuilder.addFilter("id>=0", "AND");
// disable パラメーターを指定して、再検索機能を無効にします。
//searchParams.putToCustomParam("disable", "re_search");
try {
// クエリを実行し、結果を返します。エラーコードとメッセージに基づいてエラーが発生したかどうかを判断します。エラーの詳細については、「エラーコード」のトピックを参照してください。
SearchResult searchResult = searcherClient.execute(paramsBuilder);
String result = searchResult.getResult();
JSONObject obj = new JSONObject(result);
// 検索結果を表示します。
System.out.println(obj.toString());
// デバッグのためにリクエストアドレスの情報が必要になる場合があります。
SearchResultDebug searchdebugrst = searcherClient.executeDebug(searchParams);
// 最後のクエリのリクエスト文字列を表示します。
System.out.println(searchdebugrst.getRequestUrl());
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
}
}