ModaHub AI模型开源社区:向量数据库Milvus向量索引是什么?

news2024/11/18 7:40:37

目录

向量索引

索引创建机制

数据段建索引

用户主动创建索引

闲时建索引

索引概览

FLAT

IVF_FLAT

IVF_SQ8

IVF_SQ8H

IVF_PQ

RNSG

HNSW

ANNOY

选择索引

常见问题

参考文献


向量索引

向量索引(vector index)是指通过某种数学模型,对向量构建的一种时间和空间上更高效的数据结构。借助向量索引,我们能够高效地查询与目标向量相似的若干个向量。Milvus 的实体目前只支持一个向量字段。你可以为该向量字段指定一种索引类型以提高查询性能。Milvus 会在切换索引类型时自动删除旧索引。

Milvus 目前支持的向量索引类型大都属于 ANNS(Approximate Nearest Neighbors Search,近似最近邻搜索)。ANNS 的核心思想是不再局限于只返回最精确的结果项,而是仅搜索可能是近邻的数据项,即以牺牲可接受范围内的精度的方式提高检索效率。

根据实现方式,ANNS 向量索引可分为四大类:

  • 基于树的索引
  • 基于图的索引
  • 基于哈希的索引
  • 基于量化的索引

下表将目前 Milvus 支持的索引进行了归类:

Milvus 支持的索引

索引分类

适用场景

FLAT

N/A

  • 查询数据规模小,对查询速度要求不高。
  • 需要 100% 的召回率。

IVF_FLAT

基于量化的索引

  • 高速查询,
  • 要求尽可能高的召回率。

IVF_SQ8

基于量化的索引

  • 高速查询,
  • 磁盘和内存资源有限,
  • 仅有 CPU 资源。

IVF_SQ8H

基于量化的索引

  • 高速查询,
  • 磁盘、内存、显存有限。

IVF_PQ

基于量化的索引

RNSG

基于图的索引

HNSW

基于图的索引

ANNOY

基于树的索引

索引创建机制

数据段建索引

Milvus 数据段存储海量数据。在建立索引时,Milvus 为每个数据段单独创建索引。

用户主动创建索引

调用 create_index 接口时,Milvus 会对该字段上的已有数据同步建立索引。每当后续插入的数据的大小达到系统配置的 index_file_size 时,Milvus 会为其在后台自动创建索引。

当插入的数据段少于 4096 行时,Milvus 不会为其建立索引。

闲时建索引

众所周知,建索引是一个比较消耗计算资源和时间的工作。当查询任务和后台建索引任务并发时,Milvus 通常把计算资源优先分配给查询任务,即用户发起的任何查询命令都会打断后台正在执行的建索引任务。之后仅当用户持续 5 秒不再发起查询任务,Milvus 才会恢复执行后台建索引任务。此外,如果查询命令指定的数据段尚未建成指定索引,Milvus 会直接在段内做全量搜索。

索引概览

FLAT

FLAT 索引类型是指对向量进行原始文件存储。搜索时,所有向量都会与目标向量进行距离计算和比较。

FLAT 索引类型提供 100% 的检索召回率。与其他索引相比,当查询数量较少时,它是最有效的索引方法。

  • 查询参数| 参数 | 说明 | 取值范围 | | ————- |——————— | ———— | | metric_type | [可选] 距离计算方式 | 详见目前支持的距离计算方式。 |

IVF_FLAT

IVF(Inverted File,倒排文件)是一种基于量化的索引类型。它通过聚类方法把空间里的点划分成 nlist 个单元。查询时先把目标向量与所有单元的中心做距离比较,选出 nprobe 个最近单元。然后比较这些被选中单元里的所有向量,得到最终的结果。

IVF_FLAT 是最基础的 IVF 索引,存储在各个单元中的数据编码与原始数据一致。

  • 建索引参数| 参数 | 说明 | 取值范围 | | ———- | ———— |—————- | | nlist | 聚类单元数 |[1, 65536] |
  • 查询参数| 参数 | 说明 | 取值范围 | | ———— | —————- | ————— | | nprobe | 查询取的单元数 | [1, 65536]
    GPU 版 Milvus 在 nprobe > 2048 时由 GPU 查询切换为 CPU 查询。|

IVF_SQ8

IVF_SQ8 是在 IVF 的基础上对放入单元里的每条向量做一次标量量化(Scalar Quantization)。标量量化会把原始向量的每个维度从 4 个字节的浮点数转为 1 个字节的无符号整数,因此 IVF_SQ8 索引文件占用的存储空间远小于 IVF_FLAT。但是,标量量化会导致查询时的精度损失。

  • 建索引参数同 IVF_FLAT
  • 查询参数同 IVF_FLAT

