36个版本 (4个破坏性版本)

0.25.3 2023年1月13日
0.25.2 2023年1月13日
0.22.3 2022年12月7日
0.21.10 2022年12月5日
0.19.3 2022年10月31日

#310数据库实现

Download history 4/week @ 2024-03-14 8/week @ 2024-03-21 229/week @ 2024-03-28 1/week @ 2024-04-04 747/week @ 2024-06-06 102/week @ 2024-06-13

每月849次下载

MIT 协议

3.5MB
59K SLoC

Docs Build Status codecov Join the chat at https://discord.gg/MT27AG5EVE License: MIT Crates.io

Tantivy

Tantivy 是一个用Rust编写的 全文搜索引擎库

它在某种程度上更接近 Apache Lucene 而不是 ElasticsearchApache Solr,因为它不是一个现成的搜索引擎服务器,而是一个可以用来构建此类搜索引擎的crate。

Tantivy实际上在设计中受到了Lucene的强烈启发。

如果您正在寻找Elasticsearch或Apache Solr的替代品,请查看我们的基于Tantivy构建的搜索引擎 Quickwit

基准测试

以下 基准测试 对不同类型查询/集合的性能进行了分析。

根据查询的性质及其负载,性能可能会有所不同。

功能

  • 全文搜索
  • 可配置的分词器(17种拉丁语言支持词干提取)以及第三方对中文(tantivy-jiebacang-jie)、日文(linderaVaporettotantivy-tokenizer-tiny-segmenter)和韩文(lindera + lindera-ko-dic-builder)的支持
  • 快速(查看🐎 ✨ 基准测试 ✨ 🐎)
  • 启动时间短(<10ms),非常适合命令行工具
  • BM25评分(与Lucene相同)
  • 自然查询语言(例如:(michael AND jackson) OR "king of pop"
  • 短语查询搜索(例如:"michael jackson"
  • 增量索引
  • 多线程索引(在我的桌面上,索引英语维基百科只需不到3分钟)
  • Mmap目录
  • 当平台/CPU包含SSE2指令集时,使用SIMD整数压缩
  • 单值和多值u64、i64和f64快速字段(相当于Lucene中的doc值)
  • &[u8]快速字段
  • 文本、i64、u64、f64、日期和层次分面字段
  • 压缩文档存储(LZ4、Zstd、None、Brotli、Snap)
  • 范围查询
  • 分面搜索
  • 可配置的索引(可选的词频和位置索引)
  • JSON字段
  • 聚合收集器:直方图、范围桶、平均值和统计指标
  • 带删除的LogMergePolicy
  • 搜索器预热API
  • 带有马的马屁头像

非特性

分布式搜索不在Tantivy的作用范围内,但如果您正在寻找此功能,请检查Quickwit

入门指南

Tantivy在稳定版Rust上运行,并支持Linux、macOS和Windows。

我如何支持这个项目?

支持这个项目有很多方式。

  • 使用Tantivy并告诉我们您在Discord或通过电子邮件([email protected])中的体验
  • 报告错误
  • 写博客文章
  • 通过提问或提交PR来帮助文档
  • 贡献代码(您可以加入我们的Discord服务器
  • 在您周围谈论Tantivy

代码贡献

我们使用GitHub Pull Request工作流程:在打开PR时引用GitHub票据和/或包含一个全面的提交消息。

分词器

在为tantivy实现分词器时,依赖于tantivy-tokenizer-api包。

最小支持的Rust版本

Tantivy目前需要至少Rust 1.62或更高版本才能编译。

克隆和本地构建

Tantivy在稳定版Rust上编译。要检出并运行测试,您可以简单地运行

    git clone https://github.com/quickwit-oss/tantivy.git
    cd tantivy
    cargo build

运行测试

由于fail-rs,一些测试仅使用cargo test无法运行。要彻底运行测试,请运行./run-tests.sh

调试

您可能会发现使用调试器逐步执行程序很有用。

失败的测试

请确保您在最近一次运行cargo cleancargo testcargo build后没有运行,以确保target/目录存在。使用此bash脚本查找Tantivy最近一次调试构建的名称,并在rust-gdb下运行它

find target/debug/ -maxdepth 1 -executable -type f -name "tantivy*" -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | cut -d " " -f 3 | xargs -I RECENT_DBG_TANTIVY rust-gdb RECENT_DBG_TANTIVY

现在您已经进入 rust-gdb,您可以在匹配您源代码的行和方法上设置断点,并使用通常传递给 cargo test 的标志来运行调试可执行文件,如下所示

$gdb run --test-threads 1 --test $NAME_OF_TEST

示例

默认情况下,rustc 以调试模式编译 examples/ 目录中的所有内容。这使得您能够轻松创建示例来重现错误

rust-gdb target/debug/examples/$EXAMPLE_NAME
$ gdb run

使用 Tantivy 的公司

Etsy  Nuclia   Humanfirst.ai Element.io Nuclia   Humanfirst.ai    Element.io

常见问题解答

我可以在其他语言中使用 Tantivy 吗?

您还可以在 GitHub 上找到其他绑定,但它们可能维护得较少。

Tantivy 的一些使用示例是什么?

  • seshat:一个矩阵消息数据库/索引器
  • tantiny:用于 Ruby 的小型全文搜索引擎
  • lnx:具有 REST API 的可适应、容错搜索引擎
  • 以及 更多

Tantivy 与 Lucene 相比平均快多少?

tantivy 支持增量索引吗?

  • 是的。

我如何编辑文档?

  • tantivy 中的数据是不可变的。要编辑文档,需要删除文档并重新索引。

我的文档在索引过程中何时可以搜索?

  • 在调用 IndexWritercommit 方法后,文档将可搜索。现有的 IndexReader 也需要重新加载以反映这些更改。最后,更改仅对新获取的 Searcher 可见。

依赖项

~14–30MB
~438K SLoC