用Rust编写的快速全文搜索引擎库
如果你正在寻找Elasticsearch或Apache Solr的替代品,请查看Quickwit,我们基于Tantivy构建的分布式搜索引擎。
Tantivy更接近于Apache Lucene,而不是Elasticsearch或Apache Solr,因为它不是一个现成的搜索引擎服务器,而是一个可用于构建此类搜索引擎的crate。
事实上,Tantivy的设计strongly受到了Lucene的启发。
基准测试
以下基准测试详细分析了不同类型的查询/集合的性能。
根据查询的性质和负载,你的实际性能可能会有所不同。
有关基准测试的详细信息可以在这个仓库中找到。
特性
- 全文搜索
- 可配置的分词器(支持17种拉丁语言的词干提取),并有第三方支持中文(tantivy-jieba和cang-jie)、日语(lindera、Vaporetto和tantivy-tokenizer-tiny-segmenter)以及韩语(lindera + lindera-ko-dic-builder)
- 高速(查看 :racehorse: :sparkles: 基准测试 :sparkles: :racehorse:)
- 极短的启动时间(<10ms),非常适合命令行工具
- BM25评分(与Lucene相同)
- 自然语言查询(例如
(michael AND jackson) OR "king of pop"
) - 短语查询搜索(例如
"michael jackson"
) - 增量索引
- 多线程索引(在我的台式机上索引英文维基百科不到3分钟)
- Mmap目录
- 当平台/CPU包含SSE2指令集时,使用SIMD整数压缩
- 单值和多值u64、i64和f64快速字段(相当于Lucene中的doc values)
&[u8]
快速字段- 文本、i64、u64、f64、日期、IP、布尔值和层次化分面字段
- 压缩文档存储(LZ4、Zstd、无压缩)
- 范围查询
- 分面搜索
- 可配置的索引(可选的词频和位置索引)
- JSON字段
- 聚合收集器:直方图、范围分桶、平均值和统计指标
- 带删除功能的LogMergePolicy
- 搜索器预热API
- 带有马的俏皮logo
非功能特性
分布式搜索超出了Tantivy的范围,但如果你在寻找这个功能,可以查看Quickwit。
入门
Tantivy在稳定版Rust上运行,支持Linux、macOS和Windows。
- Tantivy的简单搜索示例
- tantivy-cli及其教程 -
tantivy-cli
是一个实际的命令行界面,可以让你方便地创建搜索引擎、索引文档,并通过CLI或带有REST API的小型服务器进行搜索。它会指导你在几分钟内建立并运行一个维基百科搜索引擎。 - 最新发布版本的参考文档
我如何支持这个项目?
有很多方式可以支持这个项目。
- 使用Tantivy并在Discord上或通过电子邮件(paul.masurel@gmail.com)告诉我们你的体验
- 报告错误
- 写一篇博客文章
- 通过提问或提交PR来帮助完善文档
- 贡献代码(你可以加入我们的Discord服务器)
- 在你周围谈论Tantivy
贡献代码
我们使用GitHub Pull Request工作流:在开启PR时引用GitHub ticket和/或包含全面的提交信息。 随时更新CHANGELOG.md,加入你的贡献。
分词器
在为tantivy实现分词器时,请依赖tantivy-tokenizer-api
crate。
本地克隆和构建
Tantivy在稳定版Rust上编译。 要检出并运行测试,你可以简单地运行:
git clone https://github.com/quickwit-oss/tantivy.git
cd tantivy
cargo test
使用Tantivy的公司
常见问题
我可以在其他语言中使用Tantivy吗?
- Python → tantivy-py
- Ruby → tantiny
你也可以在GitHub上找到其他绑定,但它们的维护可能不太积极。
有哪些Tantivy的使用实例?
平均来说,Tantivy比Lucene快多少?
- 根据我们的搜索延迟基准测试,Tantivy大约比Lucene快2倍。
tantivy支持增量索引吗?
- 是的,支持。
如何编辑文档?
- tantivy中的数据是不可变的。要编辑文档,需要删除该文档并重新索引。
在索引过程中,我的文档何时可被搜索?
- 当在
IndexWriter
上调用commit
后,文档将可被搜索。现有的IndexReader
也需要重新加载以反映这些变化。最后,这些变化只对新获取的Searcher
可见。