IVF_SQ8H

IVF_SQ8H 是一种优化查询执行的 IVF_SQ8 索引类型。

在不同的 nq(Number of queries,查询数量)与系统参数 gpu_search_threshold 的关系下,查询方式如下:

  • nq ≥ gpu_search_threshold:整个查询过程都在 GPU 上执行。
  • nq < gpu_search_threshold:在 GPU 上执行在 IVF 里寻找 nprobe 个最近单元的运算,在 CPU 上执行其它运算。
  • 建索引参数同 IVF_FLAT
  • 查询参数同 IVF_FLAT

IVF_PQ

PQ(Product Quantization,乘积量化)会将原来的高维向量空间均匀分解成 m 个低维向量空间的笛卡尔积,然后对分解得到的低维向量空间分别做矢量量化。最终每条向量会存储在 m × nbits 个 bit 位里。乘积量化能将全样本的距离计算转化为到各低维空间聚类中心的距离计算,从而大大降低算法的时间复杂度。

IVF_PQ 是先对向量做乘积量化,然后进行 IVF 索引聚类。其索引文件甚至可以比 IVF_SQ8 更小,不过同样地也会导致查询时的精度损失。

不同版本的建索引参数和查询参数设置不同,请根据使用的 Milvus 版本查看相应的参数信息。

CPU 版 Milvus GPU 版 Milvus

- 建索引参数 | 参数 | 说明 | 取值范围 | | ————| ——————- | —————- | | nlist | 聚类单元数 | [1, 65536] | | m | 乘积量化因子个数 | dim ≡ 0 (mod m) | | nbits | 分解后每个低维向量的存储位数 (可选) | [1, 16] (默认 8) | - 查询参数 | 参数 | 说明 | 取值范围 | | ———— | —————- | ————— | | nprobe | 查询取的单元数 | [1, nlist] |

- 建索引参数 | 参数 | 说明 | 取值范围 | | ————| ——————- | —————- | | nlist | 聚类单元数 | [1, 65536] | | m | 乘积量化因子个数 | m ∈ {1, 2, 3, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 96}, and (dim / m) ∈ {1, 2, 3, 4, 6, 8, 10, 12, 16, 20, 24, 28, 32}。
m x 1024 的值不能超过显卡的 MaxSharedMemPerBlock。 | | nbits | 分解后每个低维向量的存储位数 (可选) | 8 |

  • 如果 m 值不在指定区间,但是只要 m 值是 CPU 版 Milvus 支持的(点击上面按钮可查看 CPU 版 Milvus 支持的取值范围),Milvus 会自动由 GPU 建索引切换为 CPU 建索引。
  • 如果 nbits 指定值不是 8 但是在 1 和 16 之间,系统会自动切换为 CPU 版 Milvus。
  • 查询参数| 参数 | 说明 | 取值范围 | | ———— | —————- | ————— | | nprobe | 查询取的单元数 | [1, min(2048, nlist)] |

如果 nprobe 值不在指定区间,但是只要 nprobe 值是 CPU 版 Milvus 支持的(点击上面按钮可查看 CPU 版 Milvus 支持的取值范围),Milvus 会自动由 GPU 查询切换为 CPU 查询。

RNSG

RNSG(Refined Navigating Spreading-out Graph)是一种基于图的索引算法。它把全图中心位置设为导航点,然后通过特定的选边策略来控制每个点的出度(小于等于 out_degree),使得搜索时既能减少内存使用,又能快速定位到目标位置附近。

RNSG 的建图流程如下:

  1. 为每个点精确寻找 knng 个最近邻结点。
  2. 以 knng 个最近邻结点为基础迭代至少 search_length 次,以选出 candidate_pool_size 个可能的最邻近结点。
  3. 在选出的 candidate_pool_size 个结点里按择边策略构建每个点的出边。

RNSG 的查询流程与建图流程类似,以导航点为起点至少迭代 search_length 次以得到最终结果。

  • 建索引参数| 参数 | 说明 | 取值范围 | | ———————————| —————————- | ———— | | out_degree | 结点的最大出度 | [5, 300] | | candidate_pool_size | 结点出边候选池 | [50, 1000] | | search_length | 查询迭代次数 | [10, 300] | | knng | 预计算最近邻结点数 | [5, 300] |
  • 查询参数| 参数 | 说明 | 取值范围 | | ———————- | —————- | ————- | | search_length | 查询迭代次数 | [10, 300] |

HNSW

HNSW(Hierarchical Small World Graph)是一种基于图的索引算法。它会为一张图按规则建成多层导航图,并让越上层的图越稀疏,结点间的距离越远;越下层的图越稠密,结点间的距离越近。搜索时从最上层开始,找到本层距离目标最近的结点后进入下一层再查找。如此迭代,快速逼近目标位置。

