使用 Tablestore Python SDK 的向量檢索可按向量相似性返回多元索引中最鄰近的資料。
前提條件
安裝Tablestore Python SDK並初始化用戶端。
向量檢索功能需要使用 5.4.4 及以上版本,建議使用最新版本的 SDK。
已在資料表上建立多元索引並配置 Vector 欄位。
功能說明
向量檢索將查詢向量與多元索引 Vector 欄位中的向量進行近似最近鄰(ANN)計算,按建立索引時配置的距離度量演算法為結果評分,並返回最鄰近的資料。向量欄位維度必須與查詢向量維度相同。
KnnVectorQuery(
field_name,
top_k=None,
float32_query_vector=None,
filter=None,
weight=None,
min_score=None,
num_candidates=None,
)
以下樣本查詢與指定四維向量最鄰近的 3 行資料,並按向量得分降序返回。
query = KnnVectorQuery(
"embedding",
top_k=3,
float32_query_vector=[1.0, 0.0, 0.0, 0.0],
)
response = client.search(
"example_table",
"example_index",
SearchQuery(
query,
sort=Sort([ScoreSort()]),
limit=3,
get_total_count=False,
),
ColumnsToGet(return_type=ColumnReturnType.ALL),
)
for hit in response.search_hits:
print(hit.score, hit.row)
向量檢索不支援將 get_total_count 設定為 True。向量欄位數量、維度和 top_k 存在限制,具體請參見多元索引使用限制。
參數說明
查詢請求
search 方法包含以下參數。
|
名稱 |
類型 |
說明 |
|
table_name(必選) |
|
資料表名稱。 |
|
index_name(必選) |
|
多元索引名稱。 |
|
search_query(必選) |
|
查詢條件和通用查詢配置。 |
|
columns_to_get(可選) |
|
返回列配置。未設定時只返回主鍵列。 |
|
routing_keys(可選) |
|
自訂路由欄位對應的主索引值列表。未配置自訂路由時無需設定。 |
|
timeout_s(可選) |
|
請求級逾時時間,單位為秒。未設定時使用用戶端預設逾時時間。 |
查詢配置
search_query 的類型為 SearchQuery,包含以下參數。
|
名稱 |
類型 |
說明 |
|
query(必選) |
|
查詢條件。設定為 |
|
sort(可選) |
|
返回結果的排序方式。有關配置方法,請參見排序和翻頁。 |
|
get_total_count(可選) |
|
向量檢索不支援統計匹配總行數,必須保持為 |
|
next_token(可選) |
|
翻頁憑證。將上一次響應的 |
|
offset(可選) |
|
本次查詢的起始位置,適用於淺翻頁。 |
|
limit(可選) |
|
本次查詢返回的最大行數。設定為 |
|
aggs(可選) |
|
指標彙總配置。有關配置方法,請參見統計彙總。 |
|
group_bys(可選) |
|
分組配置。有關配置方法,請參見統計彙總。 |
|
collapse_field(可選) |
|
結果摺疊配置。有關配置方法,請參見摺疊(去重)。 |
向量查詢條件
search_query.query 的類型為 KnnVectorQuery,包含以下參數。
|
名稱 |
類型 |
說明 |
|
field_name(必選) |
|
Vector 類型索引欄位名稱。 |
|
top_k(必選) |
|
要查詢的最鄰近向量數量,最大值為 |
|
float32_query_vector(必選) |
|
用於計算相似性的 Float32 查詢向量,長度必須與向量欄位維度相同。 |
|
filter(可選) |
|
近鄰資料還必須滿足的非向量查詢條件,可使用 |
|
weight(可選) |
|
向量查詢權重,必須大於或等於 |
|
min_score(可選) |
|
最小得分閾值,必須大於或等於 |
|
num_candidates(可選) |
|
每個索引分割區計算近鄰時訪問的候選數,取值範圍為 |
返回列
columns_to_get 的類型為 ColumnsToGet,包含以下參數。
|
名稱 |
類型 |
說明 |
|
column_names(可選) |
|
要返回的屬性列名稱。僅 |
|
return_type(可選) |
|
返回列模式。 |
傳回值
search 方法返回 SearchResponse。核心欄位如下。
|
欄位 |
類型 |
說明 |
|
rows |
|
本次查詢返回的行資料,數量不超過 |
|
next_token |
|
下一頁憑證。值為空白時表示沒有更多資料。 |
|
total_count |
|
向量檢索不支援統計匹配總行數,不應使用該欄位。 |
|
is_all_succeed |
|
是否已成功查詢全部索引分割區。值為 |
|
agg_results |
|
指標彙總結果。未配置 |
|
group_by_results |
|
分組結果。未配置 |
|
search_hits |
|
查詢命中結果,包含行資料、相關性得分和高亮結果等擴充資訊。 |
相容 Tuple 返回格式
Tablestore Python SDK 5.2.0 開始將查詢介面的傳回值由 Tuple 調整為響應對象,5.1.0 及以下版本直接返回 Tuple。5.2.1 及以上版本可調用 SearchResponse.v1_response() 擷取與舊版本相容的 Tuple。新代碼建議直接存取 SearchResponse 的屬性,避免返回欄位擴充後解包數量不匹配。
(
rows,
next_token,
total_count,
is_all_succeed,
agg_results,
group_by_results,
search_hits,
) = response.v1_response()
情境樣本
按非向量條件和得分過濾
以下樣本僅返回 category 以 book- 開頭且向量得分大於 0.1 的近鄰資料,並從每個索引分割區的 10 個候選中選取前 3 個。
query = KnnVectorQuery(
"embedding",
top_k=3,
float32_query_vector=[1.0, 0.0, 0.0, 0.0],
filter=PrefixQuery("category", "book-"),
min_score=0.1,
num_candidates=10,
)
response = client.search(
"example_table",
"example_index",
SearchQuery(query, limit=3, get_total_count=False),
)
for hit in response.search_hits:
print(hit.score, hit.row)