Milvus索引总结

 内存索引 | Milvus 文档

IVF_FLAT | Milvus 文档

HNSW | Milvus 文档

1.Miluvs索引支持:

内存索引

磁盘索引

GPU索引

2.内存索引

1.AUTOINDEX

        调用create_index 方法时,如果没有指定index_type ,Milvus 会根据数据类型自动选择最合适的索引类型。

数据类型自动索引算法
VARCHAR反转索引
INT8反转索引
INT16反转索引
INT32反转索引
INT64反转索引
FLOAT反转索引
二进制反转索引

反转索引

       反转索引提供了一种灵活的方法,可通过手动指定索引参数为标量字段创建索引。这种方法适用于各种情况,包括点查询、模式匹配查询、全文检索、JSON 搜索、布尔搜索,甚至前缀匹配查询。

       Milvus 中实现的倒排索引由全文搜索引擎库Tantivy 提供支持。Tantivy 确保 Milvus 中的倒排索引既高效又快速。

       倒排索引有两个主要部分:术语字典和倒排列表。术语词典包括按字母顺序排列的所有标记词,而倒排列表则包含每个词出现的文档列表。这种设置使得点查询和范围查询比暴力搜索更快、更有效。

2.HNSW

       HNSW索引是一种基于图的索引算法,可以提高搜索高维浮动向量时的性能。它具有出色的搜索精度和延迟,但需要较高的内存开销来维护其分层图结构。

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

        分层导航小世界(HNSW)算法构建了一个多层图,有点像不同缩放级别的地图。底层包含所有数据点,而上层则由从底层采样的数据点子集组成。

在这种层次结构中,每一层都包含代表数据点的节点,节点之间由表示其接近程度的边连接。上层提供远距离跳转,以快速接近目标,而下层则进行细粒度搜索,以获得最准确的结果。

下面是它的工作原理:

  1. 入口点:搜索从顶层的一个固定入口点开始,该入口点是图中的一个预定节点。
  2. 贪婪搜索:算法贪婪地移动到当前层的最近邻居,直到无法再接近查询向量为止。上层起到导航作用,作为粗过滤器,为下层的精细搜索找到潜在的入口点。
  3. 层层下降:一旦当前层达到局部最小值,算法就会利
  4. 用预先建立的连接跳转到下层,并重复贪婪搜索。
  5. 最后 细化:这一过程一直持续到最底层,在最底层进行最后的细化步骤,找出最近的邻居。

    HNSW 的性能取决于控制图结构和搜索行为的几个关键参数。这些参数包括

  6. M:图中每个节点在层次结构的每个层级所能拥有的最大边数或连接数。M 越高,图的密度就越大,搜索结果的召回率和准确率也就越高,因为有更多的路径可以探索,但同时也会消耗更多内存,并由于连接数的增加而减慢插入时间。如上图所示,M = 5表示 HNSW 图中的每个节点最多与 5 个其他节点直接相连。这就形成了一个中等密度的图结构,节点有多条路径到达其他节点。

  7. efConstruction:索引构建过程中考虑的候选节点数量。efConstruction 越高,图的质量越好,但需要更多时间来构建。
  8. ef:搜索过程中评估的邻居数量。增加ef 可以提高找到最近邻居的可能性,但会减慢搜索过程。

3.IVF_FLAT

        IVF_FLAT 将向量数据划分为nlist 个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置查询的簇数 (nprobe),相似性搜索结果仅根据目标输入与最相似簇中向量的比较结果返回--大大缩短了查询时间。

        通过调整nprobe ,可以在特定情况下找到准确性和速度之间的理想平衡。IVF_FLAT 性能测试的结果表明,随着目标输入向量数 (nq) 和搜索簇数 (nprobe) 的增加,查询时间也会急剧增加。

I        VF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。

4.IVF_PQ

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

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

5.IVF_SO8

        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 的存储空间。

6.FLAT        

       对于需要完美精确度且依赖相对较小(百万级别)数据集的向量相似性搜索应用,FLAT 不压缩向量,是唯一能保证精确搜索结果的索引。FLAT 的结果还可以作为其他召回率低于 100% 的索引所产生结果的比较点

       FLAT 的精确度很高,因为它采用的是穷举搜索方法,这意味着每次查询都要将目标输入与数据集中的每一组向量进行比较。这使得 FLAT 成为我们列表中速度最慢的索引,而且不适合查询海量向量数据。在 Milvus 中,FLAT 索引不需要任何参数,使用它也不需要数据训练。

