全部產品
Search
文件中心

OpenSearch:Commit推送Demo

更新時間:Jul 13, 2024

配置環境變數

配置環境變數ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運,具體操作,請參見建立RAM使用者

  • 建立AccessKey ID和AccessKey Secret,請參考建立AccessKey

  • 如果您使用的是RAM使用者的AccessKey,請確保主帳號已授權AliyunServiceRoleForOpenSearch服務關聯角色,請參考OpenSearch-行業演算法版服務關聯角色,相關文檔參考訪問鑒權規則

  • 請不要將AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。

  • LinuxmacOS系統配置方法:

    執行以下命令,其中, <access_key_id>需替換為您RAM使用者的AccessKey ID,<access_key_secret>替換為您RAM使用者的AccessKey Secret。

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows系統配置方法

    1. 建立環境變數檔案,添加環境變數ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,並寫入已準備好的AccessKey ID和AccessKey Secret。

    2. 重啟Windows系統生效。

V3.1 SDK Commit方式新增文檔範例代碼

Commit 提交資料方式,主要是在程式中動態將對應的文檔資料封裝到Map對象中,再將這些Map對象通過add方法添加到緩衝中,最後調用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應用程式名稱";
  private static String tableName = "替換opensearch應用表名";
  private static String host = "替換應用的API訪問地址";

  public static void main(String[] args) {
    //使用者識別資訊
    //從環境變數讀取配置的AccessKey ID和AccessKey Secret,
    //運行程式碼範例前必須先配置環境變數,參考文檔上面“配置環境變數”步驟
    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);

    //定義MapObject Storage Service上傳資料doc1
    Map<String, Object> doc1 = Maps.newLinkedHashMap();
    doc1.put("id", value);

    String title_string = "Commit方式新增文檔1"; // 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 = {
      "Commit方式新增文檔1",
      "測試Commit方式新增文檔1]",
    };
    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);

    //建立OpenSearchClient對象,並以OpenSearch對象作為構造參數
    OpenSearchClient serviceClient1 = new OpenSearchClient(openSearch1);

    //定義DocumentClient對象添加資料並提交
    DocumentClient documentClient1 = new DocumentClient(serviceClient1);

    // 把doc1加入緩衝,並設為新增文檔
    documentClient1.add(doc1);

    //文檔輸出
    System.out.println(doc1.toString());

    try {
      //執行提交新增操作,此處用於測試故單個提交延遲10s查看操作資訊,也可在後面一次性提交執行操作
      OpenSearchResult osr = documentClient1.commit(appName, tableName);

      //判斷資料是否推送成功,主要通過判斷2處,第一處判斷使用者方推送是否成功,第二處是應用控制台中有無報錯日誌
      //使用者方推送成功後,也有可能在應用端執行失敗,此錯誤會直接在應用控制台錯誤記錄檔中產生,比如欄位內容轉換失敗
      if (osr.getResult().equalsIgnoreCase("true")) {
        System.out.println(
          "使用者方推送無報錯!\n以下為getTraceInfo推送請求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秒,可在控制台查看新增的資料
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    //定義Map對象doc2,並更新doc1,更新採用update,update需要在主索引值已存在的情況下才可以使用
    Map<String, Object> doc2 = Maps.newLinkedHashMap();
    doc2.put("id", value);

    String title_string2 = "Commit方式更新文檔1"; // 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 = { "Commit方式更新文檔1", "Commit方式更新文檔1" };
    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);

    // 把doc2加入緩衝,因為此資料主鍵已存在,因此update可正常執行
    documentClient1.update(doc2);

    //文檔輸出
    System.out.println(doc2.toString());
    try {
      // 執行更新並提交,此處用於測試故單個提交延遲10s查看操作資訊,也可在後面一次性提交執行操作
      OpenSearchResult osr = documentClient1.commit(appName, tableName);

      //判斷資料是否推送成功,主要通過判斷2處,第一處判斷使用者方推送是否成功,第二處是應用控制台中有無報錯日誌
      //使用者方推送成功後,也有可能在應用端執行失敗,此錯誤會直接在應用控制台錯誤記錄檔中產生,比如欄位內容轉換失敗
      if (osr.getResult().equalsIgnoreCase("true")) {
        System.out.println(
          "使用者方推送無報錯!\n以下為getTraceInfo推送請求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秒,可在控制台查看更新的資料
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    // 定義Map對象doc3,刪除文檔只需指定需刪除文檔主索引值即可
    Map<String, Object> doc3 = Maps.newLinkedHashMap();
    doc3.put("id", value);

    // 把doc3加入緩衝,此處做刪除文檔處理
    documentClient1.remove(doc3);
    //文檔輸出
    System.out.println(doc3.toString());

    try {
      // 執行刪除並提交,此處用於測試故單個提交延遲10s查看操作資訊,也可在後面一次性提交執行操作
      OpenSearchResult osr = documentClient1.commit(appName, tableName);

      //判斷資料是否推送成功,主要通過判斷2處,第一處判斷使用者方推送是否成功,第二處是應用控制台中有無報錯日誌
      //使用者方推送成功後,也有可能在應用端執行失敗,此錯誤會直接在應用控制台錯誤記錄檔中產生,比如欄位內容轉換失敗
      if (osr.getResult().equalsIgnoreCase("true")) {
        System.out.println(
          "使用者方推送無報錯!\n以下為getTraceInfo推送請求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);

    //建立OpenSearchClient對象,並以OpenSearch對象作為構造參數
    OpenSearchClient serviceClient2 = new OpenSearchClient(openSearch2);

    //建立SearcherClient對象,並以OpenSearchClient對象作為構造參數
    SearcherClient searcherClient2 = new SearcherClient(serviceClient2);

    //建立Config對象,用於設定config子句參數,分頁或資料返回格式等等
    Config config = new Config(Lists.newArrayList(appName));
    config.setStart(0);
    config.setHits(30);
    //設定返回格式為json,目前只支援返回xml和json格式,暫不支援返回fulljson類型
    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();
    }
  }
}

重要

推送資料的時候,只能包含同表的欄位,不能跨表推送。