本文檔介紹如何使用Java、Python語言進行更新表資料,支援的更新操作有add、delete。
相關依賴
Java
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-ha3engine-vector</artifactId>
<version>1.1.15</version>
</dependency>python
# Requires: Python >=3.6
pip install alibabacloud_ha3engine_vector==1.1.15Go
go get github.com/aliyun/alibabacloud-ha3-go-sdk@v1.1.15-vectorJava非同步
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-ha3engine-async</artifactId>
<version>1.1.6</version>
</dependency>參數說明
Java、Python SDK中都需要配置如下5個必要參數(endpoint、instance_id、access_user_name、access_pass_word、data_source_name):
endpoint:私網/公網網域名稱
可在執行個體詳情頁中網路資訊和API入口查看:

開啟公網訪問後可以在本地通過公網網域名稱(包含public的網域名稱)調用執行個體,需要參考添加白名單配置訪問的白名單IP,否則會報禁止訪問的錯誤,建議您使用前先ping下,確定可訪問。
若有ECS機器,可通過配置相同的交換器通過API網域名稱調用執行個體。
instance_id:執行個體ID
access_user_name:使用者名稱
access_pass_word:密碼
使用者名稱和密碼可以在執行個體詳情頁中API入口處進行查看:(密碼是購買執行個體時設定的,可以修改)

data_source_name:API推送資料的資料來源名稱,預設為執行個體id_表名:

