本文檔介紹如何使用Java、Python語言進行更新表數據,支持的更新操作有add、delete。
相關依賴
Java異步
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-ha3engine-async</artifactId>
<version>1.1.3</version>
</dependency>
Java
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-ha3engine-vector</artifactId>
<version>1.1.8</version>
</dependency>
Python
#Requires: Python >=3.6
pip install alibabacloud_ha3engine_vector
Go
go get github.com/aliyun/alibabacloud-ha3-go-sdk@v1.1.8-vector
參數說明
Java、Python SDK中都需要配置如下5個必要參數(endpoint、instance_id、access_user_name、access_pass_word、data_source_name):
endpoint:私網/公網域名
可在實例詳情頁中網絡信息和API入口查看:
開啟公網訪問后可以在本地通過公網域名(包含public的域名)調用實例,可以參考添加白名單配置訪問的白名單IP。
若有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異步
主要是在程序中動態將對應的文檔數據封裝到Map對象中,再將這些Map對象通過add方法添加到緩存中,最后調用pushDocuments方法,批量提交這些Map對象文檔數據。
package com.aliyun.ha3engine;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
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;
/**
* @author alibaba
*/
public class PushDoc {
public static void main(String[] args) {
try {
// 配置實例的用戶名密碼, 可在實例詳情頁>網絡信息 查看
AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
// 初始化異步客戶端
AsyncClient client = AsyncClient.builder()
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
//公網域名, 實例名可在實例詳情頁>API入口 查看
.setEndpointOverride("ha-cn-***********.public.ha.aliyuncs.com")
.setProtocol("http")
).build();
// 文檔推送的表名稱,是實例id與表名的拼接,中間用下劃線連接
String tableName = "<instance_datasource_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();
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.getMessage());
Map<String, Object> abc = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
}
}
}
Java
package com.aliyun.ha3engine;
import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @author alibaba
*/
public class PushDoc {
public static void main(String[] args) throws Exception {
Config config = new Config();
// API域名,可在實例詳情頁>API入口 查看
config.setEndpoint("<instance_services_domain>");
// 實例名稱,可在實例詳情頁左上角查看,例:ha-cn-i7*****605
config.setInstanceId("<instance_id>");
// 用戶名,可在實例詳情頁>網絡信息 查看
config.setAccessUserName("<user_name>");
// 密碼,可在實例詳情頁>網絡信息 修改
config.setAccessPassWord("<user_password>");
Client client = new Client(config);
// 文檔推送的表名稱,是實例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();
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.getMessage());
Map<String, Object> abc = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
}
}
}
Python
# -*- coding: utf-8 -*-
from alibabacloud_ha3engine_vector import models, client
from Tea.exceptions import TeaException, RetryError
Config = models.Config(
endpoint="<API域名>", # // API域名,可在實例詳情頁>API入口 查看(需要去掉http://前綴)
instance_id="<實例id>", # // 實例id,可在實例詳情頁左上角查看,例:ha-cn-i7*****605
protocol="http",
access_user_name="<用戶名>", # // 用戶名,可在實例詳情頁>API入口 查看
access_pass_word="<用戶名密碼>" # // 用戶名密碼,可在實例詳情頁>API入口 修改
)
# 初始化 引擎客戶端
ha3EngineClient = 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)
# 文檔推送的文檔主鍵字段.
pkField = "id"
# 使用默認 運行時參數進行請求
response = ha3EngineClient.push_documents(tableName, pkField, pushDocumentsRequest)
print(response.body)
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{
// 私網域名或者公網域名
Endpoint: tea.String("<endpoint>"),
// 實例名稱,可在實例詳情頁左上角查看,例:ha-cn-i7*****605
InstanceId: tea.String("<InstanceId>"),
// 用戶名,可在實例詳情頁>網絡信息 查看
AccessUserName: tea.String("<AccessUserName>"),
// 密碼,可在實例詳情頁>網絡信息 修改
AccessPassWord: tea.String("<AccessPassWord>"),
}
// 初始化一個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與表名的拼接,中間用下劃線連接
dataSourceName := "<instance_id>_<table_name>"
keyField := "id"
a := [20]int{}
array := []map[string]interface{}{}
for x := range a {
filed := map[string]interface{}{
"fields": map[string]interface{}{
"id": tea.ToString(x),
"fb_boolean": tea.BoolValue(nil),
"fb_datetime": "2167747200000",
"fb_string": "409a6b18-a10b-409e-af91-07121c45d899",
},
"cmd": tea.String("add"),
}
array = append(array, filed)
pushDocumentsRequestModel.SetBody(array)
// 發送請求的方法調用.
response, _requestErr := client.PushDocuments(tea.String(dataSourceName), tea.String(keyField), pushDocumentsRequestModel)
// 如果 發送請求 過程中出現異常. 則 返回 _requestErr 且輸出 錯誤信息.
if _requestErr != nil {
fmt.Println(_requestErr)
return
}
// 輸出正常返回的 response 內容.
fmt.Println(response)
}
}
通過add推送數據時,主鍵相同新數據會覆蓋舊數據
delete 操作示例
Java異步
package com.aliyun.ha3engine;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
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;
/**
* @author alibaba
*/
public class PushDoc {
public static void main(String[] args) throws Exception {
try {
// 配置實例的用戶名密碼, 可在實例詳情頁>網絡信息 查看
AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
// 初始化異步客戶端
AsyncClient client = AsyncClient.builder()
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
//公網域名, 實例名可在實例詳情頁>API入口 查看
.setEndpointOverride("ha-cn-***********.public.ha.aliyuncs.com")
.setProtocol("http")
).build();
// 文檔推送的表名稱,是實例id與表名的拼接,中間用下劃線連接
String tableName = "<instance_datasource_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.getMessage());
Map<String, Object> abc = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
}
}
}
Java
package com.aliyun.ha3engine;
import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* @author alibaba
*/
public class PushDoc {
public static void main(String[] args) throws Exception {
Config config = new Config();
// API域名,可在實例詳情頁>API入口 查看
config.setEndpoint("<instance_services_domain>");
// 實例名稱,可在實例詳情頁左上角查看,例:ha-cn-i7*****605
config.setInstanceId("<instance_id>");
// 用戶名,可在實例詳情頁>網絡信息 查看
config.setAccessUserName("<user_name>");
// 密碼,可在實例詳情頁>網絡信息 修改
config.setAccessPassWord("<user_password>");
Client client = new Client(config);
// 文檔推送的表名稱,是實例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.getMessage());
Map<String, Object> abc = e.getData();
System.out.println(com.aliyun.teautil.Common.toJSONString(abc));
}
}
}
Python
# -*- coding: utf-8 -*-
from alibabacloud_ha3engine_vector import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError
Config = models.Config(
endpoint="<API域名>", # // API域名,可在實例詳情頁>API入口 查看(需要去掉http://前綴)
instance_id="<實例id>", # // 實例id,可在實例詳情頁左上角查看,例:ha-cn-i7*****605
protocol="http",
access_user_name="<用戶名>", # // 用戶名,可在實例詳情頁>API入口 查看
access_pass_word="<用戶名密碼>", # // 用戶名密碼,可在實例詳情頁>API入口 修改
)
# 初始化 引擎客戶端
ha3EngineClient = client.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)
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()
說明
請求的相應結果可參考流量API說明>更新數據中的相應結果
不要使用
go get github.com/aliyun/alibabacloud-ha3-go-sdk
命令拉取git依賴,必須后面指定版本,因為向量檢索版和召回引擎版的tag都在同一個github下,拉取依賴的時候需根據實例的版本拉取對應依賴