Milvus的向量索引(内存索引)

版本: v2.3.x
官网: https://milvus.io/docs/index.md

一、简介

Milvus 支持的各种类型的内存索引、每种索引最适合的场景以及用户可以配置以获得更好搜索性能的参数。
索引是有效组织数据的过程,它通过显着加速大型数据集上耗时的查询,在使相似性搜索变得有用方面发挥着重要作用。
为了提高查询性能,您可以为每个向量字段指定索引类型。
注意:目前,向量字段仅支持一种索引类型。 Milvus 在切换索引类型时会自动删除旧索引。

二、ANNS向量索引

Milvus 支持的向量索引类型大部分使用近似最近邻搜索 (ANNS) 算法。与通常非常耗时的准确检索相比,ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
根据实现方法,ANNS向量索引可以分为四类:

  • Tree-based index 基于树的索引
  • Graph-based index 基于图的索引
  • Hash-based index 基于哈希的索引
  • Quantization-based index 基于量化的索引

三、Milvus 支持的索引

根据适合的数据类型,Milvus 支持的索引可以分为两类:

  • 浮点嵌入的索引:
    • 对于 128 维浮点嵌入,它们占用的存储为 128 * float 的大小 = 512 字节。
    • 用于浮点嵌入的距离度量是欧几里德距离(L2)和内积。
    • 这些类型的索引包括用于基于 CPU 的 ANN 搜索的 FLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW 和 SCANN(beta),以及用于基于 GPU 的 ANN 搜索的 GPU_IVF_FLAT 和 GPU_IVF_PQ。
索引类型适合场景
FLATN/A数据集相对较小,需要 100% 的召回率
IVF_FLAT/GPU_IVF_FLAT量化高速查询,要求召回率尽可能高
IVF_SQ8量化高速查询,有限的内存资源,接受召回率的微小妥协
IVF_PQ/GPU_IVF_PQ量化非常高速的查询,有限的内存资源,接受召回率的大幅妥协
HNSW哈希非常高速的查询,要求尽可能高的召回率,大内存资源
SCANN量化非常高速的查询,要求尽可能高的召回率,大内存资源

3.1 FLAT

对于需要完美精度并依赖于相对较小(百万级)数据集的矢量相似性搜索应用程序,FLAT 索引是一个不错的选择。 FLAT不压缩向量,是唯一能保证精确搜索结果的索引。 FLAT 的结果还可用作召回率低于 100% 的其他索引产生的结果的比较点。
FLAT 是准确的,因为它采用详尽的搜索方法,这意味着对于每个查询,目标输入都会与数据集中的每组向量进行比较。这使得 FLAT 成为我们列表中最慢的索引,并且不太适合查询大量矢量数据。
Milvus 中 FLAT 索引不需要任何参数,使用它不需要数据训练。

3.2 IVF_FLAT/GPU_IVF_FLAT

IVF_FLAT将向量数据划分为 nlist 簇单元(聚类),然后比较目标输入向量与每个簇中心之间的距离。根据系统设置要查询的簇数 (nprobe),仅根据目标输入与最相似簇中向量之间的比较返回相似性搜索结果,从而大大减少查询时间。
通过调整nprobe,可以在给定场景下找到精度和速度之间的理想平衡。 IVF_FLAT 性能测试的结果表明,随着目标输入向量 (nq) 数量和要搜索的簇数量 (nprobe) 的增加,查询时间急剧增加。 IVF_FLAT是最基本的IVF索引,每个单元存储的编码数据与原始数据一致。
构建索引参数:

  • nlist,聚类簇的数量,范围1~65536,默认128

搜索索引参数:

  • nprobe,检索簇的数量,范围1~nlist,默认8
  • top-K,检索的向量数,<256

3.3 IVF_SQ8

IVF_FLAT 不执行任何压缩,因此它生成的索引文件与原始的原始非索引矢量数据的大小大致相同。
例如,如果原始 1B SIFT 数据集为 476 GB,则其 IVF_FLAT 索引文件会稍小(约 470 GB)。将所有索引文件加载到内存中将消耗 470 GB 的存储空间。当磁盘、CPU 或 GPU 内存资源有限时,IVF_SQ8 是比 IVF_FLAT 更好的选择。
该索引类型可以通过执行标量量化(SQ)将每个 FLOAT(4 字节)转换为 UINT8(1 字节)。这可将磁盘、CPU 和 GPU 内存消耗减少 70-75%。
对于 1B SIFT 数据集,IVF_SQ8 索引文件仅需要 140 GB 存储空间。
参数:nlist、nprobe

3.4 IVF_PQ/GPU_IVF_PQ

