StarRocks向量索引技术详解:实现高效近似最近邻搜索
概述
在当今大数据和人工智能时代,向量数据(如嵌入向量、特征向量等)的处理变得越来越重要。StarRocks作为一款高性能分析型数据库,在3.4版本中引入了向量索引功能,支持高效的近似最近邻搜索(ANNS),为向量相似性搜索场景提供了强大的支持。
向量索引基础
什么是向量索引
向量索引是一种专门为高维向量数据设计的索引结构,它能够快速找到与查询向量最相似的向量,而无需进行暴力计算。StarRocks目前支持两种主流的向量索引算法:
- IVFPQ(倒排文件与乘积量化)
- HNSW(分层可导航小世界图)
索引算法对比
| 特性 | IVFPQ | HNSW | |------|-------|------| | 压缩比 | 高(约1:0.15) | 低(约1:0.8) | | 查询精度 | 需要二次精排 | 直接提供精确排序 | | 计算成本 | 较高 | 较低 | | 存储成本 | 低 | 高 | | 缓存策略 | 可调整缓存比例 | 仅支持全文件缓存 |
向量索引创建与使用
准备工作
在使用向量索引前,需要先启用该功能:
ADMIN SET FRONTEND CONFIG ("enable_experimental_vector" = "true");
创建表时定义向量索引
HNSW索引示例
CREATE TABLE hnsw (
id BIGINT(20) NOT NULL COMMENT "",
vector ARRAY<FLOAT> NOT NULL COMMENT "",
INDEX hnsw_vector (vector) USING VECTOR (
"index_type" = "hnsw",
"dim"="5",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"M" = "16",
"efconstruction" = "40"
)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
IVFPQ索引示例
CREATE TABLE ivfpq (
id BIGINT(20) NOT NULL COMMENT "",
vector ARRAY<FLOAT> NOT NULL COMMENT "",
INDEX ivfpq_vector (vector) USING VECTOR (
"index_type" = "ivfpq",
"dim"="5",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"nbits" = "16",
"nlist" = "40"
)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
关键参数详解
通用参数
- index_type: 索引类型,支持
hnsw
和ivfpq
- dim: 向量维度,必须与实际数据维度一致
- metric_type: 相似度度量方式,支持
l2_distance
(欧式距离)和cosine_similarity
(余弦相似度) - is_vector_normed: 向量是否已归一化,仅在
cosine_similarity
时有效
HNSW特有参数
- M: 每个节点在构建时建立的连接数,影响图结构的密度和搜索效率
- efconstruction: 构建时的候选列表大小,影响图构建质量和构建时间
IVFPQ特有参数
- nbits: 乘积量化的精度,影响压缩率和精度
- nlist: 聚类中心数量,影响搜索范围和精度
- M_IVFPQ: 子向量划分数量,必须是
dim
的因数
为已有表添加向量索引
CREATE INDEX ivfpq_vector
ON ivfpq (vector)
USING VECTOR (
"index_type" = "ivfpq",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"dim"="5",
"nlist" = "256",
"nbits"="10"
);
向量搜索实践
基本搜索语法
SELECT *, <vector_index_distance_func>(v1, [1,2,3]) as dis
FROM table_name
WHERE <vector_index_distance_func>(v1, [1,2,3]) <= 10
ORDER BY <vector_index_distance_func>(v1, [1,2,3])
LIMIT 10
搜索示例
近似搜索
SELECT id, approx_l2_distance([1,1,1,1,1], vector)
FROM test_hnsw
ORDER BY approx_l2_distance([1,1,1,1,1], vector)
LIMIT 1;
标量-向量联合搜索
SELECT id, approx_l2_distance([1,1,1,1,1], vector)
FROM test_hnsw
WHERE id = 1
ORDER BY approx_l2_distance([1,1,1,1,1], vector)
LIMIT 1;
范围搜索
SELECT * FROM (
SELECT id, approx_l2_distance([1,1,1,1,1], vector) score
FROM test_hnsw
) a
WHERE score < 40
ORDER BY score
LIMIT 1;
精确计算
SELECT id, l2_distance([1,1,1,1,1], vector)
FROM test_hnsw WHERE id = 1
ORDER BY l2_distance([1,1,1,1,1], vector)
LIMIT 1;
参数调优
HNSW搜索参数调优
SELECT
/*+ SET_VAR (ann_params='{efsearch=256}') */
id, approx_l2_distance([1,1,1,1,1], vector)
FROM test_hnsw
WHERE id = 1
ORDER BY approx_l2_distance([1,1,1,1,1], vector)
LIMIT 1;
efsearch参数:
- 默认值: 16
- 作用: 控制搜索时的候选列表大小,影响搜索精度和性能
最佳实践建议
-
索引选择:
- 对存储敏感且能接受较高计算成本的场景选择IVFPQ
- 对查询延迟敏感且存储资源充足的场景选择HNSW
-
参数调优:
- 从小数据集开始调优,确认效果后再应用到生产环境
- 平衡精度和性能,根据业务需求调整参数
-
查询优化:
- 合理使用范围过滤减少计算量
- 结合标量条件加速查询
-
监控与维护:
- 定期检查索引使用情况
- 根据数据变化调整索引参数
总结
StarRocks的向量索引功能为高维向量数据的相似性搜索提供了高效的解决方案。通过合理选择索引类型和调优参数,可以在精度和性能之间取得良好平衡,满足各种业务场景的需求。随着向量数据应用的不断扩展,这一功能将为用户带来显著的价值提升。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考