Milvus 核心设计(5)--- scalar indexwork mechanism

news2024/9/20 12:16:26

目录

背景

Scalar index 简介

属性过滤

扫描数据段

相似性搜索

返回结果

举例说明

1. 属性过滤

2. 扫描数据段

3. 相似性搜索

实际应用中的考虑

Scalar Index 方式

Auto indexing 

Inverted indexing


背景

继续Milvus的很细设计,前面主要阐述了Milvus 在 vector simalairity 上的处理策略及index 方式。今天主要讲下scalar index。应该说对于所有的 db 实现,scalar index 都是需要的,无论是否是 关系型数据库,还是是否采用 k-v 存储等模式,有的东西是触类旁通的。Milvus 在处理scalar index 时,并不是孤立处理,而是结合了 bitset 提前过滤 + vector similarity 共同应对user  query 提出的挑战。下面进入正题。

Scalar index 简介

向量相似性搜索过程中,Milvus 使用了属性过滤条件(expr)来扫描每个数据段(segment),并将过滤结果(bitset,一种位集合,用于高效表示哪些元素满足条件)与查询向量(data)一起应用于相似性搜索中。这种方式可以极大地提高搜索效率,因为它允许Milvus在执行耗时的相似性计算之前,先通过简单的属性过滤快速排除掉大量不满足条件的数据点。

具体来说,过程如下:

属性过滤

用户定义了一个或多个属性过滤条件(expr),这些条件用于筛选数据集中满足特定属性要求的向量。这些条件可以基于向量的元数据(如时间戳、地理位置、分类标签等)来定义。

扫描数据段

Milvus遍历或索引每个数据段,应用这些属性过滤条件。对于每个数据段,它会生成一个bitset,这个bitset中的每一位代表数据段中对应位置的向量是否满足过滤条件。

相似性搜索

在得到过滤后的bitset后,Milvus只针对那些标记为“满足条件”的向量进行相似性搜索。这意味着它不再需要计算所有向量的相似性,而只需计算那些经过初步筛选、更有可能与查询向量相似的向量的相似性。


返回结果

最后,Milvus根据相似性得分对满足条件的向量进行排序,并返回最相似的向量及其相关信息(如ID、相似度分数等)给用户。

这种结合属性过滤和相似性搜索的方法,使得Milvus在处理大规模向量数据集时,能够更加高效和准确地响应用户的查询需求。它特别适用于那些既需要基于内容的相似性搜索,又需要基于属性快速筛选的场景,如推荐系统、图像检索、文档聚类等领域。

这里有一点要说明,你使用milvus,基本决定了你的 collection 世界中,一定是 vector + scalar 共存的case,原因很简单,如果仅有scalar,我相信你使用 mysql,sqlserver,甚至oracle 足以,小的应用你甚至使用sqlite估计也行,因为你的 sql  query 足以胜任user 各种需求。你之所以选择向量数据库,肯定是要么有LLM的vector 需求,要么有pic,audio甚至video 的需求。还是那句话,使用场景决定了product 的选择。所以你的collection 多半可能是  一个+多个 vector embeddding + 多个 attibute 的vector 说明。

举例说明

假设我们有一个电商平台,该平台使用Milvus来存储商品的图像特征向量,并希望为用户提供基于图像相似性的商品推荐功能。同时,商品还具有一些属性信息,如价格、品牌、类别等。

1. 属性过滤

用户查询:用户希望找到一款与某张图片相似,但价格不超过5000元,且品牌为“Huawei”的商品。

属性过滤条件

  • 价格 <= 5000
  • 品牌 = "Huawei"

在Milvus中,这些属性信息会与图像特征向量一起存储,但它们是分开处理的。当用户发起查询时,Milvus首先会应用这些属性过滤条件来筛选出满足条件的商品。

2. 扫描数据段

数据段扫描

  • Milvus会将存储的商品数据分为多个数据段(segment),每个数据段包含一部分商品的特征向量和属性信息。
  • 当属性过滤条件被应用时,Milvus会遍历或索引这些数据段,检查每个商品是否满足过滤条件。
  • 对于满足条件的商品,Milvus会生成一个bitset,其中每个位对应一个商品,满足条件的商品对应的位被设置为1,不满足的则被设置为0。

3. 相似性搜索

相似性搜索

  • 在得到过滤后的bitset后,Milvus只针对那些标记为“满足条件”的商品特征向量进行相似性搜索。
  • 用户提供的查询图片首先被转换为特征向量。
  • Milvus使用适当的相似性度量(如余弦相似度)来计算查询向量与满足条件的商品特征向量之间的相似性。
  • 根据相似性得分,Milvus对商品进行排序,并返回最相似的几个商品给用户。

