Milvus - 比特集机制及其应用场景详解

server/2024/10/18 3:50:13/

在向量数据库 Milvus 中,比特集(Bitset)是一种强大且高效的机制,能够帮助实现属性过滤、数据删除以及时间旅行查询等功能。本文将详细介绍比特集的概念、其在 Milvus 中的应用,以及其主要应用场景,并通过多个示例展示比特集在实际应用中的功能。

什么是比特集?

比特集(Bitset)是由 0 和 1 组成的位数组。每一个比特(bit)代表布尔值 truefalse,即 1 或 0。在 Milvus 中,比特集用于表示数据的状态,能够紧凑、高效地存储和处理布尔逻辑操作。

  • 0:通常表示“无效”或“未满足条件”。
  • 1:通常表示“有效”或“满足条件”。

比特集的主要功能

1. 属性过滤

在属性过滤中,比特集用于标记哪些实体数据满足给定的查询条件。通过布尔逻辑操作,比特集能够快速筛选出符合条件的实体。

应用场景:当需要从大量数据中根据某个属性(如年龄、产品类型等)进行筛选时,比特集能迅速确定哪些数据符合条件,而其他不符合条件的数据会被标记为 0。

示例:在一个包含 8 个实体的数据集中,只有 primary_keys 为 [1, 3, 5, 7] 的实体满足查询条件。比特集会将这些实体标记为 1,其余实体标记为 0:

  • 比特集:[1, 0, 1, 0, 1, 0, 1, 0]

2. 数据删除

比特集还用于管理数据删除。当某个实体被删除时,对应位置的比特集会被设置为 1。在后续查询中,这些标记为 1 的实体将被跳过。

应用场景:在大规模数据库中进行逻辑删除操作时,比特集可以帮助快速标记已删除的数据,避免它们在后续查询中被考虑。

示例:如果 primary_keys 为 [7, 8] 的实体被删除,比特集会变为:

  • 删除比特集:[0, 0, 0, 0, 0, 0, 1, 1]

3. 时间旅行查询

时间旅行查询允许用户查看历史某一时间点的数据状态。比特集结合时间戳,能够标记在不同时间点有效或无效的实体,模拟该时间点的数据库状态。

应用场景:在需要回溯数据状态或进行审计时,时间旅行查询可以帮助用户查询过去某个时间点的数据。

示例:如果用户设置 time_travel 为 150,比特集会标记在此时间点之前已存在且有效的数据,而那些之后插入的数据则会被标记为无效。

4. 并行处理中的高效计算

比特集占用的存储空间较小,并且可以快速执行布尔运算,适合在并行计算环境中处理大规模数据。多个比特集之间的逻辑操作(如 AND、OR)能够并行执行,从而提升系统的处理速度。

应用场景:在多核处理器或分布式系统中,处理大规模数据时,比特集能极大提升并行计算性能。

5. 索引优化

比特集可以用于构建高效的索引结构。通过预先生成比特集,可以快速筛选出满足查询条件的实体,避免每次查询时都重新计算。

应用场景:在需要频繁查询的大数据系统中,比特集可以作为一种优化工具,显著提升查询性能。

6. 稀疏数据表示

在稀疏数据场景中,比特集能够高效表示布尔状态。与传统数据类型相比,比特集占用空间小,非常适合表示大量布尔值或标志位。

应用场景:例如在权限管理系统中,比特集可以高效表示用户权限,或在任务调度系统中用于标记任务的状态。

比特集的综合应用示例

示例一:属性过滤与时间旅行

场景描述:假设在一个系统中,我们有 8 个实体数据,按照时间顺序进行以下操作:

  • 在时间戳 ts = 100 时插入实体 [1, 2, 3, 4]。
  • 在时间戳 ts = 200 时插入实体 [5, 6, 7, 8]。
  • 在时间戳 ts = 300 时删除实体 [7, 8]。

用户希望通过时间旅行查询,查看在 ts = 150ts = 250 时哪些实体符合查询条件。

Step 1:查询 time_travel = 150 时的数据
  • 过滤条件:primary_keys 为 [1, 3, 5, 7] 满足筛选条件,因此初始 filter_bitset[1, 0, 1, 0, 1, 0, 1, 0]
  • 时间点判断:在时间戳 ts = 150 时,实体 [5, 6, 7, 8] 还未插入,因此应被标记为无效,filter_bitset 变为 [1, 0, 1, 0, 0, 0, 0, 0]
  • 删除判断:此时还没有发生删除操作,因此删除比特集为 [0, 0, 0, 0, 0, 0, 0, 0]

最终比特集结果:通过与删除比特集结合后,最终结果比特集为 [1, 0, 1, 0, 0, 0, 0, 0],表示实体 [1, 3] 会被查询到。

Step 2:查询 time_travel = 250 时的数据
  • 过滤条件:primary_keys 为 [1, 3, 5, 7] 满足筛选条件,因此初始 filter_bitset 仍然为 [1, 0, 1, 0, 1, 0, 1, 0]
  • 时间点判断:在时间戳 ts = 250 时,所有实体都已经插入,因此比特集不变。
  • 删除判断:删除操作尚未发生,因此删除比特集依旧为 [0, 0, 0, 0, 0, 0, 0, 0]

