すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:データコミットのデモコード

最終更新日:Apr 01, 2025

環境変数の設定

このセクションでは、オペレーティングシステムで ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET および 環境変数を設定する方法について説明します。

重要
  • Alibaba Cloud アカウントの AccessKey ペアを使用すると、すべての API 操作にアクセスできます。 API 操作の呼び出しや日常の O&M の実行には、Resource Access Management (RAM) ユーザーの AccessKey ペアを使用することをお勧めします。 詳細については、「RAM ユーザーの作成」をご参照ください。

  • AccessKey ペアの作成方法の詳細については、「AccessKey ペアの作成」をご参照ください。

  • RAM ユーザーの AccessKey ペアを使用する場合は、Alibaba Cloud アカウントがサービスロール AliyunServiceRoleForOpenSearch で指定された権限を RAM ユーザーに付与していることを確認してください。 詳細については、「AliyunServiceRoleForOpenSearch」および「アクセス認証ルール」をご参照ください。

  • プロジェクトコードに AccessKey ID と AccessKey シークレットをハードコードしないことをお勧めします。 そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。

  • Linux および macOS:

    次のコマンドでは、<access_key_id> を RAM ユーザーの AccessKey ID に、<access_key_secret> を RAM ユーザーの AccessKey シークレットに置き換えます。 次に、コマンドを実行します。

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows:

    1. 環境変数ファイルを作成し、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数をファイルに追加し、ALIBABA_CLOUD_ACCESS_KEY_ID に AccessKey ID を、ALIBABA_CLOUD_ACCESS_KEY_SECRET に AccessKey シークレットを指定します。

    2. AccessKey ペアを有効にするには、Windows を再起動します。

OpenSearch SDK for Java V3.1 を使用したデータコミットのデモコード

コミットモードでデータをアップロードするには、次の操作を実行します。アップロードするドキュメントデータを動的に Map オブジェクトにカプセル化し、add メソッドを呼び出して Map オブジェクトをクライアントバッファにアップロードし、commit メソッドを呼び出して Map オブジェクトを送信します。

