Rustで書かれた高速なフルテキスト検索エンジンライブラリ
紹介
- Tantivyは、Apache Luceneの設計を強く参考にした検索エンジンライブラリ。
- ElasticsearchやApache Solrの代替として利用できるQuickwitという分散検索エンジンもある。
- Tantivyは検索エンジンサーバーではなく、検索エンジンを構築できるクレート。
ベンチマーク
- さまざまなクエリ/コレクションタイプに対する性能ベンチマークを提供。
- クエリの性質や負荷によって性能は変わり得る。
主な機能
- フルテキスト検索: 多様な言語に対するトークナイザーをサポート。
- 高速性能: 高速な起動時間とマルチスレッドのインデキシングをサポート。
- BM25スコアリング: Luceneと同じスコアリング方式。
- 自然言語クエリ: 複雑なクエリも自然に処理可能。
- 範囲クエリおよび階層的ファセットフィールド: さまざまなデータ型をサポート。
- 圧縮ドキュメントストア: LZ4、Zstd など多様な圧縮方式をサポート。
- JSONフィールドおよび集計コレクター: ヒストグラム、範囲バケット、平均および統計メトリクスをサポート。
非機能
- 分散検索はTantivyの範囲外。分散検索が必要ならQuickwitを参照すること。
はじめに
- Tantivyは安定版Rustで動作し、Linux、macOS、Windowsをサポート。
- tantivy-cli: 検索エンジンを簡単に作成し、インデキシングと検索を行えるコマンドラインインターフェースを提供。
- 参考ドキュメント: 最新リリース版の参考ドキュメントを提供。
プロジェクト支援方法
- Tantivyを使い、経験を共有する。
- バグレポートを提出する。
- ブログ記事を書く。
- ドキュメント作成を支援する。
- コードに貢献する。
コードへの貢献
- GitHub Pull Request ワークフローを使用。
- 貢献時にはGitHubチケットを参照し、包括的なコミットメッセージを書くこと。
FAQ
- 他言語サポート: Python、Ruby など多様な言語バインディングを提供。
- 利用例: seshat、tantiny、lnx などさまざまなプロジェクトで使用。
- 速度比較: Luceneより約2倍高速。
- 増分インデキシング対応: はい。
- ドキュメント編集: ドキュメントは不変。削除後に再インデックスが必要。
- インデキシング中に検索可能になる時点:
commit 呼び出し後に検索可能。
GN⁺の意見
- Rustベースの高速性能: Rustの性能と安全性を活かした高速な検索エンジンで、性能が重要なプロジェクトに適している。
- 多言語対応: Python、Ruby など多様な言語バインディングを通じて、さまざまな環境で利用可能。
- 増分インデキシング: 大規模データ処理時に有用な機能。
- ドキュメント不変性: データの一貫性を保てる一方で、ドキュメント修正時には再インデックスが必要。
- Quickwitとの連携: 分散検索が必要な場合はQuickwitを併用するとよい。
1件のコメント
Hacker Newsのコメント
プロジェクト経験の共有: 古い Python2 の AppEngine コードベースを置き換えるためにこのライブラリを使って <a href="https://progscrape.com" rel="nofollow">progscrape.com</a> を再構築した。ライブラリは非常に高速で、Raspberry Pi で 100 万件のストーリーを数秒でインデックス化できた。CPU 使用率は非常に低く、検索性能も優れている。
ParadeDB と Tantivy: 最近 ParadeDB(Postgres 拡張)で Tantivy を見つけた。高性能な分析のために Postgres を拡張するのに使われている。
Quickwit と Clickhouse: 多言語検索プロジェクトで Quickwit と Clickhouse を組み合わせた性能が非常に良かった。特に中国語、日本語、韓国語の検索に有用だった。
to_tsvector の限界: PostgreSQL の to_tsvector は特定のユースケースにあまり合わなかった。Tantivy の成功を祈っている。
Quickwit の本番環境デプロイ: Quickwit を使って数十億個のオブジェクトをインデックス化しており、インデックス速度とクエリ遅延時間は競争力がある。コンピュートとストレージの分離が非常に役立った。
Tantivy の性能: Tantivy の性能と創業者たちの努力に感銘を受けた。チームの成功を確信している。
Etsy/Hound のトライグラム検索: Russ Cox の正規表現マッチングに基づく Go 言語のトライグラム検索インデックスを使った経験がある。
Tantivy を選んだ理由: Elasticsearch のリソース消費に失望して Tantivy を選んだ。Rust でプロジェクトを進めたかったし、Tantivy の性能とドキュメントも優れていた。
Lucene と Solr のアップグレード問題: Lucene と Solr はインデックスのアップグレード対応が不十分だ。多くの大規模プロジェクトでは再インデックス化が非常に高コストで、ときには不可能なこともある。
フィールド追加・削除の限界: Tantivy ではフィールドを追加または削除できず、すべてのデータを別の検索インデックスへ再インデックス化しなければならない。
Meilisearch の代替: Meilisearch のテレメトリ問題から、代替として Tantivy を見つけた。設定は簡単そうだ。
LanceDb と Tantivy: LanceDb というベクターデータベース製品では、Tantivy を使ってフルテキスト検索機能を提供している。現在は Python バインディング経由でしか使えないが、Rust バインディングを実装しようとしている。