实际应用中的考虑

  • 性能优化:Milvus通过高效的索引结构和算法来加速数据段的扫描和相似性搜索过程,确保即使在处理大规模数据集时也能提供快速响应。
  • 多模态支持:Milvus不仅支持图像特征向量的存储和检索,还支持文本、音频等多种模态的数据,为跨模态检索提供了可能。
  • 可扩展性:Milvus支持分布式部署,可以随着数据量的增长而水平扩展,以满足更高并发和更大存储容量的需求。

Scalar Index 方式

Auto indexing 

你不用对你的scalar attribute 做任何辅助说明,Milvus 使用 auto indexing 的方式完成Scalar Indexing 的索引。

实际上你看了Milvus 的源码之后,你会发现,实际上 Auto indexing 就是 底层用的 inverted indexing。这里可能milvus 为了扩展,将inverted indexing 作为了 default 的 scalar indexing 来使用。

所以本质上来说要看下 Inverted indexing。

Inverted indexing

倒排索引,如果你曾经是比较资深的programmmer,你应该不会陌生。我那时候还没有ElasticSearch,用的是Lucene,后来有了ElasticSearch 和 Solr,但是万变不离其宗,其核心还是倒排索引。说直白点就是把一个句子拆分为词组的 tomkenizer 并 标识这些词在哪些句子中出现或是标识出现的概率。Milvus的 inverted indexing 出自一个开源库:Tantivy。应该说 Tantivy 的实现并不是ElasticSerach 或是 Solr,但是其思想有些类似,有兴趣的可以去看下源码。github 地址:

Tantivy Github 源码地址

再次说明了,成功是站在巨人的肩上,其实Milvus 用了不少其他中间件来保证自己的功能特性,前面介绍过的就有:etcd,mysql,rockMQ,pluster etc。现在又看到了 Tantivy。你可能会问为什么Milvus 不使用 ElasticSearch或Solr,那肯定是那啥License等问题,但从技术的角度来说,Tantivy也足够优秀。或许有一天 Tantivy 的知名度会超过 ElasticSearch 也不一定。

我们看个例子:

这就是倒排索引,只不过不同人,不同版本实现时,倒排信息的精度有差别,这里是focus 在句子层面。不过对于 Milvus的使用,足以。

在单个查询,比如上面的例子,品牌=’huawei‘,那根据倒排索引,直接锁定包含’huawei‘品牌attribute的 document 或 segment。

在区间查询,比如还是上面的例子,价格<5000, 那还是根据倒排索引,直接锁定 价格 attribute的document 或segment。

或许区间的例子还不够透彻,因为range 的是数据。你查找的品牌获取不止一种,如果 brand in ['huawei', 'apple'] 首先会经过类似alpha的字母排序,之后通过倒排索引查询,会比暴力查询效率高很多。

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

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

相关文章

【排序算法】1.冒泡排序-C语言实现

冒泡排序&#xff08;Bubble Sort&#xff09;是最简单和最通用的排序方法&#xff0c;其基本思想是&#xff1a;在待排序的一组数中&#xff0c;将相邻的两个数进行比较&#xff0c;若前面的数比后面的数大就交换两数&#xff0c;否则不交换&#xff1b;如此下去&#xff0c;直…

C++ 入门基础:开启编程之旅

文章目录 引言一、C的第⼀个程序二、命名空间1、namespace2、namespace的定义 三、C输入 与 输出四、缺省参数五、函数重载六、引用1、引用的概念和定义2、引用的特性3、指针和引用的关系七、inline八、nullptr 引言 C 是一种高效、灵活且功能强大的编程语言&#xff0c;广泛应…

【java】力扣 合并两个有序数组

