環境変数の設定
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 V3.1 を使用したデータプッシュのデモコード
プッシュモードでデータをアップロードするには、まず有効な形式でデータセットを生成し、クライアントバッファにアップロードする必要があります。次に、push メソッドを呼び出して、データセットを一度にアプリケーションに送信します。
使用上の注意
プッシュできるデータセットは有効な形式である必要があります。有効な形式を表示するには、OpenSearch コンソールにログインし、アプリケーションのアクション列にある [その他] > [ファイルのアップロード] を選択し、サンプルファイルをダウンロードします。サンプルファイルをテンプレートとして使用して、データセットを生成できます。
JSONObject オブジェクトと JSONArray オブジェクトを使用してデータセットを生成し、push メソッドを呼び出して、データセットを一度にアプリケーションに送信することもできます。
一度にプッシュされるドキュメントの数が制限を超えると、エラーが発生し、プッシュは失敗します。
シナリオ
データを動的にマージしてプッシュする
単一のドキュメントをプッシュする
事前にデータセットを生成し、一度にプッシュする
複数のドキュメントを一度にプッシュする
package com.aliyun.opensearch;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Lists;
import com.aliyun.opensearch.sdk.dependencies.com.google.common.collect.Maps;
import com.aliyun.opensearch.sdk.dependencies.org.json.JSONArray;
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.commons.OpenSearchResult;
import com.aliyun.opensearch.sdk.generated.document.Command;
import com.aliyun.opensearch.sdk.generated.document.DocumentConstants;
import com.aliyun.opensearch.sdk.generated.search.*;
import com.aliyun.opensearch.sdk.generated.search.general.SearchResult;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Random;
public class testPushSearch2 {
private String appName = "データのプッシュ先となる OpenSearch アプリケーションの名前";
private String tableName = "データのプッシュ先となるテーブルの名前";
private 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()));
//-------------以下のサンプルコードは、データのプッシュ方法を示しています。-----------------
// ランダムな値を生成し、プライマリキーの値として使用します。
Random rand = new Random();
int value1 = rand.nextInt(Integer.MAX_VALUE);
int value2 = rand.nextInt(Integer.MAX_VALUE);
// アップロードする最初のドキュメントのデータを格納するために、doc1 という名前の Map オブジェクトを作成します。
Map<String, Object> doc1 = Maps.newLinkedHashMap();
doc1.put("id", value1);
String title_string = "プッシュモードで doc1 を追加";// 文字列は UTF-8 でエンコードされています。
byte[] bytes;
try {
bytes = title_string.getBytes("utf-8");
String utf8_string = new String(bytes, "utf-8");
doc1.put("name", utf8_string);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
doc1.put("phone", "137****1111");
int[] int_arr = {11,11};
doc1.put("int_arr", int_arr);
String[] literal_arr1 = {"プッシュモードで doc1 を追加","プッシュモードで doc1 の追加をテスト"};
doc1.put("literal_arr", literal_arr1);
float[] float_arr = {(float)1.1,(float)1.1};
doc1.put("float_arr", float_arr);
doc1.put("cate_id", 1);
// 標準アプリケーションは、UPDATE 操作またはドキュメントの部分更新をサポートしていません。ADD 操作を実行してドキュメントを追加するか、ドキュメントの完全更新を実行できます。高度なアプリケーションは、UPDATE 操作とドキュメントの部分更新をサポートしています。
JSONObject json1 = new JSONObject();
json1.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json1.put(DocumentConstants.DOC_KEY_FIELDS, doc1);
// アップロードする2番目のドキュメントのデータを格納するために、doc2 という名前の Map オブジェクトを作成します。
Map<String, Object> doc2 = Maps.newLinkedHashMap();
doc2.put("id", value2);
String title_string2 = "プッシュモードで doc2 を追加";// 文字列は UTF-8 でエンコードされています。
byte[] bytes2;
try {
bytes2 = title_string2.getBytes("utf-8");
String utf8_string2 = new String(bytes2, "utf-8");
doc2.put("name", utf8_string2);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
doc2.put("phone", "137****2222");
int[] int_arr2 = {22,22};
doc2.put("int_arr", int_arr2);
String[] literal_arr2 = {"プッシュモードで doc2 を追加","プッシュモードで doc2 の追加をテスト"};
doc2.put("literal_arr", literal_arr2);
float[] float_arr2 = {(float)2.2,(float)2.2};
doc2.put("float_arr", float_arr2);
doc2.put("cate_id", 1);
// ADD 操作を実行して、データを追加または更新できます。UPDATE 操作はサポートされていません。ADD 操作で指定されたドキュメントのプライマリキー値が既存のドキュメントと同じ場合、既存のドキュメントが更新されます。それ以外の場合、指定されたドキュメントが追加されます。この例では、ADD 操作を実行してドキュメントを追加します。
JSONObject json2 = new JSONObject();
json2.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json2.put(DocumentConstants.DOC_KEY_FIELDS, doc2);
// アップロードする3番目のドキュメントのデータを格納するために、doc3 という名前の Map オブジェクトを作成します。このドキュメントは、doc2 を更新するために使用されます。
Map<String, Object> doc3 = Maps.newLinkedHashMap();
doc3.put("id", value2);
String title_string3 = "プッシュモードで doc2 を doc3 に更新";// 文字列は UTF-8 でエンコードされています。
byte[] bytes3;
try {
bytes3 = title_string3.getBytes("utf-8");
String utf8_string3 = new String(bytes3, "utf-8");
doc3.put("name", utf8_string3);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
doc3.put("phone", "137****3333");
int[] int_arr3 = {33,33};
doc3.put("int_arr", int_arr3);
String[] literal_arr3 = {"プッシュモードで doc2 を doc3 に更新","プッシュモードで doc2 を doc3 に更新"};
doc3.put("literal_arr", literal_arr3);
float[] float_arr3 = {(float)3.3,(float)3.3};
doc3.put("float_arr", float_arr3);
doc3.put("cate_id", 1);
// ADD 操作を実行して、データを追加または更新できます。UPDATE 操作はサポートされていません。ADD 操作で指定されたドキュメントのプライマリキー値が既存のドキュメントと同じ場合、既存のドキュメントが更新されます。それ以外の場合、指定されたドキュメントが追加されます。この例では、ADD 操作を実行してドキュメントを更新します。
JSONObject json3 = new JSONObject();
json3.put(DocumentConstants.DOC_KEY_CMD, Command.ADD.toString());
json3.put(DocumentConstants.DOC_KEY_FIELDS, doc3);
// アップロードする4番目のドキュメントのデータを格納するために、doc4 という名前の Map オブジェクトを作成します。このドキュメントは、doc1 を削除するために使用されます。ドキュメントを削除するには、ドキュメントのプライマリキー値のみを指定する必要があります。
Map<String, Object> doc4 = Maps.newLinkedHashMap();
doc4.put("id", value1);
// doc1 を削除します。
JSONObject json4 = new JSONObject();
json4.put(DocumentConstants.DOC_KEY_CMD, Command.DELETE.toString());
json4.put(DocumentConstants.DOC_KEY_FIELDS, doc4);
JSONArray docsJsonArr = new JSONArray();
docsJsonArr.put(json1);// doc1 を追加します。
docsJsonArr.put(json2);// doc2 を追加します。
docsJsonArr.put(json3);// doc2 を doc3 に更新します。
docsJsonArr.put(json4);// doc1 を削除します。
String docsJson = docsJsonArr.toString();
// OpenSearch オブジェクトを作成します。
OpenSearch openSearch = new OpenSearch(accesskey, secret, host);
// OpenSearch オブジェクトをパラメータとして使用して、OpenSearchClient オブジェクトを作成します。
OpenSearchClient serviceClient = new OpenSearchClient(openSearch);
// DocumentClient オブジェクトを定義し、JSON 文字列形式のドキュメントを追加して送信します。
DocumentClient documentClient = new DocumentClient(serviceClient);
try {
// push メソッドを呼び出してデータをプッシュします。
OpenSearchResult osr = documentClient.push(docsJson, appName, tableName);
// データがプッシュされるかどうかは、データのプッシュ時にエラーが発生するかどうか、および OpenSearch コンソールでエラーが発生するかどうかによって異なります。
// データをプッシュした後、アプリケーションでエラーが発生する可能性があります。OpenSearch コンソールは、これらのエラーをエラーログに記録します(フィールドコンテンツの変換の失敗など)。
if(osr.getResult().equalsIgnoreCase("true")){
System.out.println("データのプッシュ時にエラーは発生しませんでした! \n リクエスト ID は "+osr.getTraceInfo().getRequestId()+" です");
}else{
System.out.println("データのプッシュ時にエラーが発生しました! "+osr.getTraceInfo());
}
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);// スレッドを1秒間休止します。
} catch (InterruptedException e) {
e.printStackTrace();
}
//-------------プッシュされたドキュメント内のデータをクエリします。-----------------
// OpenSearchClient オブジェクトをパラメータとして使用して、SearcherClient オブジェクトを作成します。
SearcherClient searcherClient = new SearcherClient(serviceClient);
// config 句でページング関連のパラメータまたは戻り値のデータ形式を設定するために使用される Config オブジェクトを作成します。
Config config = new Config(Lists.newArrayList(appName));
config.setStart(0);
config.setHits(30);
// 戻り値のデータ形式を指定します。サポートされている形式は XML と JSON です。FULLJSON 形式はサポートされていません。この例では、データ形式は JSON に設定されています。
config.setSearchFormat(SearchFormat.JSON);
// 返すフィールドを指定します。
config.setFetchFields(Lists.newArrayList("id", "name", "phone", "int_arr", "literal_arr", "float_arr", "cate_id"));
// SearchParams オブジェクトを作成します。
SearchParams searchParams = new SearchParams(config);
// 検索クエリを指定します。複数の検索クエリを指定して、複数のインデックスフィールドに基づいてクエリを実行できます。この場合、1 つの setQuery 呼び出しでインデックスフィールドを指定する必要があります。個別の setQuery 呼び出しで各インデックスフィールドを指定すると、最後の検索クエリによって前の検索クエリが上書きされます。
searchParams.setQuery("id:'" + value1 + "'|'"+value2 +"'");
// フィルタ条件を指定します。
searchParams.setFilter("cate_id<=3");
// 並べ替え条件を指定します。
Sort sorter = new Sort();
sorter.addToSortFields(new SortField("id", Order.DECREASE)); // ドキュメントの並べ替え基準となるフィールドと並べ替え方法を指定します。この例では、ドキュメントは id フィールドに基づいて降順に並べ替えられます。
sorter.addToSortFields(new SortField("RANK", Order.INCREASE)); // 複数のドキュメントの id フィールドの値が同じ場合は、ドキュメントを RANK フィールドに基づいて昇順に並べ替えます。
// 並べ替え条件をクエリパラメータとして追加します。
searchParams.setSort(sorter);
// クエリを実行し、結果を返します。
SearchResult searchResult;
try {
searchResult = searcherClient.execute(searchParams);
String result = searchResult.getResult();
JSONObject obj = new JSONObject(result);
// 検索結果を表示します。
System.out.println(obj.toString());
} catch (OpenSearchException e) {
e.printStackTrace();
} catch (OpenSearchClientException e) {
e.printStackTrace();
}
}
}データのプッシュ時には、同じテーブル内のフィールドのみを含めることができ、テーブルをまたいでプッシュすることはできません。