本文檔介紹如何使用Java、Python語言進行更新表資料,支援的更新操作有add、delete。
相關依賴
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非同步
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-ha3engine-async</artifactId>
<version>1.1.4</version>
</dependency>
參數說明
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
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)
}
}
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));
}
}
}
通過add推送資料時,主鍵相同新資料會覆蓋舊資料
delete 操作樣本
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()
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));
}
}
}
說明
請求的相應結果可參考流量API說明>更新資料中的相應結果
不要使用
go get github.com/aliyun/alibabacloud-ha3-go-sdk
命令拉取git依賴,必須後面指定版本,因為向量檢索版和召回引擎版的tag都在同一個github下,拉取依賴的時候需根據執行個體的版本拉取對應依賴