PQ(Product Quantization)将原始高维向量空间统一分解为m个低维向量空间的笛卡尔积,然后对分解后的低维向量空间进行量化。
乘积量化不再计算目标向量与所有单元中心的距离,而是计算目标向量与各个低维空间的聚类中心的距离,大大降低了算法的时间复杂度和空间复杂度。
IVF_PQ 在量化向量的乘积之前执行 IVF 索引聚类。它的索引文件甚至比IVF_SQ8还要小,但也会导致搜索向量时精度的损失。

注意:索引构建参数和搜索参数随 Milvus 发布的不同而变化。首先选择您的 Milvus 发行版。
构建索引参数:

  • nlist
  • m,乘积量化因子数,dim mod m == 0
  • nbits,可选,存储每个低维向量的位数。[1, 16] (8 by default)

搜索参数:

  • nprobe

3.4 SCANN

SCANN(分数感知量化损失)在向量聚类和乘积量化方面与 IVF_PQ 类似。它们的不同之处在于乘积量化的实现细节以及使用SIMD(单指令/多数据)进行高效计算。
构建索引参数:

  • nlist
  • with_raw_data,是否将原始数据包含在索引中,默认True.

检索参数:

  • nprobe
  • **reorder_k, **待查询候选单位数量,范围 [top_k, ∞]
  • radius,要查询的单位数,范围[1, nlist]
  • range_filter,要查询的候选单元数,范围[top_k, ∞]

3.5 HNSW

HNSW(Hierarchical Navigable Small World Graph)是一种基于图的索引算法。它根据一定的规则为图像构建了一个多层导航结构。在这种结构中,上层更稀疏,节点之间的距离更远;越低的层越密集,节点之间的距离越近。搜索从最上层开始,找到该层中最靠近目标的节点,然后进入下一层开始另一次搜索。经过多次迭代,它可以快速接近目标位置。
为了提高性能,HNSW将图形每层上节点的最大次数限制为M。此外,您可以使用efConstruction(构建索引时)或ef(搜索目标时)来指定搜索范围。
构建所以参数:

  • m, 节点的最大值,范围(2, 2048)
  • efConstruction,搜索范围,范围(1, int_max)

检索参数:

  • ef,搜索范围,范围(1, int_max)

如果有用,请点个三连呗 `点赞、关注、收藏`。
***你的鼓励是我最大的动力***

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

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

相关文章

一台GTX1080显卡的怪兽,我可不能错过这个机会!

标题&#xff1a;我花了30块钱买了一台电脑主机。 这个配置能赚钱吗&#xff1f; 1. 收购惊喜 那是一个阳光明媚的下午&#xff0c;我在水管修理店里闲逛。 突然&#xff0c;一位老顾客手里拿着一台旧电脑主机匆匆走了进来。 他说&#xff1a;“小王&#xff0c;你能帮我看看…

【算法训练营】周测3

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-3 题目描述 输入格式 输出格式 输出到标准输出。 若可以通关&…

STM32的GPIO初始化配置-学习笔记

简介&#xff1a; 由于刚开始没有学懂GPIO的配置原理&#xff0c;导致后面学习其它外设的时候总是产生阻碍&#xff0c;因为其它外设要使用前&#xff0c;大部分都要配置GPIO的初始化&#xff0c;因此这几天重新学习了一遍GPIO的配置&#xff0c;记录如下。 首先我们要知道芯片…

力扣701. 二叉搜索树中的插入操作

思路&#xff1a;往二叉搜索树中插入一个值&#xff0c;树的结构有多种符合的情况&#xff0c;那我们可以选一种最容易的插入方式&#xff0c;反正只需要插入一个值而已&#xff0c;我们不难发现&#xff0c;不管插入什么值&#xff0c;都可以安排插入到叶子节点上。 再利用二叉…

传统SessionID,Cookie方式与SringSecurity+JWT验证方式

在Spring Boot框架中&#xff0c;可以使用Spring Session来处理会话管理。Spring Session允许开发者在不同的存储后端&#xff08;如Redis、数据库等&#xff09;之间共享和管理会话状态。通过Spring Session&#xff0c;开发者可以轻松地实现会话管理、会话失效以及跨多个节点…

Redux Toolkit

本文作者为 360 奇舞团前端开发工程师 阅读本文章前&#xff0c;需要先了解下 redux 的基本概念与用法&#xff0c;Redux Toolkit 是建立在 Redux 基础之上的工具包&#xff0c;因此需要对 Redux 的基本概念有一定的了解&#xff0c;包括 Action、Reducer、Store、Middleware 等…