7.SCANN

        ScaNN(可扩展近邻)在向量聚类和乘积量化方面与 IVF_PQ 相似。它们的不同之处在于乘积量化的实现细节和使用 SIMD(单指令/多数据)进行高效计算。

3.磁盘索引

DISKANN

4.GPU索引

1.GPU _CAGRA

2.GPU_IVF_FLAT

3.GPU _IVF_PO

4.GPU BRUTE FORCE

5.参数

1.度量类型(metric_type)

1.IP

即内积,是一种计算向量相似度的常用方法,如果你对查询和文档向量进行了规范化(使得它们的模长为 1),那么 内积 就等同于余弦相似度

2.COSINE

余弦相似度,它能够衡量两个向量的方向相似度,而不受向量大小(模长)的影响。所以是RAG中最常用的一种相似度计算方法。

3.L2

欧几里得距离 衡量的是两个向量之间的直线距离。尽管欧几里得距离也是常见的距离度量方法,它更多地用于度量向量间的差异,而不是相似度。通常,欧几里得距离值越小,表示向量越相似。

适用场景:

  • 图像特征向量:在计算机视觉中,图像的特征向量往往具有相似的数值范围,并且欧几里得距离适用于衡量不同图像之间的差异。
  • 数值型数据:例如,客户的年龄、收入等数值特征可以用欧几里得距离计算客户之间的相似度。

2.efConstruction

       控制在构建图时搜索的邻居数量,影响图的结构和搜索精度。较大的 efConstruction 提高构建精度但增加构建时间,较小的值提高构建速度但可能降低精度

