Milvus 索引类型

索引概览

注意:索引的实际构建方式(使用 CPU 或者 GPU)不影响索引本身对 CPU 或 GPU 搜索的支持。

仅支持 CPU 的 Milvus 包含的索引类型

名称 支持 CPU 建立索引 支持 CPU 搜索 支持浮点型向量 支持二值型向量
FLAT ✔️ ✔️ ✔️ ✔️
IVFLAT ✔️ ✔️ ✔️ ✔️
IVF_SQ8 ✔️ ✔️ ✔️
IVF_SQ8H ✔️
IVF_PQ ✔️ ✔️ ✔️
RNSG ✔️ ✔️ ✔️
HNSW ✔️ ✔️ ✔️
ANNOY ✔️ ✔️ ✔️

支持 GPU 的 Milvus 包含的索引类型

名称 支持 CPU 建立索引 支持 CPU 搜索 支持 GPU 建立索引 支持 GPU 搜索 支持浮点型向量 支持二值型向量
FLAT ✔️ ✔️ ✔️ (对于二值型向量,FLAT 不支持 GPU 索引) ✔️ (对于二值型向量,FLAT 不支持 GPU 搜索) ✔️ ✔️
IVFLAT ✔️ ✔️ ✔️ (对于二值型向量,IVFLAT 不支持 GPU 索引) ✔️ (对于二值型向量,IVFLAT 不支持 GPU 搜索) ✔️ ✔️
IVF_SQ8 ✔️ ✔️ ✔️ ✔️ ✔️
IVF_SQ8H ✔️ ✔️ ✔️ ✔️ ✔️
IVF_PQ ✔️ ✔️ ✔️ (仅对欧氏距离支持 GPU 索引) ✔️ (仅对欧氏距离支持 GPU 搜索) ✔️
RNSG ✔️ ✔️ ✔️
HNSW ✔️ ✔️ ✔️
ANNOY ✔️ ✔️ ✔️

注意:对于不同索引类型,创建索引的参数和搜索参数也有所不同。详细信息请参考 Milvus 基本操作

索引详解

FLAT

如果使用 FLAT 索引,向量会以浮点/二进制的方式存储,不做任何压缩处理。搜索时,所有的向量会依次解码并于要搜索的目标向量对比计算距离。

FLAT 提供 100%的检索召回率。相比其它索引方式,在搜索量不大的情况下速度最快。

IVFLAT

在聚类时,向量被直接添加到各个分桶中,不做任何压缩。这种基于聚类,多簇搜索的方式搜索速度和准确性都不错。

IVF_SQ8

运用 scalar quantizer 的向量索引,节省存储空间(缩减为原体积的约 1/4 大小)。相比 FLAT 搜索速度更快,比 IVFLAT 占用存储空间更小。

向量的每个维度由 4 个字节的浮点数量化为 1 个字节的 int8 类型整数,可能造成搜索精度的损失。

IVF_SQ8H

基于 IVF_SQ8 做了深层优化,但需要 CPU 和 GPU 都在的情况下才能使用。不同于 IVF_SQ8IVF_SQ8H 使用基于 GPU 的 coarse quantizer,可以提高查询速度。

IVF_PQ

基于乘积量化的索引类型,意思是将原来的向量空间分解为若干个低维向量空间的笛卡尔积,然后对分解得到的低维向量空间分别做量化。

向量大小可以缩减至原来大小的 1/16 甚至 1/32。该索引方式适用于低内存环境下的大规模向量搜索,但搜索精度会有损失,需注意权衡。

目前每个 sub-quantizer 仅支持 1, 2, 3, 4, 6, 8, 10, 12, 16, 20, 24, 28, 32 维。sub-quantizer 总数量仅支持 1, 2, 3, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 96。

RNSG

RNSG 是 Milvus 自研的一种索引方式,基于 NSG 索引做了各种优化。NSG 是一种基于图的索引算法,它可以 a) 降低图的平均出度;b) 缩短搜索路径;c) 缩减索引大小;d) 降低索引复杂度。

不同于 NSG 单个搜索的方式,RNSG 支持多个目标向量的并发搜索。

HNSW

HNSW 索引基于 HNSW 构建。HNSW (Hierarchical Small World Graph) 是一种基于图的索引算法,可以增量建立多层结构并且将边根据特征距离半径进行分层。由于计算复杂度是对数,HNSW 对于高维数据非常高效。

RNSG 相比, HNSW 的运行效率和内存使用效率更高。HNSW 支持增量建立索引,而 RNSG 则不支持。但是,因为图需要加载到内存中,HNSW 的内存需求要大于 RNSG

ANNOY

ANNOY 索引类型基于树结构构建,依靠随机投影(random projection)的方式选择超平面并对空间进行分割。ANNOY支持多个目标向量的并发搜索。

如何选择索引

若要为你的使用场景选择合适的索引,请参阅 如何选择索引类型

关于索引和向量距离计算方法的选择,请访问 距离计算方式