为了提高性能,HNSW 限定了每层图上结点的最大度数 M 。此外,建索引时可以用 efConstruction,查询时可以用 ef 来指定搜索范围。

  • 建索引参数| 参数 | 说明 | 取值范围 | | ———————— | ————————— | ————- | | M | 结点的最大度数 | [4, 64] | | efConstruction | 搜索范围 | [8, 512] |
  • 查询参数| 参数 | 说明 | 取值范围 | | ————|———————- | —————— | | ef | 搜索范围 | [top_k, 32768] |

ANNOY

ANNOY(Approximate Nearest Neighbors Oh Yeah)是一种用超平面把高维空间分割成多个子空间,并把这些子空间以树型结构存储的索引方式。

在查询时,ANNOY 会顺着树结构找到距离目标向量较近的一些子空间,然后比较这些子空间里的所有向量(要求比较的向量数不少于 search_k 个)以获得最终结果。显然,当目标向量靠近某个子空间的边缘时,有时需要大大增加搜索的子空间数以获得高召回率。因此,ANNOY 会使用 n_trees 次不同的方法来划分全空间,并同时搜索所有划分方法以减少目标向量总是处于子空间边缘的概率。

  • 建索引参数| 参数 | 说明 | 取值范围 | | ————- |——————— | ———— | | n_trees | 空间划分的方法数 | [1, 1024] |
  • 查询参数| 参数 | 说明 | 取值范围 | | —————-|————————————————- | ———————— | | search_k | 搜索的结点数。-1 表示用全数据量的 5% | {-1} ∪ [top_k, n × n_trees] |

选择索引

  • 若要为你的使用场景选择合适的索引,请参阅 如何选择索引类型。
  • 关于索引和向量距离计算方法的选择,请访问 距离计算方式。

常见问题

索引 IVF_SQ8 和 IVF_SQ8H 在召回率上有区别吗?

Milvus 中 FLAT 索引和 IVF_FLAT 索引的原理比较?

参考文献

  • RNSG:Fast Approximate Nearest Neighbor Search With The Navigating Spreading-out Graph
  • HNSW:Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs
  • ANNOY:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软路由系统 --- OpenWrt网络配置(LAN口、WAN口)

这里使用的 OpenWrt 是一台虚拟机安装的. 配置LAN口IP等信息 编辑修改网络配置文件 rootOpenWrt:~# vi /etc/config/network config interface lanoption type bridgeoption ifname eth0option proto staticoption ipaddr 192.168.100.4option netmask 255.255.255.0option i…

Servlet(下篇)

哥几个来学 Servlet 啦 ~~ 这个是 Servlet&#xff08;上篇&#xff09;的链接&#xff0c; (2条消息) Servlet &#xff08;上篇&#xff09;_小枫 ~的博客-CSDN博客https://blog.csdn.net/m0_64247824/article/details/131229873主要讲了 Servlet的定义、Servlet的部署方式、…

【总结】网页状态码——200正常、302重定向、304客户端有缓存、400浏览器请求传参异常、404未找到、405方法不允许、500服务器异常

目录 200正常500异常--服务器异常Java代码400异常----传参相关的异常get方法长度限制400异常&#xff0c;加了RequestParam(value "name") 必须传值400异常&#xff0c;后端类型是Integer&#xff0c;前端传的是string&#xff0c;转换失败400异常&#xff0c;日期格…

一文带你学习“国密算法”

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

ES6--一

1、ES6之includes()方法 Array.prototype.includes方法返回一个布尔值&#xff0c;表示某个数组是否包含给定的值&#xff0c;与字符串的includes方法类似。 一般常用这种写法 : [1,2,3].includes(2) 表示2在不在 前面的数组里 项目里 参数 1&#xff09;第一个参数是要…

VUE L 计算监视属性 ⑥

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs计算属性 C o m p u t e d Computed Computed监视属性 W a t c h Watch Watch总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;…

SpringBoot 实现 elasticsearch 索引操作(RestHighLevelClient 的应用)

文章目录 0. 引入依赖1. 实例创建与关闭2. 创建索引3. 测试索引库存在不存在4. 删除索引库5. 遍历导入数据6. 批量导入数据&#xff08;推荐&#xff09; RestHighLevelClient 是 Elasticsearch 官方提供的Java高级客户端&#xff0c;用于与Elasticsearch集群进行交互和执行各种…

基于Java+Swing实现中国象棋游戏

基于JavaSwing实现中国象棋游戏 一、系统介绍二、功能展示三、其他系统四、获取源码 前言 中国象棋是起源于中国的一种棋&#xff0c;属于二人对抗性游戏的一种&#xff0c;在中国有着悠久的历史。由于用具简单&#xff0c;趣味性强&#xff0c;成为流行极为广泛的棋艺活动。 …

