Skip to content

一篇文章讲明白向量数据库Milvus的索引如何选择

Milvus数据库的一个Collection中可以分为两类字段:标量字段向量字段。标量字段就如同Mysql表中的字段一样,为了提高查询性能,可以对表字段创建索引。向量字段则是一种特殊的字段,为了提高向量查询性能,Milvus提供了多种创建索引的方式。

索引简单说就是用空间换时间,也就是创建索引需要占用一定的存储空间。向量索引根据存储的位置可以分为:内存索引磁盘索引GPU索引。本文则为大家介绍常用的内存索引。

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

内存索引

由于Milvus的嵌入可以分为三个类型:浮点嵌入、二进制嵌入、稀疏嵌入。根据嵌入类型的不同,Milvus支持的索引类型也会有所差异。

浮点嵌入

该类型索引包括FLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW和SCANN,都是基于 CPU 的 ANN 搜索。可以选择的距离度量(metric_type)有:欧式距离(L2)、内积(IP)、余弦相似度(COSINE)

支持的索引分类场景
平面不适用
  • 数据集相对较小需要
  • 100% 的召回率
  • IVF_FLAT基于量化的索引
  • 高速查询
  • 要求尽可能高的召回率
  • IVF_SQ8基于量化的索引
  • 高速查询
  • 内存资源有限
  • 可接受召回率略有下降
  • IVF_PQ基于量化的索引
  • 极高速查询
  • 内存资源有限
  • 可接受召回率大幅降低
  • HNSW基于图形的索引
  • 非常高速的查询
  • 要求尽可能高的召回率
  • 内存资源大
  • SCANN基于量化的索引
  • 极高速查询
  • 要求尽可能高的召回率
  • 内存资源大
  • 二进制嵌入

    该类型索引包括BIN_FLAT、BIN_IVF_FLAT,常用的距离度量有:汉明(HAMMING)、雅卡德(JACCARD)。

    支持的索引分类场景
    BIN_FLAT基于量化的索引
  • 取决于相对较小的数据集
  • 要求完全准确
  • 无需压缩
  • 保证精确的搜索结果
  • BIN_IVF_FLAT基于量化的索引
  • 高速查询
  • 要求尽可能高的召回率
  • 稀疏嵌入

    该类型的索引包括:SPARSE_INVERTED_INDEX、SPARSE_WAND,距离度量只能用内积(IP)。

    支持的索引分类场景
    SPARSE_INVERTED_INDEX倒置索引
  • 取决于相对较小的数据集
  • 要求 100%的召回率
  • SPARSE_WAND反向索引
  • 弱AND算法加速
  • 在牺牲少量召回率的同时,速度也有明显提高
  • 进阶

    对于初学者而言,我们可以不用太关注各种类型的索引之间的差异,先对Milvus有一个整体的了解则更重要。但是当我们想要进一步用好Milvus时,就需要大家根据自己的场景选择适合自己的索引类型和距离度量了。想要进一步学习,可以关注:遇码,回复milvus获取官方文档。

    遇码MeetCoding 开源技术社区