当前位置: 首页 > article >正文

Mlivus:索引类型对比

       Milvus 是一个专门用于向量相似度搜索的数据库,支持多种索引类型以适应不同的应用场景和性能需求。以下是 Milvus 支持的主要索引类型及其原理:

1. IVF_FLAT(Inverted File with Flat storage)

原理
  • 将数据集划分为 nlist 个簇,每个簇由一组相似的向量组成。
  • 查询时,计算查询向量与所有簇质心的距离,选择最近的 nprobe 个簇进行精确距离计算。
  • 簇内的向量存储为原始形式(未压缩),因此可以进行精确的距离计算。
适用场景
  • 数据量较大但内存资源充足。
  • 需要在精度和速度之间取得平衡。
优点
  • 精确性高,因为簇内向量不经过任何压缩。
  • 实现简单,适合初学者使用。
缺点
  • 内存占用较高。
  • 对聚类质量依赖较大。

2. IVF_SQ8(IVF with Scalar Quantization)

原理
  • 基于 IVF_FLAT 的改进版本,对簇内的向量进行 8-bit 标量量化(Scalar Quantization),减少存储空间。
  • 查询时仍需要解码量化后的向量以进行精确距离计算。
适用场景
  • 存储资源有限,但仍然希望保持较高的检索精度。
优点
  • 相比 IVF_FLAT,存储空间更小。
  • 检索速度较快。
缺点
  • 解码过程会引入一定的时间开销。
  • 精度略低于 IVF_FLAT。

3. IVF_PQ(IVF with Product Quantization)

原理
  • 使用乘积量化(Product Quantization, PQ)技术将向量划分为多个子向量,并对每个子向量分别量化。
  • 簇内的向量存储为量化后的形式,查询时通过近似距离计算找到最相似的向量。
适用场景
  • 高维向量检索。
  • 存储资源非常有限。
优点
  • 存储空间极小。
  • 检索速度快。
缺点
  • 精度较低,因为量化过程会导致信息损失。
  • 参数调优复杂(如子向量数量 m 的选择)。

4. HNSW(Hierarchical Navigable Small World Graph)

原理
  • 构建一个多层图结构,每一层包含不同密度的节点。
  • 查询时从顶层开始,逐步向下搜索,直到找到最接近的节点。
适用场景
  • 高维向量检索。
  • 对检索速度要求较高。
优点
  • 检索速度非常快。
  • 不需要显式聚类,适用于任意分布的数据。
缺点
  • 索引构建时间较长。
  • 精度可能略低于基于 IVF 的方法。

5. ANNOY(Approximate Nearest Neighbors Oh Yeah)

原理
  • 使用随机投影树(Random Projection Trees)将向量划分到不同的叶节点。
  • 查询时通过遍历树结构找到最接近的节点。
适用场景
  • 中低维度向量检索。
  • 数据分布较为规则。
优点
  • 索引构建简单快速。
  • 存储空间较小。
缺点
  • 在高维空间中表现较差。
  • 检索精度可能不如其他方法。

6. DISKANN(Disk-ANN)

原理
  • 一种基于磁盘的索引方法,允许在存储受限的情况下进行大规模向量检索。
  • 使用图结构进行近似最近邻搜索,同时优化磁盘 I/O 性能。
适用场景
  • 数据量极大,无法完全加载到内存中。
优点
  • 支持超大规模数据集。
  • 节省内存资源。
缺点
  • 检索速度较慢。
  • 配置复杂。

7. RNSG(Refined NSG)

原理
  • 基于导航图(Navigating Sparsification Graph)的改进版本,通过优化边的选择提高检索效率。
  • 查询时通过图结构逐步逼近目标节点。
适用场景
  • 高维向量检索。
  • 对检索速度和精度都有较高要求。
优点
  • 检索速度快。
  • 精度较高。
缺点
  • 索引构建时间较长。
  • 参数调优复杂。

总结对比:

索引类型精度速度存储空间适用场景
IVF_FLAT大规模数据,内存充足
IVF_SQ8存储受限,中等精度需求
IVF_PQ高维向量,存储受限
HNSW高维向量,高速检索需求
ANNOY中低维向量,简单配置需求
DISKANN超大规模数据,磁盘存储为主
RNSG高维向量,高效检索需求

http://www.kler.cn/a/571444.html

相关文章:

  • C++07(继承)
  • TCP为什么需要三次握手,两次不行吗?
  • SpringCloud系列教程(十二):网关配置动态路由
  • 前端怎么排查幽灵依赖
  • k8s面试题总结(九)
  • Spring Boot 与 MyBatis 版本兼容性
  • 三维重建(十五)——多尺度(coarse-to-fine)
  • 【开源-常用C/C++命令行解析库对比】
  • Python 的 json 模块可以帮助你把数据在两种格式之间转换
  • Qt C++ 开发 动态上下页按钮实现
  • 嵌入式学习l4day3
  • ​Unity插件-Mirror使用方法(六)组件介绍(​Network Transform)
  • Spring Cloud生态
  • 高频 SQL 50 题(基础版)_1341. 电影评分
  • 八、Redis 过期策略与淘汰机制:深入解析与优化实践
  • flutter-制作淡入淡出的Banner切换Fade效果
  • windows环境执行composer install出错
  • 轮播图案例
  • C++20中的std::bind_front使用及原理分析
  • 小米 SU7 Ultra:科技与性能的极致融合,FPC 隐匿的关键力量【新立电子】