開啟向量引擎最佳化功能後,您可以通過SQL或API介面訪問雲原生資料倉儲AnalyticDB PostgreSQL版向量資料庫。本文介紹兩種訪問方式的使用方法和範例程式碼。
通過SQL訪問向量資料庫
Java
雲原生資料倉儲AnalyticDB PostgreSQL版向量資料庫支援使用PostgreSQL或Greenplum的JDBC驅動包串連。JDBC串連資料庫的操作,請參見JDBC。
在確保有PostgreSQL JDBC驅動的前提下,如果您使用Maven,可以在pom.xml檔案中添加以下依賴:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.5</version>
</dependency>通過Java代碼訪問向量資料庫的範例程式碼如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class GreenplumSample {
public static void main(String[] args) {
String url = "jdbc:postgresql://yourhost:yourport/yourdbname";
String user = "yourusername";
String password = "yourpassword";
try {
// 載入驅動
Class.forName("org.postgresql.Driver");
// 建立串連
Connection con = DriverManager.getConnection(url, user, password);
// 建立語句
Statement st = con.createStatement();
// 執行查詢
String query = "SELECT * FROM yourtable LIMIT 10";
ResultSet rs = st.executeQuery(query);
// 處理結果
while(rs.next()) {
// 假設知道結果集中至少有一列,且為字串類型
String resultColumn = rs.getString(1);
System.out.println(resultColumn);
}
// 關閉資源
rs.close();
st.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Python
雲原生資料倉儲AnalyticDB PostgreSQL版向量資料庫可以使用psycopg2工具串連,並通過Python代碼匯入和查詢向量資料。psycopg2串連資料庫的操作,請參見Python。
通過python代碼訪問向量資料庫的範例程式碼如下:
import psycopg2
from psycopg2 import pool
# 建立串連池
connection_pool = psycopg2.pool.SimpleConnectionPool(
minconn=1,
maxconn=10,
user='your_username',
password='your_password',
host='your_host',
port='your_port',
database='your_database'
)
# 串連探活檢查
def is_connection_alive(conn):
try:
conn.cursor().execute("SELECT 1")
except (psycopg2.OperationalError, psycopg2.InterfaceError):
return False
return True
# 從串連池擷取連線物件
def get_connection():
conn = connection_pool.getconn()
while not is_connection_alive(conn):
conn = connection_pool.getconn()
return conn
# 將連線物件放回串連池
def release_connection(conn):
connection_pool.putconn(conn)
# 使用連線物件執行查詢
def execute_query(query):
conn = get_connection()
cursor = conn.cursor()
try:
cursor.execute(query)
if query.startswith("SELECT"):
result = cursor.fetchall()
else:
conn.commit()
result = None
except (psycopg2.DatabaseError, psycopg2.InterfaceError) as e:
print(f"Error executing query: {e}")
conn.rollback()
result = None
cursor.close()
release_connection(conn)
return result
# 樣本查詢
# 查詢
select_query = "SELECT * FROM your_table"
result = execute_query(select_query)
if result:
print(result)
# 插入
insert_query = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')"
execute_query(insert_query)
# 更新
update_query = "UPDATE your_table SET column1 = 'new_value' WHERE column2 = 'value2'"
execute_query(update_query)
# 刪除
delete_query = "DELETE FROM your_table WHERE column1 = 'value1'"
execute_query(delete_query)C
雲原生資料倉儲AnalyticDB PostgreSQL版向量資料庫可以使用libpq庫串連,並使用C語言代碼匯入和查詢向量資料。
通過C語言代碼訪問向量資料庫的範例程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
int main() {
const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i, j;
// 設定連接字串
conninfo = "dbname=yourdbname user=yourusername host=yourhostname port=yourport password=yourpassword";
// 建立串連
conn = PQconnectdb(conninfo);
// 檢查狀態
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "串連失敗: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
// 執行一個查詢
res = PQexec(conn, "SELECT * FROM yourtablename LIMIT 10");
// 檢查是否正常返回了結果集
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, "SELECT命令未返回資料: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
exit(1);
}
// 擷取欄位數
nFields = PQnfields(res);
// 列印每一行
for (i = 0; i < PQntuples(res); i++) {
for (j = 0; j < nFields; j++) {
printf("%s = %s", PQfname(res, j), PQgetvalue(res, i, j));
}
printf("\n");
}
// 清理
PQclear(res);
// 關閉串連
PQfinish(conn);
return 0;
}
通過API訪問向量資料庫
OpenAPI封裝了雲原生資料倉儲AnalyticDB PostgreSQL版向量操作的DDL和DML,使您可以通過OpenAPI來管理向量資料。
前提條件
已建立初始帳號。
若您使用RAM使用者,則需要對RAM使用者進行授權,更多方式請參見Python調用SDK樣本。
操作流程
安裝SDK。
初始化Client。
初始化向量庫。
建立Namespace。
建立Collection。
上傳向量資料。
召迴向量資料。
安裝SDK
SDK下載地址請參見SDK參考。
Java
如果您使用Maven,可以在pom.xml檔案中添加以下依賴:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>gpdb20160503</artifactId>
<version>3.12.0</version>
</dependency>
<!-- 依賴版本不低於 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>openapiutil</artifactId>
<version>0.2.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-util</artifactId>
<version>0.2.21</version>
</dependency>Go
執行以下命令安裝Go SDK:
go get github.com/alibabacloud-go/gpdb-20160503/v4/client
go get github.com/alibabacloud-go/darabonba-openapi/v2/client
go get github.com/alibabacloud-go/tea-utils/v2/service
go get github.com/alibabacloud-go/teaPython 3
當您沒有指定SDK版本時,將自動安裝最新版本的SDK,具體代碼如下:
pip install alibabacloud_gpdb20160503
pip install alibabacloud_tea_openapi當您需要安裝指定版本的SDK時(本文alibabacloud_gpdb20160503以3.5.0版本為例,alibabacloud_tea_openapi以0.3.8版本為例),請執行如下命令:
pip install alibabacloud_gpdb20160503==3.5.0
pip install alibabacloud_tea_openapi==0.3.8初始化Client
初始化訪問OpenAPI的Client,調用樣本如下,環境變數參數如下:
ALIBABA_CLOUD_ACCESS_KEY_ID:訪問OpenAPI的Access Key ID。
ALIBABA_CLOUD_ACCESS_KEY_SECRET:訪問OpenAPI的Secret Access Key。
Java
import com.aliyun.gpdb20160503.Client;
import com.aliyun.teaopenapi.models.Config;
public static Client getClient() throws Exception {
Config config = new Config();
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.setRegionId("cn-beijing"); // 執行個體所在region,請按照目標執行個體設定
config.setEndpoint("gpdb.****uncs.com"); // 如果通過公網ip訪問,不需配置此項,否則按照https://api.aliyun.com/product/gpdb配置
config.setMaxIdleConns(200); // 最大串連數,按照此Client的最大並發設定
return new Client(config);
}Go
package main
import (
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
"github.com/alibabacloud-go/tea/tea"
)
func CreateClient() (_result *gpdb20160503.Client, _err error) {
config := &openapi.Config{
AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
}
// Endpoint 請參考 https://api.aliyun.com/product/gpdb
config.Endpoint = tea.String("gpdb.aliyuncs.com")
_result = &gpdb20160503.Client{}
_result, _err = gpdb20160503.NewClient(config)
return _result, _err
}Python 3
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_gpdb20160503.client import Client
import os
ALIBABA_CLOUD_ACCESS_KEY_ID = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
ALIBABA_CLOUD_ACCESS_KEY_SECRET = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
def get_client():
config = open_api_models.Config(
access_key_id=ALIBABA_CLOUD_ACCESS_KEY_ID,
access_key_secret=ALIBABA_CLOUD_ACCESS_KEY_SECRET
)
config.region_id = "cn-beijing" # 執行個體所在region
return Client(config)初始化向量庫
在使用向量檢索前,需初始化knowledgebase庫以及全文檢索索引相關功能。
調用樣本如下,參數說明,請參見InitVectorDatabase - 初始化向量資料庫。
Java
import com.aliyun.gpdb20160503.models.*;
import com.aliyun.gpdb20160503.Client;
import com.google.gson.Gson;
public static void initVectorDatabase() throws Exception {
String region = "cn-beijing"; // 執行個體所在region
String instanceId = "gp-bp1c62r3l489****"; // 執行個體id
String managerAccount = "myaccount"; // 執行個體初始帳號
String managerAccountPassword = "myaccount_password"; // 執行個體初始密碼
InitVectorDatabaseRequest request = new InitVectorDatabaseRequest();
request.setRegionId(region);
request.setDBInstanceId(instanceId);
request.setManagerAccount(managerAccount);
request.setManagerAccountPassword(managerAccountPassword);
Client client = getClient();
InitVectorDatabaseResponse response = client.initVectorDatabase(request);
System.out.println(response.getStatusCode());
System.out.println(new Gson().toJson(response.getBody()));
}
public static void main(String[ ] args) throws Exception {
initVectorDatabase();
}Go
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func initVectorDatabase() {
client, _err := CreateClient()
if _err != nil {
panic(_err)
}
initVectorDatabaseRequest := &gpdb20160503.InitVectorDatabaseRequest{
RegionId: tea.String("cn-beijing"),
DBInstanceId: tea.String("gp-bp1c62r3l489****"),
ManagerAccount: tea.String("myaccount"),
ManagerAccountPassword: tea.String("myaccount_password"),
}
runtime := &util.RuntimeOptions{}
response, _err := client.InitVectorDatabaseWithOptions(initVectorDatabaseRequest, runtime)
if _err != nil {
panic(_err)
}
fmt.Printf("response is %#v\n", response.Body)
}
func main() {
initVectorDatabase()
}Python 3
from alibabacloud_gpdb20160503 import models as gpdb_20160503_models
def init_vector_database():
region_id = "cn-beijing" # 執行個體所在region
dbinstance_id = "gp-bp1c62r3l489****" # 執行個體id
manager_account = "myaccount" # 執行個體初始帳號
manager_account_password = "myaccount_password" # 執行個體初始密碼
request = gpdb_20160503_models.InitVectorDatabaseRequest(
region_id=region_id,
dbinstance_id=dbinstance_id,
manager_account=manager_account,
manager_account_password=manager_account_password
)
response = get_client().init_vector_database(request)
print(f"init_vector_database response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
init_vector_database()
# output: body:
# {
# "Message":"success",
# "RequestId":"FC1E0318-E785-1F21-A33C-FE4B0301B608",
# "Status":"success"
# }建立Namespace
Namespace用於Schema隔離,在使用向量前,需至少建立一個Namespace或者使用public的Namespace。
調用樣本如下,參數說明,請參見CreateNamespace - 建立命名空間。
Java
import com.aliyun.gpdb20160503.models.*;
import com.aliyun.gpdb20160503.Client;
import com.google.gson.Gson;
public static void createNamespace() throws Exception {
String region = "cn-beijing"; // 執行個體所在region
String instanceId = "gp-bp1c62r3l489****"; // 執行個體id
String managerAccount = "myaccount"; // 執行個體初始帳號
String managerAccountPassword = "myaccount_password"; // 執行個體初始密碼
String namespace = "vector_test"; // 要建立的namespace
String namespacePassword = "vector_test_password"; // namespace對應的密碼
CreateNamespaceRequest request = new CreateNamespaceRequest();
request.setRegionId(region);
request.setDBInstanceId(instanceId);
request.setManagerAccount(managerAccount);
request.setManagerAccountPassword(managerAccountPassword);
request.setNamespace(namespace);
request.setNamespacePassword(namespacePassword);
Client client = getClient();
CreateNamespaceResponse response = client.createNamespace(request);
System.out.println(response.getStatusCode());
System.out.println(new Gson().toJson(response.getBody()));
}
public static void main(String[ ] args) throws Exception {
createNamespace();
}Go
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func createNamespace() {
client, _err := CreateClient()
if _err != nil {
panic(_err)
}
createNamespaceRequest := &gpdb20160503.CreateNamespaceRequest{
RegionId: tea.String("cn-beijing"),
DBInstanceId: tea.String("gp-bp1c62r3l489****"),
ManagerAccount: tea.String("myaccount"),
ManagerAccountPassword: tea.String("myaccount_password"),
Namespace: tea.String("vector_test"),
NamespacePassword: tea.String("vector_test_password"),
}
runtime := &util.RuntimeOptions{}
response, _err := client.CreateNamespaceWithOptions(createNamespaceRequest, runtime)
if _err != nil {
panic(_err)
}
fmt.Printf("response is %#v\n", response.Body)
}
func main() {
createNamespace()
}Python 3
def create_namespace():
region_id = "cn-beijing" # 執行個體所在region
dbinstance_id = "gp-bp1c62r3l489****" # 執行個體id
manager_account = "myaccount" # 執行個體初始帳號
manager_account_password = "myaccount_password" # 執行個體初始密碼
namespace = "vector_test" # 要建立的namespace
namespace_password = "vector_test_password" # namespace對應的密碼
request = gpdb_20160503_models.CreateNamespaceRequest(
region_id=region_id,
dbinstance_id=dbinstance_id,
manager_account=manager_account,
manager_account_password=manager_account_password,
namespace=namespace,
namespace_password=namespace_password
)
response = get_client().create_namespace(request)
print(f"create_namespace response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
create_namespace()
# output: body:
# {
# "Message":"success",
# "RequestId":"78356FC9-1920-1E09-BB7B-CCB6BD267124",
# "Status":"success"
# }建立完後,可以在執行個體的knowledgebase庫查看對應的Schema。
SELECT schema_name FROM information_schema.schemata;建立Collection
Collection用於儲存向量資料,並使用Namespace隔離。
Java
import com.aliyun.gpdb20160503.models.*;
import com.aliyun.gpdb20160503.Client;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
public static void createCollection() throws Exception {
String region = "cn-beijing"; // 執行個體所在region
String instanceId = "gp-bp1c62r3l489****"; // 執行個體id
String managerAccount = "myaccount"; // 執行個體初始帳號
String managerAccountPassword = "myaccount_password"; // 執行個體初始密碼
String namespace = "vector_test"; // 已建立的namespace
String collection = "document"; // 要建立的collection
Map<String, String> metadata = new HashMap<>();
metadata.put("title", "text");
metadata.put("link", "text");
metadata.put("content", "text");
metadata.put("pv", "int");
String fullTextRetrievalFields = "title,content"; // 全文檢索索引欄位
Long dimension = 10L; // 向量維度
CreateCollectionRequest request = new CreateCollectionRequest();
request.setRegionId(region);
request.setDBInstanceId(instanceId);
request.setManagerAccount(managerAccount);
request.setManagerAccountPassword(managerAccountPassword);
request.setNamespace(namespace);
request.setCollection(collection);
request.setMetadata(new Gson().toJson(metadata));
request.setFullTextRetrievalFields(fullTextRetrievalFields);
request.setDimension(dimension);
request.setParser("zh_cn");
Client client = getClient();
CreateCollectionResponse response = client.createCollection(request);
System.out.println(response.getStatusCode());
System.out.println(new Gson().toJson(response.getBody()));
}
public static void main(String[ ] args) throws Exception {
createCollection();
}Go
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func createCollection() {
client, _err := CreateClient()
if _err != nil {
panic(_err)
}
createCollectionRequest := &gpdb20160503.CreateCollectionRequest{
RegionId: tea.String("cn-beijing"),
DBInstanceId: tea.String("gp-bp1c62r3l489****"),
ManagerAccount: tea.String("myaccount"),
ManagerAccountPassword: tea.String("myaccount_password"),
Namespace: tea.String("vector_test"),
Collection: tea.String("document"),
Dimension: tea.Int64(3),
Parser: tea.String("zh_cn"),
FullTextRetrievalFields: tea.String("title,content"),
Metadata: tea.String("{\"title\":\"text\",\"content\":\"text\",\"response\":\"int\"}"),
}
runtime := &util.RuntimeOptions{}
response, _err := client.CreateCollectionWithOptions(createCollectionRequest, runtime)
if _err != nil {
panic(_err)
}
fmt.Printf("response is %#v\n", response.Body)
}
func main() {
createCollection()
}Python 3
def create_collection():
region_id = "cn-beijing" # 執行個體所在region
dbinstance_id = "gp-bp1c62r3l489****" # 執行個體id
manager_account = "myaccount" # 執行個體初始帳號
manager_account_password = "myaccount_password" # 執行個體初始密碼
namespace = "vector_test" # 已建立的namespace
collection = "document" # 要建立的collection
metadata = '{"title":"text", "content": "text", "page":"int"}'
full_text_retrieval_fields = "title,content" # 全文檢索索引欄位
dimension = 8 # 向量維度
request = gpdb_20160503_models.CreateCollectionRequest(
region_id=region_id,
dbinstance_id=dbinstance_id,
manager_account=manager_account,
manager_account_password=manager_account_password,
namespace=namespace,
collection=collection,
metadata=metadata,
full_text_retrieval_fields=full_text_retrieval_fields,
dimension=dimension
)
response = get_client().create_collection(request)
print(f"create_collection response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
create_collection()
# output: body:
# {
# "Message":"success",
# "RequestId":"7BC35B66-5F49-1E79-A153-8D26576C4A3E",
# "Status":"success"
# }建立完後,可以在執行個體的knowledgebase庫查看對應的Table。
SELECT tablename FROM pg_tables WHERE schemaname='vector_test';上傳向量資料
將準備好的Embedding向量資料上傳到對應的Collection中。
調用樣本如下,參數說明,請參見UpsertCollectionData - 上傳向量資料。
Java
import com.aliyun.gpdb20160503.models.*;
import com.aliyun.gpdb20160503.Client;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public static void upsertCollectionData() throws Exception {
String region = "cn-beijing"; // 執行個體所在region
String instanceId = "gp-bp1c62r3l489****"; // 執行個體id
String namespace = "vector_test"; // 已建立的namespace
String namespacePassword = "vector_test_password"; // namespace密碼
String collection = "document"; // 已建立的collection
UpsertCollectionDataRequest request = new UpsertCollectionDataRequest();
request.setRegionId(region);
request.setDBInstanceId(instanceId);
request.setNamespace(namespace);
request.setNamespacePassword(namespacePassword);
request.setCollection(collection);
request.setRows(getRows());
Client client = getClient();
UpsertCollectionDataResponse response = client.upsertCollectionData(request);
System.out.println(response.getStatusCode());
System.out.println(new Gson().toJson(response.getBody()));
}
public static List<UpsertCollectionDataRequest.UpsertCollectionDataRequestRows> getRows() {
List<UpsertCollectionDataRequest.UpsertCollectionDataRequestRows> rows = new ArrayList<>();
UpsertCollectionDataRequest.UpsertCollectionDataRequestRows row = new UpsertCollectionDataRequest.UpsertCollectionDataRequestRows();
Map<String, String> metadata = new HashMap<>();
metadata.put("title", "測試文檔");
metadata.put("content", "測試內容");
metadata.put("link", "http://127.0.0.1/document1");
metadata.put("pv", "1000");
row.setMetadata(metadata);
row.setVector(Arrays.asList(0.2894745251078251,0.5364747050266715,0.1276845661831275,0.22528871956822372,0.7009319238651552,0.40267406135256123,0.8873626696379067,0.1248525955774931,0.9115507046412368,0.2450859133174706));
rows.add(row);
return rows;
}
public static void main(String[ ] args) throws Exception {
upsertCollectionData();
}Go
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func upsertCollectionData() {
client, _err := CreateClient()
if _err != nil {
panic(_err)
}
rows0Metadata := map[string]*string{
"title": tea.String("測試文檔"),
"content": tea.String("測試內容"),
"response": tea.String("1"),
}
rows0 := &gpdb20160503.UpsertCollectionDataRequestRows{
Metadata: rows0Metadata,
Id: tea.String("0CB55798-ECF5-4064-B81E-FE35B19E01A6"),
Vector: [ ]*float64{tea.Float64(0.2894745251078251), tea.Float64(0.5364747050266715), tea.Float64(0.1276845661831275)},
}
upsertCollectionDataRequest := &gpdb20160503.UpsertCollectionDataRequest{
RegionId: tea.String("cn-beijing"),
Rows: [ ]*gpdb20160503.UpsertCollectionDataRequestRows{rows0},
DBInstanceId: tea.String("gp-bp1c62r3l489****"),
Collection: tea.String("document"),
Namespace: tea.String("vector_test"),
NamespacePassword: tea.String("vector_test_password"),
}
runtime := &util.RuntimeOptions{}
response, _err := client.UpsertCollectionDataWithOptions(upsertCollectionDataRequest, runtime)
if _err != nil {
panic(_err)
}
fmt.Printf("response is %#v\n", response.Body)
}
func main() {
upsertCollectionData()
}Python 3
def upsert_collection_data():
region_id = "cn-beijing" # 執行個體所在region
dbinstance_id = "gp-bp1c62r3l489****" # 執行個體id
namespace = "vector_test" # 已建立的namespace
namespace_password = "vector_test_password" # namespace密碼
collection = "document" # 已建立的collection
rows = [ ]
rows.append(gpdb_20160503_models.UpsertCollectionDataRequestRows(
id="0CB55798-ECF5-4064-B81E-FE35B19E01A6",
metadata={
"page": 1,
"content": "測試內容",
"title": "測試文檔"
},
vector=[0.2894745251078251, 0.5364747050266715, 0.14858841010401188, 0.42140750105351877,
0.5780346820809248, 0.1145475372279496, 0.04329004329004329, 0.43246796493549741]
))
request = gpdb_20160503_models.UpsertCollectionDataRequest(
region_id=region_id,
dbinstance_id=dbinstance_id,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
rows=rows,
)
response = get_client().upsert_collection_data(request)
print(f"upsert_collection_data response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
upsert_collection_data()
# output: body:
# {
# "Message":"success",
# "RequestId":"8FEE5D1E-ECE8-1F2F-A17F-48039125CDC3",
# "Status":"success"
# }上傳完成,可以在執行個體的knowledgebase庫查看資料。
SELECT * FROM vector_test.document;召迴向量資料
準備需要召回的查詢向量或全文檢索索引欄位,執行查詢介面。
調用樣本如下,參數說明,請參見QueryCollectionData - 召迴向量資料。
Java
import com.aliyun.gpdb20160503.models.QueryCollectionDataRequest;
import com.aliyun.gpdb20160503.models.QueryCollectionDataResponse;
import com.aliyun.gpdb20160503.Client;
import com.google.gson.Gson;
import java.util.Arrays;
public static void queryCollectionData() throws Exception {
QueryCollectionDataRequest request = new QueryCollectionDataRequest();
request.setDBInstanceId("gp-bp1c62r3l489****");
request.setCollection("document");
request.setNamespace("vector_test");
request.setNamespacePassword("vector_test_password");
request.setContent("測試");
request.setFilter("pv > 10");
request.setTopK(10L);
request.setVector(Arrays.asList(0.7152607422256894,0.5524872066437732,0.1168505269851303,0.704130971473022,0.4118874999967596,0.2451574619214022,0.18193414783144812,0.3050522957905741,0.24846180714868163,0.0549715380856951));
request.setRegionId("cn-beijing");
Client client = getClient();
QueryCollectionDataResponse response = client.queryCollectionData(request);
System.out.println(response.getStatusCode());
System.out.println(new Gson().toJson(response.getBody()));
}
public static void main(String[ ] args) throws Exception {
queryCollectionData();
}返回結果如下:
{
"Matches": {
"match": [
{
"Id": "0CB55798-ECF5-4064-B81E-FE35B19E01A6",
"Metadata": {
"title":"測試文檔",
"content":"測試內容",
"link":"http://127.0.0.1/document1",
"pv":"1000"
},
"Values": [
0.2894745251078251,
0.5364747050266715,
0.1276845661831275,
0.22528871956822372,
0.7009319238651552,
0.40267406135256123,
0.8873626696379067,
0.1248525955774931,
0.9115507046412368,
0.2450859133174706
]
}
]
},
"RequestId": "ABB39CC3-4488-4857-905D-2E4A051D0521",
"Status": "success"
}Go
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
gpdb20160503 "github.com/alibabacloud-go/gpdb-20160503/v4/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func queryCollectionData() {
client, _err := CreateClient()
if _err != nil {
panic(_err)
}
queryCollectionDataRequest := &gpdb20160503.QueryCollectionDataRequest{
RegionId: tea.String("cn-beijing"),
DBInstanceId: tea.String("gp-bp1c62r3l489****"),
Collection: tea.String("document"),
Namespace: tea.String("vector_test"),
NamespacePassword: tea.String("vector_test_password"),
Content: tea.String("測試"),
Filter: tea.String("response > 0"),
TopK: tea.Int64(10),
Vector: [ ]*float64{tea.Float64(0.7152607422256894), tea.Float64(0.5524872066437732), tea.Float64(0.1168505269851303)},
}
runtime := &util.RuntimeOptions{}
response, _err := client.QueryCollectionDataWithOptions(queryCollectionDataRequest, runtime)
if _err != nil {
panic(_err)
}
fmt.Printf("response is %#v\n", response.Body)
}
func main() {
queryCollectionData()
}返回結果如下:
{
"Matches": {
"match": [
{
"Id": "0CB55798-ECF5-4064-B81E-FE35B19E01A6",
"Metadata": {
"content": "測試內容",
"response": "1",
"source": "3",
"title": "測試文檔"
},
"MetadataV2": {
"content": "測試內容",
"response": 1,
"source": 3,
"title": "測試文檔"
},
"Score": 0.9132830731723668,
"Values": {
"value": [
0.28947452,
0.5364747,
0.12768456
]
}
}
]
},
"RequestId": "707D2202-61A6-53DF-AAD2-E8DE276CE292",
"Status": "success"
}Python 3
def query_collection_data():
region_id = "cn-beijing" # 執行個體所在region
dbinstance_id = "gp-bp1c62r3l489****" # 執行個體id
namespace = "vector_test" # 已建立的namespace
namespace_password = "vector_test_password" # namespace密碼
collection = "document" # 已建立的collection
content = "test query"
vector = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
request = gpdb_20160503_models.QueryCollectionDataRequest(
region_id=region_id,
dbinstance_id=dbinstance_id,
namespace=namespace,
namespace_password=namespace_password,
collection=collection,
top_k=5,
content=content,
vector=vector,
)
response = get_client().query_collection_data(request)
print(f"query_collection_data response code: {response.status_code}, body:{response.body}")
if __name__ == '__main__':
query_collection_data()
# output:
# query_collection_data response code: 200, body:{'Matches': {'match': [{'Id': '0CB55798-ECF5-4064-B81E-FE35B19E01A6', 'Metadata': {'source': 1, 'page': '1', 'title': '測試文檔', 'content': '測試內容'}, 'Score': 0.7208109110736349, 'Values': {'value': [0.28947452, 0.5364747, 0.1485884, 0.4214075, 0.5780347, 0.114547536, 0.043290045, 0.7]}}]}, 'RequestId': '709E2C82-FE25-1722-9DBB-00AD0F85ABBB', 'Status': 'success'}相關文檔
如果有更多其他語言用戶端的使用需求,請參見pgvector相容模式使用指南。