配置環境變量
配置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維,具體操作,請參見創建RAM用戶。
創建AccessKey ID和AccessKey Secret,請參考創建AccessKey。
如果您使用的是RAM用戶的AccessKey,請確保主賬號已授權AliyunServiceRoleForOpenSearch服務關聯角色,請參考OpenSearch-行業算法版服務關聯角色,相關文檔參考訪問鑒權規則。
請不要將AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
Linux和macOS系統配置方法:
執行以下命令,其中,
<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系統配置方法
新建環境變量文件,添加環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET,并寫入已準備好的AccessKey ID和AccessKey Secret。
重啟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);
//定義Map對象存儲上傳數據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();
}
}
}
推送數據的時候,只能包含同表的字段,不能跨表推送。