如上圖所示,data_source_name=ha-cn-zpr3dgzxg04_test_image_vector
資料更新demo
add 操作樣本
Java
import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.PushDocumentsRequest;
import com.aliyun.ha3engine.vector.models.PushDocumentsResponse;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @author alibaba
*/
public class PushDoc {
/**
* 問天引擎client
*/
private Client client;
@Before
public void clientInit() throws Exception {
/*
初始化問天引擎client
*/
Config config = new Config();
// 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
config.setInstanceId("ha-cn-i7*****605");
// 使用者名稱,可在執行個體詳情頁>API入口 查看
config.setAccessUserName("username");
// 密碼,可在執行個體詳情頁>API入口 修改
config.setAccessPassWord("password");
// API網域名稱,可在執行個體詳情頁>API入口 查看
config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");
client = new Client(config);
}
@Test
public void add() throws Exception {
// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
String tableName = "<instance_id>_<table_name>";
// 文檔推送的文檔主鍵欄位.
String pkField = "<field_pk>";
try {
// 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
ArrayList<Map<String, ?>> documents = new ArrayList<>();
// 添加文檔
Map<String, Object> add2Document = new HashMap<>();
Map<String, Object> add2DocumentFields = new HashMap<>();
// 插入文檔內容資訊, keyValue 成對匹配.
// field_pk 欄位需與 pkField 欄位配置一致.
add2DocumentFields.put("<field_pk>", "<field_pk_value>");
add2DocumentFields.put("<field_map_key_1>", "<field_map_value_1>");
add2DocumentFields.put("<field_map_key_2>", "<field_map_value_2>");
// 問天引擎支援的多值屬性類型,索引內配置為"multi_value": true
ArrayList<Object> addDocumentMultiFields = new ArrayList<>();
addDocumentMultiFields.add("multi_value_1");
addDocumentMultiFields.add("multi_value_2");
add2DocumentFields.put("<multi_value_key>", addDocumentMultiFields);
// 將文檔內容添如 add2Document 結構.
add2Document.put("fields", add2DocumentFields);
// 新增對應的文檔命令: add
add2Document.put("cmd", "add");
documents.add(add2Document);
// 推送資料
PushDocumentsRequest request = new PushDocumentsRequest();
// 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
// request.headers = new HashMap<>();
// request.headers.put("X-Opensearch-Validate-Data", "false");
request.setBody(documents);
PushDocumentsResponse response = client.pushDocuments(tableName, pkField, request);
String responseBody = response.getBody();
System.out.println("result:" + responseBody);
} catch (TeaException e) {
System.out.println(e.getCode());
System.out.println(e.getMessage());
Map<String, Object> exceptionData = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
}
}
}Python
from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector import models
from Tea.exceptions import TeaException, RetryError
config = Config(
# API網域名稱,可在執行個體詳情頁>API入口 查看
endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
# 使用者名稱,可在執行個體詳情頁>API入口 查看
access_user_name="username",
# 密碼,可在執行個體詳情頁>API入口 修改
access_pass_word="password")
# 初始化 引擎用戶端
client = Client(config)
def push():
# 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
tableName = "<instance_id>_<table_name>";
try:
# 添加文檔
# 添加一篇文檔,如果文檔已經存在會先刪除然後再添加。
# =====================================================
# 更新文檔內容資訊
add2DocumentFields = {
"id": 1, # 主鍵id,INT單實值型別
"name": "搜尋", # STRING單實值型別
"str_arr": "a\x1Db\x1Dc\x1Dd" # STRING多實值型別
}
# 將文檔內容添入 add2Document結構
add2Document = {
"fields": add2DocumentFields,
"cmd": "add" # 新增對應的文檔命令: add
}
optionsHeaders = {}
# 文檔推送外層結構, 可添加對文檔操作的結構體.結構內支援 一個或多個文檔操作內容.
documentArrayList = []
documentArrayList.append(add2Document)
pushDocumentsRequest = models.PushDocumentsRequest(optionsHeaders, documentArrayList)
# 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X - Opensearch - Validate - Data: false
# pushDocumentsRequest.headers = {"X-Opensearch-Validate-Data": "false"}
# 文檔推送的文檔主鍵欄位.
pkField = "id"
# 使用預設 運行時參數進行請求
response = client.push_documents(tableName, pkField, pushDocumentsRequest)
print(response.body)
except TeaException as e:
print(f"send request with TeaException : {e}")
except RetryError as e:
print(f"send request with Connection Exception : {e}")
if __name__ == "__main__":
push()Go
主要是在程式中動態將對應的文檔資料封裝到Map對象中,然後通過add方法將這些Map對象添加到緩衝中,最後調用pushDocuments方法,批量提交這些Map對象的文檔資料。
package main
import (
"fmt"
"github.com/alibabacloud-go/tea/tea"
ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)
func main() {
// 建立請求用戶端執行個體
config := &ha3engine.Config{
// API網域名稱,可在執行個體詳情頁>API入口 查看
Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
// 使用者名稱,可在執行個體詳情頁>API入口 查看
AccessUserName: tea.String("username"),
// 密碼,可在執行個體詳情頁>API入口 修改
AccessPassWord: tea.String("password"),
}
// 初始化一個client, 用以發送請求.
client, _clientErr := ha3engine.NewClient(config)
// 如果 NewClient 過程中出現異常. 則 返回 _clientErr 且輸出 錯誤資訊.
if _clientErr != nil {
fmt.Println(_clientErr)
return
}
docPush(client)
}
func docPush(client *ha3engine.Client) {
pushDocumentsRequestModel := &ha3engine.PushDocumentsRequest{}
// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
tableName := "<instance_id>_<table_name>"
// 文檔推送的文檔主鍵欄位
keyField := "<field_pk>"
// 向量欄位
vector := [4]float32{1.2, 2.2, 3.2, 4.2}
filed := map[string]interface{}{
"fields": map[string]interface{}{
"id": 1,
"name": "測試",
"vector": vector,
},
"cmd": tea.String("add"),
}
array := []map[string]interface{}{}
array = append(array, filed)
pushDocumentsRequestModel.SetBody(array)
// 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
//headers := map[string]*string{}
//headers["X-Opensearch-Validate-Data"] = tea.String("false")
//pushDocumentsRequestModel.SetHeaders(headers)
// 發送請求的方法調用.
response, _requestErr := client.PushDocuments(tea.String(tableName), tea.String(keyField), pushDocumentsRequestModel)
// 如果 發送請求 過程中出現異常. 則 返回 _requestErr 且輸出 錯誤資訊.
if _requestErr != nil {
fmt.Println(_requestErr)
return
}
// 輸出正常返回的 response 內容.
fmt.Println(response)
}Java非同步
主要是在程式中動態將對應的文檔資料封裝到Map對象中,再將這些Map對象通過add方法添加到緩衝中,最後調用pushDocuments方法,批量提交這些Map對象文檔資料。
import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.PushDocumentsRequest;
import com.aliyun.ha3engine.async.models.PushDocumentsResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author alibaba
*/
public class AddDoc {
/**
* 問天引擎client
*/
private AsyncClient client;
@Before
public void clientInit() {
// 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>API入口 查看
AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
// 初始化非同步用戶端
client = AsyncClient.builder()
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
.setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
.setProtocol("http")
).build();
}
@Test
public void add() {
try {
// 文檔推送的表名稱
String tableName = "<table_name>";
// 文檔推送的文檔主鍵欄位.
String pkField = "<field_pk>";
// 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
ArrayList<Map<String, ?>> documents = new ArrayList<>();
// 添加文檔
Map<String, Object> add2Document = new HashMap<>();
Map<String, Object> add2DocumentFields = new HashMap<>();
// 更新文檔內容資訊, keyValue 成對匹配.
// field_pk 欄位需與 pkField 欄位配置一致.
add2DocumentFields.put("<field_pk>", "<field_pk_value>");
add2DocumentFields.put("<field_map_key_1>", "<field_map_value_1>");
add2DocumentFields.put("<field_map_key_2>", "<field_map_value_2>");
// 問天引擎支援的多值屬性類型,索引內配置為"multi_value": true
ArrayList<Object> addDocumentMultiFields = new ArrayList<>();
addDocumentMultiFields.add("multi_value_1");
addDocumentMultiFields.add("multi_value_2");
add2DocumentFields.put("<multi_value_key>", addDocumentMultiFields);
// 將文檔內容添如 add2Document 結構.
add2Document.put("fields", add2DocumentFields);
// 新增對應的文檔命令: add
add2Document.put("cmd", "add");
documents.add(add2Document);
// 推送資料
PushDocumentsRequest request = PushDocumentsRequest.builder().body(documents).build();
// 推送資料時,預設校正是否存在主鍵欄位。如需關閉校正,請佈建要求頭 X-Opensearch-Validate-Data: false
// request.getHeaderParameters().put("X-Opensearch-Validate-Data", "false");
CompletableFuture<PushDocumentsResponse> responseCompletableFuture = client.pushDocuments(tableName, pkField, request);
String responseBody = responseCompletableFuture.get().getBody();
System.out.println("result:" + responseBody);
} catch (ExecutionException | InterruptedException e) {
System.out.println(e.getMessage());
} catch (TeaException e) {
System.out.println(e.getCode());
System.out.println(e.getMessage());
Map<String, Object> exceptionData = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
}
}
}通過add推送資料時,主鍵相同新資料會覆蓋舊資料
delete 操作樣本
Java
import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @author alibaba
*/
public class PushDoc {
/**
* 問天引擎client
*/
private Client client;
@Before
public void clientInit() throws Exception {
/*
初始化問天引擎client
*/
Config config = new Config();
// 執行個體名稱,可在執行個體詳情頁左上方查看,例:ha-cn-i7*****605
config.setInstanceId("ha-cn-i7*****605");
// 使用者名稱,可在執行個體詳情頁>網路資訊 查看
config.setAccessUserName("username");
// 密碼,可在執行個體詳情頁>網路資訊 修改
config.setAccessPassWord("password");
// API網域名稱,可在執行個體詳情頁>API入口 查看
config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");
client = new Client(config);
}
@Test
public void delete() throws Exception {
// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
String tableName = "<instance_id>_<table_name>";
// 文檔推送的文檔主鍵欄位.
String pkField = "<field_pk>";
try {
// 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
ArrayList<Map<String, ?>> documents = new ArrayList<>();
// 刪除文檔
Map<String, Object> delete2Document = new HashMap<>();
Map<String, Object> delete2DocumentFields = new HashMap<>();
// 插入文檔內容資訊, keyValue 成對匹配.
// field_pk 欄位需與 pkField 欄位配置一致.
delete2DocumentFields.put("<field_pk>", "<field_pk_value>");
// 將文檔內容添如 delete2Document 結構.
delete2Document.put("fields", delete2DocumentFields);
// 刪除對應的文檔命令: delete
delete2Document.put("cmd", "delete");
documents.add(delete2Document);
// 推送資料
PushDocumentsRequest request = new PushDocumentsRequest();
request.setBody(documents);
PushDocumentsResponse response = client.pushDocuments(tableName, pkField, request);
String responseBody = response.getBody();
System.out.println("result:" + responseBody);
} catch (TeaException e) {
System.out.println(e.getCode());
System.out.println(e.getMessage());
Map<String, Object> exceptionData = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
}
}
}Python
from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector import models
from Tea.exceptions import TeaException, RetryError
config = Config(
# API網域名稱,可在執行個體詳情頁>API入口 查看
endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
# 使用者名稱,可在執行個體詳情頁>API入口 查看
access_user_name="username",
# 密碼,可在執行個體詳情頁>API入口 修改
access_pass_word="password")
# 初始化 引擎用戶端
ha3EngineClient = Client(Config)
def pushDoc():
# 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
tableName = "<instance_id>_<table_name>";
try:
# 文檔推送外層結構, 可添加對文檔操作的結構體.結構內支援 一個或多個文檔操作內容.
documentArrayList = []
# 刪除文檔
# 刪除一篇文檔,刪除文檔時需要指定文檔主鍵
# 如果索引構建時採用多級hash方式,需要指定每級hash的主鍵。
delete2DocumentFields = {
"id": 1 # 主鍵id,INT單實值型別
}
delete2Document = {
"fields": delete2DocumentFields, # 將文檔內容添如 delete2Document 結構.
"cmd": "delete" # 刪除對應的文檔命令: delete
}
optionsHeaders = {}
documentArrayList.append(delete2Document)
pushDocumentsRequest = models.PushDocumentsRequest(
optionsHeaders, documentArrayList
)
# 文檔推送的文檔主鍵欄位.
pkField = "id"
# 使用預設 運行時參數進行請求
response = ha3EngineClient.push_documents(
tableName, pkField, pushDocumentsRequest
)
print(response)
except TeaException as e:
print(f"send request with TeaException : {e}")
except RetryError as e:
print(f"send request with Connection Exception : {e}")
if __name__ == "__main__":
pushDoc()Go
package main
import (
"fmt"
"github.com/alibabacloud-go/tea/tea"
ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)
func main() {
// 建立請求用戶端執行個體
config := &ha3engine.Config{
// API網域名稱,可在執行個體詳情頁>API入口 查看
Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
// 使用者名稱,可在執行個體詳情頁>API入口 查看
AccessUserName: tea.String("username"),
// 密碼,可在執行個體詳情頁>API入口 修改
AccessPassWord: tea.String("password"),
}
// 初始化一個client, 用以發送請求.
client, _clientErr := ha3engine.NewClient(config)
// 如果 NewClient 過程中出現異常. 則 返回 _clientErr 且輸出 錯誤資訊.
if _clientErr != nil {
fmt.Println(_clientErr)
return
}
deleteDoc(client)
}
func deleteDoc(client *ha3engine.Client) {
pushDocumentsRequestModel := &ha3engine.PushDocumentsRequest{}
// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
tableName := "<instance_id>_<table_name>"
// 文檔推送的文檔主鍵欄位
keyField := "<field_pk>"
var array []map[string]interface{}
filed := map[string]interface{}{
"fields": map[string]interface{}{
"id": 2,
},
"cmd": tea.String("delete"),
}
array = append(array, filed)
pushDocumentsRequestModel.SetBody(array)
// 發送請求的方法調用.
response, _requestErr := client.PushDocuments(tea.String(tableName), tea.String(keyField), pushDocumentsRequestModel)
// 如果 發送請求 過程中出現異常. 則 返回 _requestErr 且輸出 錯誤資訊.
if _requestErr != nil {
fmt.Println(_requestErr)
return
}
// 輸出正常返回的 response 內容.
fmt.Println(response)
}Java非同步
import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.PushDocumentsRequest;
import com.aliyun.ha3engine.async.models.PushDocumentsResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @author alibaba
*/
public class DeleteDoc {
/**
* 問天引擎client
*/
private AsyncClient client;
@Before
public void clientInit() {
// 配置執行個體的使用者名稱密碼, 可在執行個體詳情頁>API入口 查看
AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
// 初始化非同步用戶端
client = AsyncClient.builder()
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
.setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
.setProtocol("http")
).build();
}
@Test
public void delete() throws Exception {
try {
// 文檔推送的表名稱,是執行個體id與表名的拼接,中間用底線串連
String tableName = "<instance_id>_<table_name>";
// 文檔推送的文檔主鍵欄位
String pkField = "<field_pk>";
// 文檔推送外層結構, 可添加對文檔操作的結構體. 結構內支援一個或多個文檔操作內容.
ArrayList<Map<String, ?>> documents = new ArrayList<>();
// 刪除文檔
Map<String, Object> deleteDocument = new HashMap<>();
Map<String, Object> deleteDocumentFields = new HashMap<>();
// 更新文檔內容資訊, keyValue 成對匹配.
// field_pk 欄位需與 pkField 欄位配置一致.
deleteDocumentFields.put("<field_pk>", "<field_pk_value>");
// 將文檔內容添如 deleteDocument 結構.
deleteDocument.put("fields", deleteDocumentFields);
// 刪除對應的文檔命令: delete
deleteDocument.put("cmd", "delete");
documents.add(deleteDocument);
// 推送資料
PushDocumentsRequest request = PushDocumentsRequest.builder().body(documents).build();
CompletableFuture<PushDocumentsResponse> responseCompletableFuture = client.pushDocuments(tableName, pkField, request);
String responseBody = responseCompletableFuture.get().getBody();
System.out.println("result:" + responseBody);
} catch (ExecutionException | InterruptedException e) {
System.out.println(e.getMessage());
} catch (TeaException e) {
System.out.println(e.getCode());
System.out.println(e.getMessage());
Map<String, Object> exceptionData = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
}
}
}說明
請求的相應結果可參考流量API說明>更新資料中的相應結果
不要使用
go get github.com/aliyun/alibabacloud-ha3-go-sdk命令拉取Git依賴,必須後面指定版本,因為向量檢索版和召回引擎版的tag都在同一個github下,拉取依賴的時候需根據執行個體的版本拉取對應依賴