彻底解决 ModuleNotFoundError: No module named ‘torch_scatter‘

之前做实验报了一个错误&#xff0c;卡了很久。 具体就是这行代码 from torch_scatter import scatter_add 这个torch_scatter是非官方的库&#xff0c;经常安装失败&#xff0c; 找了很多的安装方法&#xff0c;都不好使&#xff0c;特别是对新版的pytorchcuda环境 机缘巧…

【C语言】如何规避野指针

✨✨ 欢迎大家来到莉莉的博文✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 目录 一、概念&#xff1a; 二、野指针成因&#xff1a; 2.1. 指针未初始化 2.2 指针越界访问 3. 指针指向的空间释放 三、如何规避野指针 3.…

专题二 - 滑动窗口 - leetcode 904. 水果成篮 | 中等难度

leetcode 904. 水果成篮 leetcode 904. 水果成篮 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 904. 水果成篮 | 中等难度 1. 题目详情 你正在探访一家农场&#xff0c;农场从左到右种植…

html5cssjs代码 016 表格示例

html5&css&js代码 016 表格示例 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;展示了不同类型的表格示例。页面使用了CSS样式来控制字体颜色、背景颜色、表格样式等。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head>&l…

OpenResty使用Lua大全(一)Lua语法入门实战

文章目录 系列文章索引一、OpenResty使用Lua入门1、hello world2、nginx内部变量 二、Lua入门1、简介1、hello world2、基本语法&#xff08;1&#xff09;注释&#xff08;2&#xff09;数据类型&#xff08;3&#xff09;变量&#xff08;4&#xff09;函数&#xff08;5&…

【Java中的数组Array】

Java中的数组Array 一、数组的创建 package space.goldchen;/*** 数组初始化&#xff0c;数组定义** author 2021* create 2023-12-14 14:14*/ public class ArrayInit {public static void main(String[] args) {// 数组的初始化的三种方式int[] arr1 new int[5];int[] arr…

c++基础语法

文章目录 前言命名空间命名空间的使用 缺省参数缺省参数的使用 函数重载函数重载的作用函数重载的使用函数重载原理 引用引用的使用引用的使用场景引用和指针 extern Cinlineauto范围fornullptr 前言 大家好我是jiantaoyab&#xff0c;这篇文章给大家带来的是c语言没有的一些特…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前已经成熟的…

Android 配置打包签名信息的两种方法

目录结构如下&#xff1a; 有2种方式&#xff1a; 第一种&#xff0c;直接配置&#xff1a; signingConfigs { debug { storeFile file("app/keystore.properties") storePassword "111111" keyAlias "key" keyPassword "111111" } …

Redis 订阅发布(Pub/Sub) 详解 如何使用订阅发布

Pub/Sub (发布订阅) Redis的发布订阅&#xff08;Pub/Sub&#xff09;是一种消息传递模式&#xff0c;它允许消息的发送者&#xff08;发布者&#xff09;将消息发送到通道&#xff0c;而订阅者则可以订阅一个或多个通道&#xff0c;并接收发布者发送到这些通道的消息。发布订…

学习记录之数学表达式(1)

文章目录 一、概述二、符号表2.1 常用符号表2.2 希腊字母表 三、集合的表示与运算3.1 集合的表示3.2 元素与集合3.3 集合的运算3.4 幂集3.5 笛卡尔积3.6 作业 一、概述 本系列内容参考闵老师的博客&#xff1a;数学表达式: 从恐惧到单挑 (符号表) &#xff08;1&#xff09;数学…

【Java】bigdecimal转为string时会变成科学计数法 | 大数取消转换为科学计数法

遇见“隐形刺客” 在银行写代码&#xff0c;我们通常用BigDecimal来处理大数计算&#xff0c;确保精度无损&#xff0c;正所谓“精打细算”。然而&#xff0c;当你满怀信心地将BigDecimal转换为String&#xff0c;准备输出或存储时&#xff0c;突然发现它变成了一串让人眼花缭…

Linux 服务器挂载盘阵(运维工程师必备技能难度***)

以下为真实操作过程 [rootdg1 ~]# fdisk -l -uDisk /dev/sda: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders, total 62914560 sectors Units sectors of 1 * 512 512 bytesDevice Boot Start End Blocks Id System /dev/s…

回归分析之boxcox

Box-Cox变换是一种用于处理非正态分布数据的统计方法。它通过对数据进行一系列的变换&#xff0c;将其转化为近似正态分布的形式&#xff0c;以便用于回归分析。 Box-Cox变换的基本思想是通过对数据应用一个参数λ的幂函数变换&#xff0c;其中λ可以是任意实数。具体而言&…