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

OpenSearch:データプッシュのデモコード

最終更新日:Dec 28, 2024

環境変数の設定

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

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

    2. 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();
            }

        }
}

重要

データのプッシュ時には、同じテーブル内のフィールドのみを含めることができ、テーブルをまたいでプッシュすることはできません。