milvus-logo
LFAI
首页
  • 概念

内存索引

本主题列出 Milvus 支持的各种类型的内存索引、每种索引最适合的情况,以及用户可以配置以获得更好搜索性能的参数。有关磁盘索引,请参阅磁盘索引

索引是有效组织数据的过程,它通过显著加快大型数据集上耗时查询的速度,在提高相似性搜索的实用性方面发挥着重要作用。

为了提高查询性能,可以为每个向量场指定一种索引类型

目前,一个向量场只支持一种索引类型。切换索引类型时,Milvus 会自动删除旧索引。

ANNS 向量索引

Milvus 支持的大多数向量索引类型都使用近似近邻搜索(ANNS)算法。与通常非常耗时的精确检索相比,ANNS 的核心理念不再局限于返回最精确的结果,而是只搜索目标的近邻。ANNS 通过在可接受的范围内牺牲精确度来提高检索效率。

根据实现方法,ANNS 向量索引可分为四种类型:基于树、基于图、基于哈希和基于量化。

Milvus 支持的索引

Milvus 支持多种索引类型,按其处理的嵌入类型分为:浮点二进制稀疏

浮点嵌入索引

对于 128 维浮点嵌入,其占用的存储空间为 128 * float 的大小 = 512 字节。浮点内嵌使用的距离度量是欧氏距离(L2 )和内积(IP )。

这些类型的索引包括FLAT,IVF_FLAT,IVF_PQ,IVF_SQ8,HNSWSCANN ,用于基于 CPU 的 ANN 搜索。

二进制嵌入索引

对于 128 维的二进制嵌入,其占用的存储空间为 128 / 8 = 16 字节。用于二进制嵌入的距离度量是JACCARDHAMMING

这类索引包括BIN_FLATBIN_IVF_FLAT

稀疏嵌入索引

稀疏嵌入支持的距离度量仅为IP

索引类型包括SPARSE_INVERTED_INDEXSPARSE_WAND

支持的索引 分类 场景
平面 不适用
  • 数据集相对较小
  • 需要 100% 的召回率
IVF_FLAT 基于量化的索引
  • 高速查询
  • 要求尽可能高的召回率
IVF_SQ8 基于量化的索引
  • 高速查询
  • 内存资源有限
  • 可接受召回率略有下降
IVF_PQ 基于量化的索引
  • 极高速查询
  • 内存资源有限
  • 可接受召回率大幅降低
HNSW 基于图形的索引
  • 极高速查询
  • 要求尽可能高的召回率
  • 内存资源大
SCANN 基于量化的索引
  • 极高速查询
  • 要求尽可能高的召回率
  • 内存资源大
支持的索引 分类 场景
BIN_FLAT 基于量化的索引
  • 取决于相对较小的数据集。
  • 要求完全准确。
  • 无需压缩。
  • 保证精确的搜索结果。
BIN_IVF_FLAT 基于量化的索引
  • 高速查询
  • 要求尽可能高的召回率
支持的索引 分类 方案
稀疏反转索引 倒置索引
  • 取决于相对较小的数据集。
  • 要求 100%的召回率。
稀疏反向索引 反向索引
  • 弱 AND算法加速
  • 在牺牲少量召回率的同时,速度也有明显提高。

平面

对于要求完美准确性并依赖相对较小(百万量级)数据集的向量相似性搜索应用,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 字节)。这样可以减少 70-75% 的磁盘、CPU 和 GPU 内存消耗。对于 1B SIFT 数据集,IVF_SQ8 索引文件仅需 140 GB 的存储空间。

  • 索引构建参数

    参数说明范围
    nlist集群单位数[1, 65536]
  • 搜索参数

    • 普通搜索

      参数说明范围默认值
      nprobe要查询的单位数[1,nlist]8
    • 范围搜索

      参数说明范围默认值
      max_empty_result_buckets未返回任何搜索结果的桶的最大数量。
      这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。
      增加该值可以提高召回率,但代价是增加搜索时间。
      [1, 65535]2