参数说明范围默认值
efConstructionef_construction控制索引搜索速度/构建速度的权衡。增加 efConstruction 参数可能会提高索引质量,但也会延长索引编制时间。[1,int_max](最大值

3.M

       控制每个节点的最大连接数(即每个节点的出度),影响图的密度和搜索精度。较大的 M 增加精度但降低查询速度,较小的 M 提高速度但可能降低精度。

m乘积量化因子数dim mod m == 0

4.nlist

        nlistInverted File(IVF) 索引中一个重要的参数,用于控制索引的分桶数目。它代表了将向量数据集分割成多少个簇或子集合。向量会被划分为多个簇,每个簇会有一个索引,nlist 就是定义簇的数量。

        在检索过程中,Milvus 会首先找到查询向量所属的簇,然后只对该簇中的向量进行精确的相似度计算,而不是对整个数据集进行计算,这样能够大大提高检索速度。

参数说明范围默认值
nlist群组单位数[1, 65536]128
  • nlist 大小的影响:
    • 较大的 nlist:会增加簇的数量,使得每个簇内的向量数量减少,从而提高检索的精确度。但增加簇的数量会增加内存使用,并使索引构建过程变得更长。
    • 较小的 nlist:会减少簇的数量,从而加速查询过程,但可能会导致检索精度的下降,因为更多的向量被存储在每个簇中,可能会影响精确度。
  • 通常设置nlist 设置的范围通常会根据数据的大小和特性来调整。在实际操作中,nlist 的选择需要权衡 检索速度精度,并通过实验来选择合适的值。

  nlist 决定了向量的分桶数,它影响索引的创建速度、存储要求和查询的效率。

5.with_raw_data(SCANN索引专用参数)

6.build_algo(GPU_CAGRA索引专用参数)

build_algo选择剪枝前的图形生成算法。可能的值:
IVF_PQ:提供更高的质量,但构建时间较慢。
NN_DESCENT提供更快的生成速度,但召回率可能较低。
IVF_PQ

7.cache_dataset_on_device(GPU_CAGRA索引专用参数)

cache_dataset_on_device决定是否在 GPU 内存中缓存原始数据集。可能的值
“true”:缓存原始数据集,通过完善搜索结果提高召回率。
“false”不缓存原始数据集,以节省 GPU 内存。
“false”
<think>嗯,用户问的是如何获取Milvus集合中索引文件大小的方法或API。首先,我需要回忆一下Milvus的文档和相关API。记得Milvus提供了RESTful API和不同语言的SDK,比如Python。用户可能需要通过SDK来调用相关的方法。 首先,Milvus索引是在集合的特定字段上创建的,所以可能需要先连接到集合,然后获取索引信息。然后,索引的大小可能和集合的数据量、索引类型有关。比如,IVF_FLAT和HNSW的索引大小可能不同。 接下来,我需要检查Milvus的官方文档是否有直接获取索引文件大小的API。根据之前的知识,Milvus的`describe_index()`方法可以返回索引的参数,比如`index_type`、`metric_type`等,但不包括大小。所以可能需要另一种方法。 突然想到,Milvus的`get_collection_stats()`方法可以获取集合的统计信息,包括数据量和存储大小。例如,返回的统计信息中有`data_size`字段,这可能包括原始数据和索引的大小。但用户需要的是索引文件的大小,可能需要更详细的信息。 另外,Milvus的数据存储在对象存储(如S3)或本地磁盘,索引文件通常以文件形式存在。用户可能需要通过文件系统或存储服务来直接查看索引文件的大小。但这种方法依赖于部署环境,不够通用。 有没有其他方法?比如,通过计算索引占用的内存或磁盘空间。或者,Milvus是否有内部API或指标暴露这些信息?例如,Prometheus监控指标可能包含存储相关的数据,但需要配置监控系统。 再想想,用户可能在使用Python SDK,所以需要代码示例。假设`get_collection_stats()`中的`data_size`包含了索引的大小,或者索引大小可以通过其他字段计算出来。但需要验证这一点。 根据引用[2],提到Milvus的性能优化,可能索引的大小会影响性能,但文档中并没有直接说明如何获取索引文件大小。因此,可能需要结合多个方法,比如获取集合的总数据大小,减去原始数据大小来估算索引大小。 或者,创建索引后,Milvus可能会在日志中输出索引构建的信息,包括占用的空间。但这种方法需要访问日志,不够程序化。 总结可能的解决方案:使用`get_collection_stats()`获取整体存储信息,或者通过系统命令查看文件大小,结合索引类型和向量维度估算。可能需要分步骤指导用户如何操作,并指出不同方法的优缺点。</think>### 如何获取Milvus集合中索引文件大小的方法 在Milvus中,索引文件大小通常与集合的存储统计信息相关,但Milvus并未直接提供获取单个索引文件大小的专用API。以下是几种可行的解决方案: --- #### **方法1:通过集合统计信息估算** Milvus的`get_collection_stats()`方法可返回集合的存储统计信息,包括数据分布和总存储量。索引文件大小可结合原始数据量进行估算: ```python from pymilvus import connections, Collection # 连接Milvus connections.connect(alias="default", host='localhost', port='19530') # 获取集合对象 collection = Collection("your_collection_name") # 获取集合统计信息 stats = collection.get_collection_stats() print(stats) ``` 返回结果中重点关注以下字段: - `data_size`: 总数据量(含索引) - `num_rows`: 向量数量 **估算公式**: 若已知原始向量维度$d$和数据类型(如float32,每元素占4字节),原始数据大小为: $$ \text{原始数据大小} = \text{num\_rows} \times d \times 4 \text{ (bytes)} $$ 索引文件大小则为: $$ \text{索引大小} \approx \text{data\_size} - \text{原始数据大小} $$ --- #### **方法2:通过文件系统直接查看** 若Milvus使用本地存储(非分布式部署),索引文件默认位于`/var/lib/milvus/data`路径下。可通过系统命令查看具体文件大小: ```bash # 进入集合目录 cd /var/lib/milvus/data/<collection_id>/index_files # 查看索引文件大小 du -sh * ``` --- #### **方法3:结合索引类型与参数估算** 不同索引类型(如IVF_FLAT、HNSW)的存储开销不同。例如: - **IVF_FLAT索引**:存储量接近原始数据大小(因需保存聚类中心)[^2] - **HNSW索引**:存储量约为原始数据的2-3倍(因需维护多层图结构) 结合索引参数(如`nlist`、`M`)可进一步精确估算。例如,IVF_FLAT索引的额外存储量约为: $$ \text{IVF额外存储} = \text{nlist} \times d \times 4 \text{ (bytes)} $$ --- ### **总结** 1. 优先使用`get_collection_stats()`结合原始数据量进行估算。 2. 若需精确值且环境允许,直接通过文件系统查看。 3. 根据索引类型和参数进行理论估算。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值