操作系统之死锁详解

本文已收录于专栏 《自考》 目录 背景介绍死锁的前提死锁的概念死锁的分类死锁的产生原因条件 死锁的解决预防避免检测与恢复 死锁的实现总结提升 背景介绍 最近一直在做操作系统的测试题&#xff0c;在做题的过程中发现有很多地方涉及到了关于死锁的知识点。今天就回归课本来自…

机器学习——手写数据集的介绍以及案例讲解

系列文章目录 机器学习聚类——DBSCAN&#xff08;Density-based spatial clustering of applications with noise&#xff0c;基于密度的聚类算法&#xff09; 机器学习集成学习——Adaboost分离器算法 机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法 机器学习的…

“交通·未来”第27期:基于随机效应机器学习的多区域居民出行模式选择分析...

2020年6月份&#xff0c;公众号正式推出了“交通未来”系列线上公益学术活动等你来~&#xff0c; 2023年&#xff0c;新起航新征程&#xff0c;我们继续前行~ 6月24日下午15:30&#xff0c;我们将迎来活动的第27期。 1、讲座主题 基于随机效应机器学习的多区域居民出行模式选择…

工作三--知识点

1、split 切割字符串 2、includes 而不是写成 if&#xff08;useContext pm_global_teamrole_project_manager || pm_global_teamrole_task_manager || pm_global_teamrole_task_parent_manager&#xff09; 因为 的 优先级 高于 ||&#xff0c;这样写 只能 前面的&…

大数据学习(3)

大数据学习&#xff08;3&#xff09; 1 Hive-SQL-DML语句1.1 Hive SQL Load 加载数据语句1.1.1 Load功能1.1.2 Load语法规则1.1.3 Load 语法实验1.1.3.1 Load Data From Local FS1.1.3.2 Load Data From HDFS1.1.3.3 Overwrite选项 1.2 Hive SQL Insert 插入数据语句1.3 Hive …

河道垃圾自动识别监测算法 opencv

河道垃圾自动识别监测系统通过pythonopencv网络模型技术&#xff0c;河道垃圾自动识别监测算法对水面上的垃圾进行自动识别&#xff0c;一旦发现垃圾污染将自动发出警报。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python…

Win10文件夹选项在哪里打开?Win10文件夹选项打开方法

Win10文件夹选项在哪里打开&#xff1f;Win10电脑中用户不知道在哪里才能打开文件夹选项&#xff0c;这时候用户随意打开Win10电脑上的一个文件夹&#xff0c;然后点击右上角的选项&#xff0c;打开之后就能打开文件夹选项了&#xff0c;也可以打开电脑的运行窗口&#xff0c;在…

自动化漏洞猎人代码分析

0x00 前言 安全人员可以扫描&#xff0c;网络上悬赏网站等的漏洞&#xff0c;如果能够发现其存在着安全漏洞&#xff0c;则可以通过提交漏洞的方式来获得一定的赏金&#xff0c;国外的这类悬赏的网站比较多&#xff0c;比如hackone&#xff0c;这上面列出了大量的资产信息&…

你不得不知道的箭头函数和普通函数使用区别!

前言 箭头函数是 ES6 新增的一种函数类型&#xff0c;它采用箭头 > 定义函数&#xff0c;也称为 lambda 函数。箭头函数语法更为简洁&#xff0c;用起来很是方便顺手。 但它存在一些需要注意的问题和局限性。在实际使用时&#xff0c;我们需要根据具体情况来选择合适的函数…

【夜深人静学数据结构与算法 | 第九篇】栈与队列

目录 ​前言&#xff1a; 栈&#xff1a; 栈的实际应用&#xff1a; 队列&#xff1a; 队列的实际应用&#xff1a; 总结&#xff1a; 前言&#xff1a; 栈与队列是我们学习的两个经典的数据结构&#xff0c;这两个数据结构应用广泛&#xff0c;在计算机内有很多底层应用…

操作系统2——进程的描述与控制

本系列博客重点在深圳大学操作系统课程的核心内容梳理&#xff0c;参考书目《计算机操作系统》&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xff09;。 梗概 本篇博客主要介绍操作系统第二章进程的描述与控制的相关知识。 目录 一、前驱图与程序…

大数据从0到1的完美落地之Flume案例1

案例演示 案例演示&#xff1a;AvroMemoryLogger Avro Source&#xff1a;监听一个指定的Avro端口&#xff0c;通过Avro端口可以获取到Avro client发送过来的文件&#xff0c;即只要应用程序通过Avro端口发送文件&#xff0c;source组件就可以获取到该文件中的内容,输出位置为…