🐡

【実践】PostgreSQLで手軽に実現する日本語全文検索 - Rustで作る形態素解析拡張機能

2024/12/14に公開

PostgreSQLで手軽に実現する日本語全文検索 - Rust製形態素解析拡張

📌 この記事について

PostgreSQLで日本語の類似検索を実装したい、でも外部サービスは使いたくない...そんな方向けに、PostgreSQL内で完結する形態素解析拡張機能をRustで作ってみました。

https://github.com/cystal-dot/morpheme_funcs

💡 morpheme-funcsとは

PostgreSQLで形態素解析による日本語の類似検索を実現する拡張機能です。

主な機能

  • 文字列の形態素解析: to_morpheme_array(text)
  • 類似度スコアの計算: calculate_similar_score(text, text)

🔍 使い方

1. 拡張機能のインストール

CREATE EXTENSION morpheme_funcs;

2. 形態素解析の実行

SELECT to_morpheme_array('形態素解析機能');
-- 結果:{'形態素','解析','機能'}

3. 類似度スコアの計算

SELECT calculate_similar_score('大ねじ小ねじ', 'ねじ');
-- 結果: 0.3333333333333333

📊 実践例:商品検索システム

ginインデックスを使うことでより高速な検索も実現できます

-- 商品テーブルの準備
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT
);

-- 類似検索
SELECT 
    name, 
    calculate_similar_score(name, '鉛筆') as score
FROM products
WHERE calculate_similar_score(name, '鉛筆') > 0.3
ORDER BY score DESC
LIMIT 10;

ポイント

  • RustとpgrxによるPostgreSQL拡張機能の実装
  • 形態素解析を使った類似度計算

📝 まとめ

morpheme-funcsを使うことで:

  • PostgreSQLで形態素解析が可能に
  • シンプルな関数で類似検索を実装
  • 外部サービスに依存しない設計

👨‍💻 開発を通じて感じたこと

PostgreSQL拡張機能開発の可能性

  • PostgreSQL上で動く関数を驚くほど簡単に作成できました
  • pgrxを使うことで、Rustの強力な機能をDBに直接組み込めます
  • 並列処理による高速化など、まだまだ色々な可能性を感じています

Discussion