#全文搜索 #搜索引擎 #搜索 #文本搜索 #读写

tantivy-object-store

针对对象存储(S3、GCS 等)的 tantivy 目录实现

1 个不稳定版本

0.1.0 2023 年 8 月 14 日

#1370文件系统

Apache-2.0

27KB
456

tantivy 对象存储

本仓库包含了一个使用 object_store::ObjectStore 实现的 tantivy::directory::Directory

该实现支持读写操作,但不支持锁定或文件监视。索引构建过程负责确保没有并发索引写入器。

与 tantivy 的目录实现相比的一些显著行为差异

版本控制

Tantivy 使用名为 meta.json 的文件,这是一个由组成索引的所有文件组成的列表,实际上是在跟踪索引的快照。然而,vanilla tantivy 不支持版本控制,这意味着每次更新索引时,meta.json 都会被覆盖。这个 PR 允许调用者设置读取版本和写入版本。这些版本号在调用者尝试原子读取或原子写入时附加到文件名末尾。

写时复制(CoW)

在创建 ObjectStoreDirectory 时,用户可以设置 read_versionwrite_version。当用户调用 atomic_read 时使用 read_version。我们不会读取 meta.json,而是尝试读取 meta.json.{read_version}。同样,当用户调用 atomic_write 时,我们将尝试写入 meta.json.{write_version}

注意:`write_version` 的优先级高于 `read_version`。这意味着,第一次写入后,`atomic_read` 将从 `meta.json.{write_version}` 读取,而不是 `meta.json.{read_version}`。这是必需的,因为 tantivy 在索引过程中修改了 `meta.json` 文件多次,这里的 CoW 实现需要具有写后读一致性。

索引重载

此实现不支持重载。如果注册了 `watch` 回调,则回调将永远不会被调用。用户目前需要通过其他机制来处理重载。

可能可以使用类似对象存储的本地变更通知来触发重载,但这将是未来的工作。

删除

由于 tantivy 尝试在索引期间进行垃圾收集和合并索引文件,我们不得不将 `delete` 操作更改为无操作。这是因为我们不希望 tantivy 垃圾收集旧版本的文件,因为这些文件可能被其他读取者使用。我们将单独实现垃圾收集过程。

线程

此实现包含一个用于运行 IO 任务的 `tokio::Runtime`。这意味着,从另一个 tokio 运行时调用此实现中的函数时,调用者应始终使用 `tokio::task::spawn_blocking`,以便将任务调度在无 tokio 运行时的线程上。(这是必需的,因为嵌套 tokio 运行时会引发恐慌)

并发安全性

此实现在单个实例内是并发安全的,因为 `atomic_read|write` 机制是返回的 trait 对象中的锁对象。

性能

待定

依赖项

~29–43MB
~681K SLoC