在 Milvus 的 官方文档 中,时间旅行和属性过滤是通过位图过滤(Bitset Filtering)实现的高级功能。这些功能的核心原理是利用位图(Bitset)来高效筛选目标数据点,从而提高检索的效率和灵活性。


时间旅行 (Time Travel) 的原理

  1. 数据版本控制:
    • 每个插入或更新的数据操作都会被赋予一个唯一的时间戳(通常是逻辑时钟或物理时钟)。
    • 数据被分为多个快照(Snapshot),每个快照表示某一时间点的数据状态。
  2. 位图过滤:
    • 在检索时,Milvus 使用位图标记哪些数据符合时间点的要求。
    • 比如,若查询时间为 T,则只选择时间戳 ≤ T 的数据,其他数据通过位图排除。
  3. 性能优化:
    • 由于位图是按位操作,过滤速度非常快,特别是在大规模数据场景中,位图的空间占用也非常低。

属性过滤的原理

属性过滤允许用户根据字段属性筛选符合条件的数据点。例如,筛选出某一范围内的数据或满足特定属性值的数据。

    • 在向量数据之外,每个数据点还可以存储额外的字段属性(例如 age, status 等)。
    • 这些属性被单独存储在列式存储引擎中,以便快速检索。
  1. 位图生成:
      • 在实际检索中,Milvus 会同时应用属性过滤的位图和时间旅行的位图,通过按位与操作 (AND) 获得最终的有效数据点集合。
    • 效率提升:

        结合示例

        假设有如下数据集:

        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
        • 时间旅行查询:查询时间点为 1002,位图生成如下:

          [1, 1, 0]  // 只选择时间戳 ≤ 1002 的数据点。
          
        • 属性过滤查询:筛选 Age > 30 的数据点,位图生成如下:

          [0, 1, 0]  // 只选择 `Age > 30` 的数据点。
          
        • 联合查询:结合时间旅行和属性过滤:

          [1, 1, 0] AND [0, 1, 0] = [0, 1, 0]
          

        最终的检索结果只包含 ID 为 2 的数据点。


        • 时间旅行依赖于时间戳和快照机制,通过位图快速筛选指定时间点的数据。
        • 属性过滤基于字段属性条件生成位图,用于高效筛选符合条件的数据点。
        • 两者结合时,使用按位操作实现多条件筛选,同时保持了高性能和低存储成本。

        更多细节可以参考 Milvus Bitset 文档。如需进一步的代码示例或实践操作,可以告知具体场景!