使用 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)