2个版本
0.1.1 | 2024年6月19日 |
---|---|
0.1.0 | 2024年2月25日 |
#185 在 数据库实现
36KB
721 行
Tantivy的远程目录
tantivy-uffd
是一个基于userfaultfd的远程目录实现,用于 tantivy 搜索引擎库。使用此包,您可以在不本地复制搜索索引的情况下运行 tantivy,而是通过 HTTP 范围请求按需获取片段。这与 tantivy-wasm 的概念类似,但不在浏览器中运行。它适用于您可能想要将搜索索引与多个 tantivy 服务实例一起定位,或者您想要选择极端的成本节约措施并在对象存储上托管静态索引的情况。
要求
此包应在 Linux >= 5.7 上运行。您指向 tantivy-uffd
的端点必须支持 HTTP GET 和 HEAD 请求,并且必须支持范围请求。我不确定如果它不支持范围请求会发生什么。由于 tantivy-uffd
无法识别并意外下载整个文件,您可能会遇到 OOM。执行使用 tantivy-uffd
的程序的用户应具有对 /dev/userfaultfd
的读写访问权限。如果不是这种情况,当目录打开时,您将遇到权限错误。
注意事项
此包中有大量不安全代码,如果远程目录被丢弃,则应假定存在未定义的行为。应该可以修复此问题,但我尚未这样做。即使您完全按预期使用它,由于此包最初是为 Airmail 项目作为概念证明编写的,而没有先验知识表明它甚至可以工作,因此在阴影中可能仍然存在相当多的未定义行为。
优化
在 tantivy 上启用 quickwit
功能将显著提高远程目录的性能,同时使用适当的 spawn_blocking
操作并行获取文档也将如此。通过估算到索引主机的带宽-延迟产品,可以找到 CHUNK_SIZE 的良好起点。我为 Airmail 使用 1-2MiB。我可能会考虑为基于 fst
的索引减少这个值。如果你对一个包含大量析取的远程索引进行搜索,在搜索主查询之前并行启动对析取每个子句的搜索可能很有帮助。这可能会导致索引产生大量不必要的流量,但 userfaultfd 页面故障会暂停整个线程,tantivy 执行许多依赖性读取,因此对析取每个子句的搜索启动了大量的线程,这些线程将基本上为主线程执行预读。这可以大大加快速度。
我还(反直觉地)建议配置用户界面代码在键入查询时积极发送查询,因为这会预热缓存,减少感知延迟。《Airmail demo》对部分查询请求有 100ms 的去抖(结果被丢弃),对最终查询(结果显示给用户)有 500ms 的去抖。如果你有多余的 CPU 周期,这效果非常好。
替代方案
你可以通过在 FileHandle::read_bytes
中按需获取切片来实施自己的远程目录,但当你收到跨越块边界的 read_bytes
请求时,你将最终需要缓存块并执行大量这些块的副本。这对 Airmail 来说最终成为不可接受的性能成本。
许可证
双重 MIT/Apache 2.0,任选其一。此软件包包含一些来自 tantivy 的代码,即 query_len.rs
。版权声明、作者文件和原始 MIT 许可证已保留。
依赖项
27–43MB
~688K SLoC