文章目录 题目链接题目描述代码第一种第二种 题目链接 88.合并两个有序数组 题目描述 代码 第一种 public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0;i<n;i){nums1[mi] nums2[i];}Arrays.sort(nums1);}第二种 public void merge(int[] nums1,…

【数据结构】二叉树全攻略,从实现到应用详解

​ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f341;1. 树形结构的介绍 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做…

JVM垃圾回收-----垃圾分类

一、垃圾分类定义 垃圾分类是JVM垃圾分类中的第一步&#xff0c;这一步将堆中的对象分为存活对象和垃圾对象两类。 在垃圾分类阶段&#xff0c;JVM会从一组根对象开始&#xff0c;通过对象之间的引用关系&#xff0c;遍历所有的对象&#xff0c;并将所有存活的对象进行标记。…

QT使用QPainter绘制多边形维度图

多边形统计维度图是一种用于展示多个维度的数据的图表。它通过将各个维度表示为图表中的多边形的边&#xff0c;根据数据的大小和比例来确定各个维度的长度。 一、简述 本示例实现六边形战力统计维度图&#xff0c;一种将六个维度的战力统计以六边形图形展示的方法。六个维度是…

leetcode-383.赎金信

题源 383.赎金信 题目描述 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。示例 1&…

MySQL(3)表的操作

目录 1. 表的操作; 2. 数据类型; 1. 表的操作: 1.1 创建表: 语法: create table 表名( 属性 类型 [comment ], 属性 类型 [comment ], 属性 类型 ) character set 字符集 collate 校验集 engine 存储引擎; 前面博客提到: MyISAM和InoDB这两个比较重要. 1.2 查看表…

Spring与设计模式实战之策略模式

Spring与设计模式实战之策略模式 引言 在现代软件开发中&#xff0c;设计模式是解决常见设计问题的有效工具。它们提供了经过验证的解决方案&#xff0c;帮助开发人员构建灵活、可扩展和可维护的系统。本文将探讨策略模式在Spring框架中的应用&#xff0c;并通过实际例子展示…

three.js领衔,10大基于webGL的JavaScript库。

Three.js的赫赫威名补多少&#xff0c;不了解的自行搜索或者翻看大宇之前的文章&#xff0c;除了three.js外&#xff0c;我想实现web3D效果还有其他库吗&#xff1f;答案是有的&#xff0c;而且还不少。 除了 Three.js&#xff0c;还有一些基于 WebGL 的库和框架&#xff0c;它…

动态环境下的激光slam论文列表

文章目录 Scan Context: Egocentric Spatial Descriptor for Place Recognition within 3D Point Cloud Map&#xff08;2018&#xff09;LIO-CSI: LiDAR inertial odometry with loop closure combined with semantic information&#xff08;2021&#xff09;Semantic Lidar-…

防火墙--双机热备

目录 双击热备作用 防火墙和路由器备份不同之处 如何连线 双机 热备 冷备 VRRP VGMP&#xff08;华为私有协议&#xff09; 场景解释 VGMP作用过程 主备的形成场景 接口故障的切换场景 整机故障 原主设备故障恢复的场景 如果没有开启抢占 如果开启了抢占 负载分…

网络原理(上)

前言&#x1f440;~ 上一章我们介绍了网络的一些基础知识&#xff0c;今天来讲解一下网络原理相关的知识点&#xff0c;分三篇进行阐述内容有点多​​​​​​​ 再谈协议分层 应用层 传输层&#xff08;重点&#xff09; UDP协议 TCP协议 TCP如何完成可靠传输&#xff…

在 PostgreSQL 里如何处理数据的归档和清理过程中的数据完整性验证?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的归档和清理过程中的数据完整性验证 在 PostgreSQL 里如何处理数据的归…

3D数字孪生项目运行卡顿,来看看它要求的电脑配置。

有些小伙伴和我说&#xff0c;数字孪生项目运行卡顿&#xff0c;不知道啥原因&#xff0c;根源还是这类项目是浏览器渲染&#xff0c;对电脑配置要求很高。 运行3D数字孪生项目需要一台性能强大的电脑&#xff0c; 以下是一个推荐的配置清单&#xff1a; 1. 处理器&#xff1…

css实现每个小盒子占32%,超出就换行

代码 <div class"visitors"><visitor class"item" v-for"(user,index) in userArr" :key"user.id" :user"user" :index"index"></visitor></div><style lang"scss" scoped&…

Porfinet转DeviceNet主总线协议转换网关

产品功能 1. 远创智控YC-DNTM-PN型网关是Porfinet从转Devicenet主工业级Porfinet网关。‌这种网关设备允许将Porfinet网络中的设备连接到Devicenet网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连…

shell脚本-linux如何在脚本中远程到一台linux机器并执行命令

需求&#xff1a;我们需要从11.0.1.17远程到11.0.1.16上执行命令 实现&#xff1a; 1.让11.0.1.17 可以免密登录到11.0.1.16 [rootlocalhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created d…

Ubuntu 22.04.4 LTS (linux) 安装iftop 监控网卡流量 软件

1 安装iftop sudo apt update sudo apt-get install iftop 2 监控网卡 sudo iftop -i eth0 -n -p 界面最上面&#xff0c;显示的是类似刻度尺的刻度范围&#xff0c;显示流量图形的长条作标尺用的。 中间的< >这两个左右箭头&#xff0c;表示的是流量的进出方向.TX&…

使用JS和CSS制作的小案例(day二)

一、写在开头 本项目是从github上摘取&#xff0c;自己练习使用后分享&#xff0c;方便登录github的小伙伴可以看本篇文章 50项目50天​编辑https://github.com/bradtraversy/50projects50dayshttps://github.com/bradtraversy/50projects50days有兴趣的小伙伴可以自己去gith…