IVF_PQ

PQ (乘积量化)将原始高维向量空间均匀分解为 低维向量空间的笛卡尔乘积,然后对分解后的低维向量空间进行量化。乘积量化不需要计算目标向量与所有单元中心的距离,而是能够计算目标向量与每个低维空间聚类中心的距离,大大降低了算法的时间复杂度和空间复杂度。m

IVF_PQ 先进行 IVF 索引聚类,然后再对向量的乘积进行量化。其索引文件比 IVF_SQ8 更小,但在搜索向量时也会造成精度损失。

索引建立参数和搜索参数因 Milvus 分布而异。请先选择您的 Milvus 分布。

  • 索引建立参数

    参数说明范围
    nlist集群单位数[1, 65536]
    m乘积量化因子数dim mod m == 0
    nbits[可选项] 每个低维向量的存储位数。[1,64] (默认为 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 不同,默认值适用于mnbits ,以优化性能。

  • 搜索参数

    • 常用搜索

      参数说明范围默认值
      nprobe要查询的单位数[1,nlist]
      reorder_k要查询的候选单位数量[top_k, ∞]top_k
    • 范围搜索

      参数说明范围默认值
      max_empty_result_buckets未返回任何搜索结果的桶的最大数量。
      这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。
      增加该值可以提高召回率,但代价是增加搜索时间。
      [1, 65535]2

HNSW

HNSW(分层导航小世界图)是一种基于图的索引算法。它根据一定的规则为图像建立多层导航结构。在这种结构中,上层较为稀疏,节点之间的距离较远;下层较为密集,节点之间的距离较近。搜索从最上层开始,在这一层找到离目标最近的节点,然后进入下一层开始新的搜索。经过多次迭代后,就能快速接近目标位置。

为了提高性能,HNSW 将图的每一层上节点的最大度数限制为M 。此外,您还可以使用efConstruction (建立索引时)或ef (搜索目标时)来指定搜索范围。

  • 索引建立参数

    参数说明范围
    MM 定义图中传出连接的最大数量。M 越大,在固定 ef/efConstruction 条件下的精确度/运行时间越长。[2, 2048]
    efConstructionef_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

稀疏反转索引

每个维度都会维护一个在该维度上具有非零值的向量列表。在搜索过程中,Milvus 会遍历查询向量的每个维度,并为在这些维度上具有非零值的向量计算分数。

  • 索引构建参数

    参数说明范围
    drop_ratio_build在索引建立过程中排除的小向量值的比例。该选项允许对索引建立过程进行微调,通过在建立索引时忽略小值来权衡效率和准确性。[0, 1]
  • 搜索参数

    参数说明范围
    drop_ratio_search在搜索过程中排除的小向量值的比例。该选项可通过指定忽略查询向量中最小值的比例,对搜索过程进行微调。它有助于平衡搜索精度和性能。drop_ratio_search 的值越小,这些小值对最终得分的贡献就越小。通过忽略一些小值,可以提高搜索性能,同时将对精确度的影响降到最低。[0, 1]

弧度

该索引与SPARSE_INVERTED_INDEX 有相似之处,但它利用弱-AND算法进一步减少了搜索过程中完整 IP 距离评估的次数。

根据我们的测试,SPARSE_WAND 在速度方面通常优于其他方法。不过,随着向量密度的增加,其性能会迅速下降。为了解决这个问题,引入非零drop_ratio_search 可以显著提高性能,同时只造成极小的精度损失。更多信息,请参阅稀疏向量

  • 索引建立参数

    参数说明范围
    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 的 2 倍、3 倍或 n 倍时,IVF_FLAT 索引开始显示出越来越大的优势。

更多信息,请参阅如何在 Milvus 中选择索引

下一步

翻译自DeepLogo

反馈

此页对您是否有帮助?