最终比特集结果:最终比特集结果为 [1, 0, 1, 0, 1, 0, 1, 0],表示实体 [1, 3, 5, 7] 会被查询到。

Step 3:查询 time_travel = 350 时的数据
  • 过滤条件:初始 filter_bitset[1, 0, 1, 0, 1, 0, 1, 0]
  • 时间点判断:所有实体都已插入。
  • 删除判断:在时间戳 ts = 350 时,实体 [7, 8] 已被删除,因此删除比特集为 [0, 0, 0, 0, 0, 0, 1, 1]

最终比特集结果:最终比特集为 [1, 0, 1, 0, 1, 0, 0, 0],表示只有实体 [1, 3, 5] 仍然有效且符合条件。

示例二:并行处理中的应用

场景描述:在一个分布式系统中,有数千万级别的实体数据,用户需要同时进行属性筛选和数据删除操作。在这种情况下,多个比特集可以并行操作来提升性能。

  • 属性筛选:根据查询条件,生成初始 filter_bitset,标记哪些实体符合筛选条件。
  • 数据删除:对已删除实体生成 delete_bitset,标记哪些实体在查询时应被忽略。
  • 布尔逻辑运算:通过 OR、AND 等布尔操作,结合多个比特集结果,最终生成符合要求的实体集合。

通过并行化操作,各个比特集之间的布尔逻辑运算可以大幅提升性能,避免对每个实体逐个判断和处理。

示例三:稀疏数据表示中的应用

场景描述:在一个权限管理系统中,系统需要管理上百万用户的访问权限,涉及到大量布尔类型的数据,如用户是否拥有某个模块的访问权限。通过比特集,可以高效存储这些权限数据,避免浪费存储空间。

  • 存储效率

每个用户的权限用比特集表示,1 表示有权限,0 表示无权限。

  • 高效查询:在查询用户权限时,通过比特集可以快速筛选出哪些用户拥有某些模块的访问权限,提升查询性能。

总结

比特集是一种高效的工具,在 Milvus 中用于实现属性过滤、数据删除和时间旅行查询等功能。通过其紧凑的存储方式和高效的布尔逻辑操作,比特集可以帮助系统快速处理大规模数据查询和更新操作。无论是需要管理大量数据的删除状态,还是进行复杂的并行计算和时间旅行查询,比特集都能为开发者提供强大的支持。

这些应用示例展示了比特集在实际操作中的优势,特别是在处理大规模数据、查询优化和并行计算中的重要性。


http://www.ppmy.cn/server/125284.html

相关文章

Java研学-BootStrapTable插件

一 列表展示 官方Bootstrap Table参考文档 1 Bootstrap Table相关的CSS和JS文件 <!-- bootstrap-table 表格插件 --> <link href"/js/bootstrap-table/bootstrap-table.min.css?v20210202" rel"stylesheet"/> <script src"/js/boo…

执行力怎么培养?

执行力怎么培养&#xff1f; 并行&#xff1a;适合在初期养成习惯&#xff0c;不抱对结果的期望天才就是强迫症&#xff1a;适合中期修身&#xff1a;适合高级 并行&#xff1a;适合在初期养成习惯&#xff0c;不抱对结果的期望 在你开始做任何事情的时候&#xff0c;不要一开…

【30天玩转python】Web开发(Flask/Django)

Web开发&#xff08;Flask/Django&#xff09; Python 在 Web 开发领域非常流行&#xff0c;拥有多个强大的 Web 框架&#xff0c;其中最受欢迎的两个是 Flask 和 Django。本篇文章将介绍 Flask 和 Django 的基本功能、区别&#xff0c;以及如何使用它们来快速构建 Web 应用。…

WITS核心价值观【创新】篇|系统进化论 解锁新纪元

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度&#xff0c;致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度&#xff0c;透过数字创新实践多市场的跨境交付&#xff0c;助客户保持市场领先地位。以追求卓越的不懈精神&#xf…

虚谷中使用PL/SQL改变模式下所有表的大小写

一、将表名转换为小写 1、原理和思路 首先&#xff0c;我们需要查询出指定模式下的所有表名&#xff0c;在xugu中&#xff0c;数据字典dba_tables包含了当前库下的所有表信息&#xff0c;我们可以使用游标&#xff08;CURSOR&#xff09;来遍历这些表名。 2、代码示例如下&am…

在线点餐新体验:Spring Boot 点餐系统

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统&#xff0c;它彻底改变了过去传统的…

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码&#xff0c;限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改&#xff0c;抓取上传数据包&#xff0c;并且修改 Content-Type 3.服务端检测&#xff08;目录路径检测&#xff09; 对目…

事件和委托的悲伤故事

小强的故事 从前的从前&#xff0c;有一个村子&#xff0c;叫双空函数村&#xff0c;各个不同的函数相互帮衬&#xff0c;幸福而稳定的劳作着。 虽然村子里每个函数都是空参空返回&#xff0c;但每个函数脑子里都装着不一样却一生注定的指令。&#xff08;即程序开始编译之后…