向量索引
本文介绍了StarRocks的向量索引功能及如何使用它进行近似最近邻搜索(ANNS)。
向量索引功能仅在v3.4或更高版本的存算一体集群中支持。
概述
目前,StarRocks支持在Segment文件级别进行向量索引。索引将每个搜索项映射到Segment文件中的行ID,通过直接定位相应的数据行实现快速数据检索,而无需进行暴力的向量距离计算。系统目前提供两种类型的向量索引:倒排文件与乘积量化(IVFPQ)和分层可导航小世界(HNSW),每种都有其独特的组织结构。
倒排文件与乘积量化(IVFPQ)
倒排文件与乘积量化(IVFPQ)是一种用于大规模高维向量近似最近邻搜索的方法,常用于深度学习和机器学习中的向量检索任务。IVFPQ由两个主要组件组成:倒排文件和乘积量化。
- 倒排文件:这是一个索引方法。它将数据集划分为多个簇(或Voronoi单元),每个簇都有一个质心(种子点),并将每个数据点(向量)分配到其最近的簇中心。对于向量搜索,IVFPQ只需搜索最近的簇,大大减少了搜索范围和复杂性。
- 乘积量化:这是一种数据压缩技术。它将高维向量分割为子向量,并将每个子向量量化以映射到预定义集合中的最近点,从而在保持高精度的同时降低存储和计算成本。
通过结合倒排文件和乘积量化,IVFPQ能够在大规模高维数据集中实现高效的近似最近邻搜索。
分层可导航小世界(HNSW)
分层可导航小世界(HNSW)是一种基于图的高维最近邻搜索算法,也广泛用于向量检索任务。
HNSW构建了一个分层图结构,其中每一层都是一个可导航的小世界(NSW)图。在图中,每个顶点代表一个数据点,边表示顶点之间的相似性。图的高层包含较少的顶点和稀疏的连接用于快速全局搜索,而低层包含所有顶点和密集的连接用于精确的局部搜索。
对于向量搜索,HNSW首先在顶层进行搜索,快速识别一个近似的最近邻区域,然后逐层向下移动,在底层找到精确的最近邻。
HNSW提供了效率和精度的平衡,使其适应各种数据和查询分布。
IVFPQ与HNSW的比较
- 数据压缩比:IVFPQ具有较高的压缩比(约为1:0.15)。由于PQ会压缩向量,索引计算仅提供粗略排序后的初步排序结果,需要额外的精细排序以获得最终排序结果,导致更高的计算和延迟。HNSW具有较低的压缩比(约为1:0.8),无需额外处理即可提供精确排序,计算成本和延迟较低,但存储成本较高。
- 召回率调整:两种索引都支持通过参数调整召回率,但在相似的召回率下,IVFPQ的计算成本更高。
- 缓存策略:IVFPQ允许通过调整索引块的缓存比例来平衡内存成本和计算延迟,而HNSW目前仅支持全文件缓存。
使用方法
每个表仅支持一个向量索引。
前提条件
在创建向量索引之前,必须通过设置FE配置项enable_experimental_vector为true来启用它。
执行以下语句以动态启用:
ADMIN SET FRONTEND CONFIG ("enable_experimental_vector" = "true");
要永久启用它,必须将enable_experimental_vector = true添加到FE配置文件fe.conf中并重启FE。
创建向量索引
本教程在创建表时创建向量索引。您也可以将向量索引附加到现有表中。有关详细说明,请参见附加向量索引。
-
以下示例在表
hnsw的列vector上创建一个HNSW向量索引hnsw_vector。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的列vector上创建一个IVFPQ向量索引ivfpq_vector