Milvus实践 第三章:索引类型

索引类型特性原理距离计算方式
FLAT
  • 查询数据规模小,对查询速度要求不高
  • 不占用磁盘,内存占用与原始数据一致
  • 100% 的召回率
  • rt 35ms
并非真正的索引,索引与向量原始数据一致,无需独立创建索引文件,检索时将向量原始数据加载至内存生成索引,属于暴力检索
  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)
     
  • 二值型向量
  • 杰卡德距离 (Jaccard)
  • 谷本距离 (Tanimoto)
  • 汉明距离 (Hamming)
  • 超结构 (superstructure)
  • 子结构 (substructure)

IVF_FLAT

  • 高速查询
  • 磁盘、内存占用与原始数据一致
  • 要求尽可能高的召回率
  • rt 9ms
倒排索引,通过聚类的方式将向量添加到不同的分桶,数据不压缩,查询速度与召回率之间的权衡由参数 nprobe 来控制。nprobe 越大,召回率越高,但查询时间越长。
  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)
     
  • 二值型向量
  • 杰卡德距离 (Jaccard)
  • 谷本距离 (Tanimoto)
  • 汉明距离 (Hamming)

IVF_SQ8

  • 高速查询,速度比IVF_FLAT快
  • 磁盘、内存占用为原始数据30%
  • 召回率略低与IVF_FLAT
  • rt 6ms
基于IVF_FLAT的一种向量数据压缩算法,将向量进行标量量化(原始向量中每个 FLOAT(4字节)转为 UINT8(1字节)),磁盘和内存占用比原来降至1/4。
  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

IVF_SQ8H

  • 高速查询,比IVF_SQ8略快,np>1时优于IVF_SQ8
  • 磁盘、内存占用为原始数据30%
  • 召回率与IVF_FLAT一致
  • 需要GPU
  • rt 5ms
对IVF_SQ8做了深度优化,把找出向量最近的nprobe个分桶的运算(Coarse Quantizer)单独拷贝到 GPU运算,大大的节省了Coarse Quantizer时间,每个分桶中的查询受配置参数 gpu_search_threshold 控制,当 nq >= gpu_search_threshold 时,查询在 GPU 上进行;反之在 CPU 上进行。
  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

IVF_PQ

  • 高速查询
  • 磁盘、内存占用极低(可压缩至原始数据1%以下),适用10亿数据集以上计算
  • 召回率、精准度下降
  • rt

基于IVF_FLAT的一种向量数据有损压缩算法(PQ乘积量化),首先,PQ先将D维空间切分成M份:类似于将128维空间切分成M个D/M维的子空间,每个子向量进行k-means聚类。

 

  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

RNSG

  • 高速查询,比ivf系列快
  • 磁盘、内存占用小于原始数据
  • 召回率高、精准度高
  • 不支持增量索引
  • rt

NSG是通过建立导航点 (Navigation Point) ,特殊的选边策略, 深度遍历收回离散节点 (Deep Traversal) 等方法将导航点与子图相连接,获得良好的搜索性能。

RNSG 是 Milvus 在 NSG 基础上自研的基于图的索引算法,它可以 降低图的平均出度,缩短搜索路径,缩减索引大小,降低索引复杂度。

  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

HNSW

  • 高速查询,比ivf系列快
  • 磁盘、内存占用大于原始数据,适用于小数据量,内存充足的计算
  • 召回率高、精准度高
  • 支持增量索引
  • rt

前身是NSW,Milvus借鉴了 SkipList 的思想,提升了其整体性能,按照一定的规则把一张的图分成多张,越接近上层的图,平均度数越低,节点之间的距离越远;越接近下层的图平均度数越高,节点之间的距离也就越近。

  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

Annoy

  • 高速查询,比HNSW慢
  • 磁盘、内存占用大于原始数据,比HNSW索引更大
  • 召回率高、精准度高
  • 不支持增量索引
  • rt
基于树的索引(1/n棵二叉树),建树时每次选择空间中的两个质心作为分割点,相当于kmeans过程,以使得两棵子树分割的尽量均匀以保证logn的检索复杂度。以垂直于过两点的直线的超平面来分割整个空间,然后在两个子空间内递归分割直到子空间最多只有k个点。如下图

查找性能及准确度受treenum、searchnum控制

 

  • 浮点型向量
  • 欧氏距离 (L2)
  • 内积 (IP)

关于rt的数据说明:基于1000000条 * 512维 整形向量计算,索引分桶数为512*16,每次检索np=1,topK=2,检索时nprobe=1024。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于 Milvus,创建索引可以通过以下步骤完成: 1. 连接到 Milvus 服务器。您可以使用 Milvus Python SDK 或其他支持的客户端库来实现连接。 2. 创建一个 Collection。Collection 是存储数据的逻辑容器,可以在其中创建索引。 3. 定义 Collection 的参数,如维度(dimension),数据类型等。 4. 插入数据。将数据插入到 Collection 中,以便后续创建索引。 5. 创建索引。使用指定的算法和参数,在 Collection 上创建索引Milvus 支持多种索引类型,如索引类型(IndexType)和距离度量(MetricType)等。 下面是一个使用 Python SDK 创建索引的示例代码: ```python from milvus import Milvus, IndexType, MetricType # 连接到 Milvus 服务器 milvus = Milvus(host='localhost', port='19530') # 创建 Collection collection_name = 'your_collection' dimension = 128 # 数据维度 index_file_size = 1024 # 索引文件大小,单位为 MB param = { 'collection_name': collection_name, 'dimension': dimension, 'index_file_size': index_file_size, 'metric_type': MetricType.L2 # 指定距离度量类型 } status, _ = milvus.create_collection(param) # 插入数据 data = [[random.random() for _ in range(dimension)] for _ in range(10000)] status, ids = milvus.insert(collection_name=collection_name, records=data) # 创建索引 index_param = { 'nlist': 1024, # 索引中的桶数量 'index_type': IndexType.IVF_FLAT # 指定索引类型 } status = milvus.create_index(collection_name=collection_name, index_param=index_param) ``` 以上代码示例中,我们首先连接到 Milvus 服务器,然后创建一个 Collection,并定义相关参数。接下来,插入数据并创建索引。 请注意,上述代码仅为示例,具体的参数和逻辑应根据实际需求进行调整。另外,确保您已正确安装了 Milvus 并导入了相关的库。 希望对您有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值