时光旅行参数介绍(timetravel_ref)

时光机搜索 Timetravel

本主题详细介绍了时间旅行功能。有关如何使用此功能的更多信息,请参见使用时间旅行搜索

概览

时间旅行是一种功能,它允许您在指定时间段内访问历史数据,从而可以查询、恢复和备份过去的数据。通过时间旅行,您可以:

  • 搜索或查询已删除的数据。

  • 恢复已删除或已更新的数据。

  • 备份特定时间点之前的数据。

与传统数据库使用快照或保留数据来支持时光旅行功能不同,Milvus向量数据库为所有数据插入或删除操作维护时间线并采用时间戳机制。这意味着您可以在搜索或查询中指定时间戳,以检索过去特定时间点的数据,从而显著降低维护成本。

Milvus中的时间戳

在Milvus向量数据库中,每个实体都有自己的时间戳属性。所有数据操作语言(DML)操作,包括数据插入和删除,都会使用时间戳标记实体。例如,如果您一次性插入了多个实体,则此批数据将被标记为时间戳,并共享相同的时间戳值。

DML操作

当代理接收到数据插入或删除请求时,它也会从根协调器(root coord) (opens in a new tab)获取时间戳。然后,代理将时间戳作为插入或删除数据的附加字段添加。时间戳是一种数据字段,就像主键(pk)一样。时间戳字段与集合的其他数据字段一起存储。

当您将集合加载到内存中时,集合中的所有数据,包括它们相应的时间戳,都会被加载到内存中。

使用时间旅行进行搜索或查询

travel_timestamp是由您指定的时间戳,用于指示在此时间点之前需要在数据视图上进行查询或搜索。类似于传统数据库,您可以将travel_timestamp视为数据快照,查询或搜索需要在此快照中的数据上进行。

在搜索期间,如果代理收到的搜索请求包含参数travel_timestamp,则该参数的值将传递给支持并发插入、删除、查询、索引加载、监视和统计内存中段数据的执行引擎segcore (opens in a new tab)。segcore通过时间戳过滤搜索结果。换句话说,您可以将Time Travel功能视为使用travel_timestamp值限制的数据过滤条件进行数据过滤。这意味着时间戳值大于travel_timestamp的数据将被过滤掉,并且不会参与搜索或查询过程。过滤表达式为data.timestamp <= travel_timestamp

时间戳的位集

具体来说,在knowhere中,搜索和带过滤条件的查询都是通过位集来实现的。而时间旅行背后的机制也是通过位集实现的。

当进行搜索时,segcore获取一个位集,指示时间戳是否满足条件。然后,Milvus根据这个位集来判断要查询或搜索的数据范围。

封存段

当加载封存段时,Milvus将所有时间戳加载到内存中,segcore在时间戳字段上构建一个索引TimestampIndex。该索引包含该封存段的最小和最大时间戳值的信息,以及该封存段中时间戳的偏移量和行号。

当你使用时间旅行进行搜索时,Milvus首先根据TimestampIndex中最小和最大时间戳过滤密封段:

  • 如果你设置的travel_timestamp值大于段的最大时间戳,则表示该段中的所有数据都符合要求。因此,该段数据的位图标记为1。

  • 如果你设置的travel_timestamp值小于段的最小时间戳,则表示该段中的数据不符合要求。因此,该段数据的位图标记为0。

  • 如果你设置的travel_timestamp值介于段的最大和最小时间戳之间,Milvus逐个比较段中的时间戳,并相应地生成位图。在位图中,如果数据符合要求,则标记为1;否则标记为0。

Time_travel (opens in a new tab)

Time Travel illustration.

增长段

对于增长的片段,您不需要将收集加载到内存中。所有插入的数据都存在于内存中,并附带时间戳字段。增长片段中的数据按照时间戳的顺序排序。插入新数据时,它们按照它们的时间戳顺序添加到片段中。分段数据在segcore内存中以相同的方式组织。

当您使用时间旅行搜索时,Milvus使用二进制搜索来查找第一个偏移量,或具有时间戳值大于您为travel_timestamp参数设置的值的行号数据。然后,包括过滤和向量相似度搜索在内的后续操作在这些偏移量的范围内进行。

下一步操作

在了解了 Milvus 的时间旅行功能之后,您可能还想: