在 Milvus 的 官方文档 中,时间旅行和属性过滤是通过位图过滤(Bitset Filtering)实现的高级功能。这些功能的核心原理是利用位图(Bitset)来高效筛选目标数据点,从而提高检索的效率和灵活性。
时间旅行 (Time Travel) 的原理
- 数据版本控制:
- 每个插入或更新的数据操作都会被赋予一个唯一的时间戳(通常是逻辑时钟或物理时钟)。
- 数据被分为多个快照(Snapshot),每个快照表示某一时间点的数据状态。
- 位图过滤:
- 在检索时,Milvus 使用位图标记哪些数据符合时间点的要求。
- 比如,若查询时间为
T,则只选择时间戳 ≤T的数据,其他数据通过位图排除。
- 性能优化:
- 由于位图是按位操作,过滤速度非常快,特别是在大规模数据场景中,位图的空间占用也非常低。
属性过滤的原理
属性过滤允许用户根据字段属性筛选符合条件的数据点。例如,筛选出某一范围内的数据或满足特定属性值的数据。
- 在向量数据之外,每个数据点还可以存储额外的字段属性(例如
age,status等)。 - 这些属性被单独存储在列式存储引擎中,以便快速检索。
- 位图生成:
- 在实际检索中,Milvus 会同时应用属性过滤的位图和时间旅行的位图,通过按位与操作 (
AND) 获得最终的有效数据点集合。
- 在实际检索中,Milvus 会同时应用属性过滤的位图和时间旅行的位图,通过按位与操作 (
- 效率提升:
时间旅行查询:查询时间点为
1002,位图生成如下:[1, 1, 0] // 只选择时间戳 ≤ 1002 的数据点。属性过滤查询:筛选
Age > 30的数据点,位图生成如下:[0, 1, 0] // 只选择 `Age > 30` 的数据点。联合查询:结合时间旅行和属性过滤:
[1, 1, 0] AND [0, 1, 0] = [0, 1, 0]- 时间旅行依赖于时间戳和快照机制,通过位图快速筛选指定时间点的数据。
- 属性过滤基于字段属性条件生成位图,用于高效筛选符合条件的数据点。
- 两者结合时,使用按位操作实现多条件筛选,同时保持了高性能和低存储成本。
结合示例
假设有如下数据集:
ID Embedding Timestamp Age Status 1 [0.1, 0.2, …] 1001 25 Active 2 [0.3, 0.5, …] 1002 32 Inactive 3 [0.4, 0.7, …] 1003 28 Active 最终的检索结果只包含 ID 为 2 的数据点。
更多细节可以参考 Milvus Bitset 文档。如需进一步的代码示例或实践操作,可以告知具体场景!
No comments yet.