A Day in the Life

SQLiteやDuckDBで日本語全文検索をVaporettoを組み込んで実現する

各種エージェントの台頭により、サーバレスに動作しローカルファイルとして保存でき、永続化可能な組み込みデータベースのSQLiteやDuckDBへの注目を感じる昨今ですね。これらDBでの全文検索(FTS)の日本語対応ってどんなものなのだろうかと調べると、trigram での検索はできるものの、日本語語彙に特化した検索は標準できないようでした。

Linderaを使うアプローチもあるようですが、今回は Rust で実装されている軽量高速なトークナイザの Vaporetto を組み込んで動く拡張機能を作ってみました。

Vaporetto は、点予測法で文字境界を線形分類モデルで判定するため、辞書なしモデル(辞書ありモデルもある)で利用可能なため、サイズを小さく保つこともできるので用途によっては便利そうですね。ので、Web ブラウザー上で完結する、DuckDB + Vaporetto の組み合わせで bm25 関連度スコアでソートする全文検索を行える技術デモを作ってみました。ただ対象テキストの件数が少ないと、全文検索(件数が増えても高速に検索が可能)やbm25(単語の出現回数や文章長を加味)の嬉しさが少ないのですが…。

また例えば、この blog(secon.dev) の記事検索を SQLite + FTS5 + vaporetto の組み合わせで試しに作ってみたところ、約2700記事の bm25 検索で、大体3ms前後の速度で検索が可能になりました。

secon. dev検索例

SQLite, DuckDB などでカジュアルに日本語全文検索ができるようになるので、使い所がハマれば便利そうな気がしています。

記事の一覧 >

関連するかもエントリー

2010-07-14
sqlite2 の DB を sqlite3 の DB に変換むかーしの俺俺プロジェクトがあまりに遅すぎたので調査したら当時は sqlite2 使っていてそれが超重かった。試しに sqlite3 に変換したらそれだけであからさまに速くなった…。すごいぞ sqlite3。コンバート...
sqlite2 の DB を sqlite3 の DB に変換むかーしの俺俺プロジェクトがあまりに遅すぎたので調査したら当時は sqlite...
情報検索モデルで最高性能(512トークン以下)・日本語版SPLADE v2をリリース
2024年は情報検索技術に興味を持ち、情報検索関連のモデル作りを趣味で行っている @hotchpotch (セコン)です。Transfomer は割と適当にやっても、いい感じに学習してくれるので、楽しいですね。というわけで、日々部屋でご家庭用GPUを回し、以前公開した情報検索に特...
2024年は情報検索技術に興味を持ち、情報検索関連のモデル作りを趣味で行っている @hotchpotch (セコン)です。Transfome...
高性能な日本語SPLADE(スパース検索)モデルを公開しました
文章検索用途で高性能なSPLADE(スパースベクトル)モデルの日本語版を作成し、公開しました。大量の文章からの検索タスク(retrieval)や、質問に関連する文章を並べ替えるリランキングタスクで、最近の高性能密ベクトルモデルである multilingual-e5-large、r...
文章検索用途で高性能なSPLADE(スパースベクトル)モデルの日本語版を作成し、公開しました。大量の文章からの検索タスク(retrieval...