内存索引
本主题列出了 Milvus 支持的各种内存索引类型,以及它们最适合的场景和用户可以配置的参数,以实现更好的搜索性能。有关磁盘索引,请参阅 磁盘索引。
索引是高效组织数据的过程,在使相似度搜索变得有用方面起着重要作用,通过显著加速大型数据集上耗时查询来实现。
为了提高查询性能,您可以为每个向量字段指定索引类型。
目前,向量字段仅支持一种索引类型。当切换索引类型时,Milvus 会自动删除旧索引。
ANNS 向量索引
Milvus 支持的大多数向量索引类型使用近似最近邻搜索(ANNS)算法。与通常非常耗时的精确检索相比,ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。ANNS 通过在可接受 范围内牺牲准确性来提高检索效率。
根据实现方法,ANNS 向量索引可以分为四种类型:基于树的、基于图的、基于哈希的和基于量化的。
Milvus 支持的索引
Milvus 支持各种索引类型,这些类型根据它们处理的嵌入类型进行分类:浮点、二进制 和 稀疏。
浮点嵌入的索引
对于 128 维浮点嵌入,它们占用的存储空间为 128 * float 的大小 = 512 字节。用于浮点嵌入的距离度量包括欧氏距离(L2
)和内积(IP
)。
这些类型的索引包括 FLAT
、IVF_FLAT
、IVF_PQ
、IVF_SQ8
、HNSW
和 SCANN
,用于基于 CPU 的 ANN 搜索。
二进制嵌入的索引
对于 128 维二进制嵌入,它们占用的存储空间为 128 / 8 = 16 字节。用于二进制嵌入的距离度量包括 Jaccard
和 Hamming
。
这种类型的索引包括 BIN_FLAT
和 BIN_IVF_FLAT
。
支持的索引 | 分类 | 场景 |
---|---|---|
FLAT | N/A |
|
IVF_FLAT | 基于量化的索引 |
|
IVF_SQ8 | 基于量化的索引 |
|
IVF_PQ | 基于量化的索引 |
|
HNSW | 基于图的索引 |
|
SCANN | 基于量化的索引 |
|
支持的索引 | 分类 | 场景 |
---|---|---|
BIN_FLAT | 基于量化的索引 |
|
BIN_IVF_FLAT | 基于量化的索引 |
|
支持的索引 | 分类 | 场景 |
---|---|---|
SPARSE_INVERTED_INDEX | 倒排索引 |
|
SPARSE_WAND | 倒排索引 |
|
FLAT
对于需要完美精度并依赖于相对较小(百万级)数据集的向量相似性搜索应用,FLAT索引是一个不错的选择。FLAT不压缩向量,是唯一能保证精确搜索结果的索引。FLAT的结果也可以用作与其他召回率不足100%的索引结果的比较点。
FLAT 是准确的,因为它采用了一种详尽的搜索方法,这意味着对于每个查询,目标输入将与数据集中的每组向量进行比较。这使得 FLAT 成为我们列表中最慢的索引,并且不适合查询大规模向量数据。在 Milvus 中,FLAT 索引不需要任何参数,并且使用它不需要数据训练。
-
搜索参数
参数名 描述 范围 metric_type
[可选] 所选距离度量方式。 参见 支持的度量方式。
IVF_FLAT
IVF_FLAT 将向量数据划分为 nlist
个簇单元,然后比较目标输入向量与每个簇中心之间的距离。根据系统设置要查询的簇数 (nprobe
),相似性搜索结果是基于目标输入与最相似簇中向量之间的比较返回的,从而大大减少了查询时间。
通过调整 nprobe
,可以在给定情况下找到准确性和速度之间的理想平衡。IVF_FLAT 性能测试 的结果表明,随着目标输入向量数 (nq
) 和要搜索的簇数 (nprobe
) 的增加,查询时间急剧增加。
IVF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。
-
索引构建参数
参数名 描述 范围 默认值 nlist
簇单元数 [1, 65536] 128 -
搜索参数
-
常规搜索
参数名 描述 范围 默认值 nprobe
要查询的单元数 [1, nlist] 8 -
范围搜索
| 参数名 | 描述 | 范围 | 默认值 | |
max_empty_result_buckets
| 最大不返回任何搜索结果的桶数。
这是一个范围搜索参数,当连续的空桶数量达到指定值时,终止搜索过程。
增加此值可以提高召回率,但会增加搜索时间。 | [1, 65535] | 2 |
-
IVF_SQ8
IVF_FLAT不执行任何压缩,因此它生成的索引文件大小大致与原始的未索引向量数据相同。例如,如果原始的 1B SIFT 数据集大小为 476 GB,那么它的 IVF_FLAT 索引文件会稍小一些(约 470 GB)。将所有索引文件加载到内存中将消耗 470 GB 的存储空间。
当磁盘、CPU 或 GPU 内存资源有限时,IVF_SQ8比IVF_FLAT是一个更好的选择。这种索引类型可以通过执行标量量化(SQ)将每个 FLOAT(4 字节)转换为 UINT8(1 字节)。这样可以将磁盘、CPU 和 GPU 内存消耗减少 70–75%。对于 1B SIFT 数据集,IVF_SQ8 索引文件仅需要 140 GB 的存储空间。
-
索引构建参数
参数 描述 范围 nlist
簇单元的数量 [1, 65536] -
搜索参数
-
常规搜索
参数 描述 范围 默认值 nprobe
要查询的单元数 [1, nlist] 8 -
范围搜索
参数 描述 范围 默认值 max_empty_result_buckets
最大不返回任何搜索结果的桶数。
这是一个范围搜索参数,当连续的空桶数量达到指定值时,终止搜索过程。
增加此值可以提高召回率,但会增加搜索时间。[1, 65535] 2
-
IVF_PQ
PQ
(Product Quantization)将原始的高维向量空间均匀分解为 m
个低维向量空间的笛卡尔积,然后对分解后的低维向量空间进行量化。产品量化使得可以计算目标向量与每个低维空间的聚类中心之间的距离,而不是计算目标向量与所有单元的中心之间的距离,大大降低了算法的时间复杂度和空间复杂度。
IVF_PQ 在量化向量的乘积之前执行 IVF 索引聚类。它的索引文件甚至比 IVF_SQ8 还要小,但在搜索向量时也会导致精度损失。
索引构建参数和搜索参数随 Milvus 发行版而异。首先选择您的 Milvus 发行版。
-
索引构建参数
参数 描述 范围 nlist
簇单元的数量 [1, 65536] m
产品量化因子的数量 dim mod m == 0
nbits
[可选] 每个低维向量存储的位数 [1, 16] (默认为 8) -
搜索参数
-
常规搜索
参数 描述 范围 默认值 nprobe
查询单元的数量 [1, nlist] 8 -
范围搜索
参数 描述 范围 默认值 max_empty_result_buckets
未返回任何搜索结果的最大桶数。
这是一个范围搜索参数,当连续空桶的数量达到指定值时,终止搜索过程。
增加此值可以提高召回率,但会增加搜索时间。[1, 65535] 2
-
SCANN
SCANN(得分感知量化损失)在向量聚类和产品量化方面类似于 IVF_PQ。它们的区别在于产品量化的实现细节以及使用 SIMD(单指令/多数据)进行高效计算。
-
索引构建参数
参数 描述 范围 nlist
簇单元的数量 [1, 65536] with_raw_data
是否在索引中包含原始数据 True
或False
。默认为True
。与 IVF_PQ 不同,为了优化性能,
m
和nbits
采用默认值。 -
搜索参数
-
常规搜索
参数 描述 范围 默认值 nprobe
查询单元的数量 [1, nlist] reorder_k
候选单元的数量 [ top_k
, ∞] -
范围搜索
| 参数 | 描述 | 范围 | 默认值 | |
max_empty_result_buckets
| 最大允许返回空搜索结果的桶数量。
这是一个范围搜索参数,当连续空桶的数量达到指定值时,搜索过程将终止。
增加此值可以提高召回率,但会增加搜索时间。 | [1, 65535] | 2 |
-
HNSW
HNSW(Hierarchical Navigable Small World Graph,分 层可导航小世界图)是一种基于图的索引算法。它根据一定规则为图像构建多层导航结构。在这个结构中,上层更稀疏,节点之间的距离更远;下层更密集,节点之间的距离更近。搜索从最顶层开始,在该层找到最接近目标的节点,然后进入下一层开始另一次搜索。经过多次迭代,可以快速接近目标位置。
为了提高性能,HNSW 限制了图每层节点的最大度数为 M
。此外,您可以使用 efConstruction
(构建索引时)或 ef
(搜索目标时)来指定搜索范围。
-
索引构建参数
参数 描述 范围 M
M 定义图中节点的最大外向连接数。较高的 M 导致在固定 ef/efConstruction 下更高的准确性/运行时间。 [2, 2048] efConstruction
ef_construction 控制索引搜索速度/构建速度的权衡。增加 efConstruction 参数可能提高索引质量,但也往往会延长索引时间。 [1, int_max] -
搜索参数
参数 描述 范围 ef
控制查询时间/准确性权衡的参数。较高的 ef
导致更准确但更慢的搜索。[ top_k
, int_max]
BIN_FLAT
这个索引与 FLAT 完全相同,只是它只能用于二进制嵌入。
对于需要完美准确性并依赖相对较小(百万级)数据集的向量相似度搜索应用程序,BIN_FLAT 索引是一个不错的选择。BIN_FLAT 不压缩向量 ,并且是唯一可以保证精确搜索结果的索引。BIN_FLAT 的结果也可以用作与其他召回率不到100%的索引产生的结果进行比较的基准。
BIN_FLAT 是准确的,因为它采用了穷举搜索的方法,这意味着对于每个查询,目标输入会与数据集中的向量进行比较。这使得 BIN_FLAT 成为我们列表中最慢的索引,并且不适合查询大规模向量数据。Milvus 中的 BIN_FLAT 索引没有参数,使用它不需要数据训练或额外存储。
- 搜索参数
| 参数名 | 描述 | 范围 |
| ------------- | -------------------------------------- | ----------------------------------- |
|
metric_type
| [可选] 所选的距离度量方式。 | 参见 支持的度量方式. |
BIN_IVF_FLAT
该索引与 IVF_FLAT 完全相同,唯一的区别在于只能用于二进制嵌入。
BIN_IVF_FLAT 将向量数据划分为 nlist
个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置的查询聚类数 (nprobe
),仅基于目标输入与最相似聚类中向量的比较返回相似性搜索结果,从而大大减少查询时间。
通过调整 nprobe
,可以在给定场景中找到精确性和速度之间的理想平衡。随着目标输入向量数 (nq
) 和搜索的聚类数 (nprobe
) 增加,查询时间会急剧增加。
BIN_IVF_FLAT 是最基本的 BIN_IVF 索引,每个单元中存储的编码数据与原始数据一致。
-
索引构建参数
参数名 描述 范围 nlist
聚类单元数 [1, 65536] -
搜索参数
-
常规搜索
参数名 描述 范围 默认值 nprobe
查询单元数 [1, nlist] 8 -
范围搜索
参数名 描述 范围 默认值 max_empty_result_buckets
不返回任何搜索结果的最大桶数。
这是一个范围搜索参数,当连续空桶数达到指定值时终止搜索过程。
增加此值可以提高召回率,但会增加搜索时间。[1, 65535] 2
-
SPARSE_INVERTED_INDEX
每个维度维护一个在该维度上具有非零值的向量列表。在搜索过程中,Milvus 遍历查询向量的每个维度,并为在这些维度上具有非零值的向量计算分数。
-
索引构建参数
参数名 描述 范围
| drop_ratio_build
| 在索引过程中排除的小向量值的比例。此选项允许微调索引过程,通过在构建索引时忽略小值来在效率和准确性之间取得平衡。 | [0, 1] |
-
搜索参数
参数 描述 范围 drop_ratio_search
在搜索过程中排除的小向量值的比例。此选项允许通过指定要忽略查询向量中最小值的比例来微调搜 索过程。它有助于平衡搜索精度和性能。设置较小的值给 drop_ratio_search
,这些小值对最终得分的贡献就越少。通过忽略一些小值,可以在几乎不影响准确性的情况下提高搜索性能。[0, 1]
SPARSE_WAND
这种索引与SPARSE_INVERTED_INDEX
类似,但它利用Weak-AND算法在搜索过程中进一步减少完整IP距离评估的数量。
根据我们的测试,SPARSE_WAND
在速度方面通常优于其他方法。然而,随着向量密度的增加,其性能可能会迅速下降。为解决这个问题,引入一个非零的drop_ratio_search
可以显著提升性能,同时只带来最小的准确性损失。更多信息,请参阅Sparse Vector。
-
索引构建参数
参数 描述 范围 drop_ratio_build
在索引过程中排除的小向量值的比例。此选项允许微调索引过程,通过在构建索引时忽略小值来在效率和准确性之间取得平衡。 [0, 1] -
搜索参数
参数 描述 范围 drop_ratio_search
在搜索过程中排除的小向量数值比例。此选项允许通过指定要忽略的查询向量中最小值的比例来微调搜索过程。它有助于平衡搜索精度和性能。设置 drop_ratio_search
的值越小,这些小值对最终得分的贡献就越少。通过忽略一些小值,可以在几乎不影响准确性的情况下提高搜索性能。[0, 1]
常见问题解答
FLAT 索引和 IVF_FLAT 索引有什么区别?
IVF_FLAT 索引将一个向量空间划分为 nlist
个簇。如果保持 nlist
的默认值为 16384,Milvus 将比较目标向量与所有 16384 个簇中心点之间的距离,以获取 nprobe
个最近的簇。然后 Milvus 比较目标向量与所选簇中的向量之间的距离,以获取最近的向量。与 IVF_FLAT 不同,FLAT 直接比较目标向量与每个向量之间的距离。
因此,当向量总数大约等于 nlist
时,IVF_FLAT 和 FLAT 在所需计算方式和搜索性能方面几乎没有差异。但是,当向量数量增长到 nlist
的两倍、三倍或 n 倍时,IVF_FLAT 索引开始显示出越来越大的优势。
更多信息请参阅 How to Choose an Index in Milvus。
接下来
- 了解 Milvus 支持的相似度度量。