シナリオ

  • データの動的なマージとコミット

  • 単一ドキュメントのコミット

  • 一度に少数のドキュメントをコミット

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.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.search.Config;
import com.aliyun.opensearch.sdk.generated.search.SearchFormat;
import com.aliyun.opensearch.sdk.generated.search.SearchParams;
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 testCommitSearch {

  private static String appName = "データのコミット先の OpenSearch アプリケーションの名前"; // データをコミットする OpenSearch アプリケーションの名前
  private static String tableName = "データのコミット先のテーブルの名前"; // データをコミットするテーブルの名前
  private static String host = "ご利用のリージョンの OpenSearch API のエンドポイント"; // リージョンの 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 value = rand.nextInt(Integer.MAX_VALUE);

    // アップロードするドキュメントのデータを格納するために、doc1 という名前の Map オブジェクトを作成します。
    Map<String, Object> doc1 = Maps.newLinkedHashMap();
    doc1.put("id", value);

    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", "1381111****");

    int[] int_arr = { 33, 44 };
    doc1.put("int_arr", int_arr);

    String[] literal_arr = {
      "コミットモードで doc1 をアップロード",
      "コミットモードで doc1 のアップロードをテスト]",
    };
    doc1.put("literal_arr", literal_arr);

    float[] float_arr = { (float) 1.1, (float) 1.2 };
    doc1.put("float_arr", float_arr);

    doc1.put("cate_id", 1);

    // OpenSearch オブジェクトを作成します。
    OpenSearch openSearch1 = new OpenSearch(accesskey, secret, host);

    // OpenSearch オブジェクトをパラメーターとして使用して、OpenSearchClient オブジェクトを作成します。
    OpenSearchClient serviceClient1 = new OpenSearchClient(openSearch1);

    // データのアップロードと送信に使用する DocumentClient オブジェクトを作成します。
    DocumentClient documentClient1 = new DocumentClient(serviceClient1);

    // メソッドを呼び出して doc1 をクライアントバッファにアップロードし、新しいドキュメントとして設定します。
    documentClient1.add(doc1);

    // ドキュメントを表示します。
    System.out.println(doc1.toString());

    try {
      // commit メソッドを呼び出して、アップロードされたドキュメントを送信します。 この例では、送信操作が完了するまでに 10 秒が確保されています。 複数のドキュメントをクライアントバッファにアップロードしてから、一度に送信することもできます。
      OpenSearchResult osr = documentClient1.commit(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(10000);// スレッドを 10 秒間休止します。その後、OpenSearch コンソールに追加されたデータを表示できます。
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    // doc1 を更新するために、doc2 という名前の Map オブジェクトを作成します。 add メソッドを呼び出してこの更新を実行し、doc1 の有効な名前とプライマリキー値を指定していることを確認します。
    Map<String, Object> doc2 = Maps.newLinkedHashMap();
    doc2.put("id", value);

    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", "1390000****");

    int[] int_arr2 = { 22, 22 };
    doc2.put("int_arr", int_arr2);

    String[] literal_arr2 = {"コミットモードで doc1 を更新","コミットモードで doc1 を更新"};
    doc2.put("literal_arr", literal_arr2);

    float[] float_arr2 = { (float) 1.1, (float) 1.2 };
    doc2.put("float_arr", float_arr2);

    doc2.put("cate_id", 1);

    // add メソッドを呼び出して、Map オブジェクト doc2 をクライアントバッファにアップロードします。 プライマリキーが有効であるため、この更新操作は正常に実行できます。
    documentClient1.update(doc2);

    // ドキュメントを表示します。
    System.out.println(doc2.toString());
    try {
      // commit メソッドを呼び出して、更新されたドキュメントを送信します。 この例では、一度に 1 つのドキュメントのみが送信され、10 秒後に結果を表示できます。 クライアントバッファ内の複数のドキュメントを更新してから、一度に送信することもできます。
      OpenSearchResult osr = documentClient1.commit(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(10000);// スレッドを 10 秒間休止します。その後、OpenSearch コンソールで更新されたデータを表示できます。
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    // ドキュメントを削除するために、doc3 という名前の Map オブジェクトを作成します。 ドキュメントを削除するには、ドキュメントのプライマリキー値のみを指定する必要があります。
    Map<String, Object> doc3 = Maps.newLinkedHashMap();
    doc3.put("id", value);

    // Map オブジェクト doc3 をクライアントバッファにアップロードして、ドキュメントを削除します。
    documentClient1.remove(doc3);
    // ドキュメントを表示します。
    System.out.println(doc3.toString());

    try {
      // commit メソッドを呼び出して、削除されたドキュメントを送信します。 この例では、送信操作が完了するまでに 10 秒が確保されています。 クライアントバッファから複数のドキュメントを削除してから、一度に送信することもできます。
      OpenSearchResult osr = documentClient1.commit(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(10000);// スレッドを 10 秒間休止します。その後、ドキュメントが削除されたかどうかを確認できます。 スレッドを休止せずに削除直後にデータをクエリすると、削除されるデータが検索結果に含まれる場合があります。 スレッドを少なくとも 1 秒間休止します。
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    // OpenSearch オブジェクトを作成します。
    OpenSearch openSearch2 = new OpenSearch(accesskey, secret, host);

    // OpenSearch オブジェクトをパラメーターとして使用して、OpenSearchClient オブジェクトを作成します。
    OpenSearchClient serviceClient2 = new OpenSearchClient(openSearch2);

    // OpenSearchClient オブジェクトをパラメーターとして使用して、SearcherClient オブジェクトを作成します。
    SearcherClient searcherClient2 = new SearcherClient(serviceClient2);

    // Config オブジェクトを作成して、config 句のパラメーター (ページング関連のパラメーターや返される結果のデータ形式など) を設定します。
    Config config = new Config(Lists.newArrayList(appName));
    config.setStart(0);
    config.setHits(30);
    // 返される結果のデータ形式を指定します。 サポートされている形式は XML と JSON です。 FULLJSON 形式はサポートされていません。 この例では、データ形式は JSON に設定されています。
    config.setSearchFormat(SearchFormat.JSON);

    SearchParams searchParams = new SearchParams(config);
    searchParams.setQuery("id:'" + value + "'");
    // クエリを実行し、結果を返します。
    SearchResult searchResult;
    try {
      searchResult = searcherClient2.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();
    }
  }
}

重要

同じテーブルのフィールドにのみデータをコミットできます。テーブルをまたいでデータをコミットすることはできません。