Gitrend
🔥

Postgres×BM25!爆速全文検索、見つけた!

C 2026/2/8
Summary
皆さん、PostgreSQLでこんなにもパワフルな全文検索ができるって知ってましたか? BM25スコアリングで関連度バッチリ! これマジで便利すぎてもう手放せないっすよ!

概要:なにこれ凄い?

うおおお!皆さん、このリポジトリ見ました!? timescale/pg_textsearch ですよ!TimescaleDBでおなじみのTimescaleが、まさかPostgreSQLネイティブでBM25全文検索エクステンション出してくるなんて…正直鳥肌が立ちましたね! 今までPostgresで本格的な全文検索って言ったら、ts_rank 使うか、ElasticsearchとかSolrみたいな外部サービスと連携するのが主流だったじゃないですか。でも、外部サービスって導入コストとかデータ同期の面倒くささとか、結構悩ましい問題が多かったんですよね。 それがですよ!この pg_textsearch はPostgresのC言語拡張として提供されてて、あのBM25アルゴリズムで関連度をランキングしてくれるんです!つまり、データはPostgresに集約したまま、超高速で賢い全文検索ができちゃうってこと!これ、もうゲームチェンジャーですよ、マジで。

ここが推し!

サクッと試そう(使用例)

-- 1. 拡張をインストール
CREATE EXTENSION pg_textsearch;

-- 2. 検索対象テーブルとデータの準備
CREATE TABLE my_docs (id SERIAL PRIMARY KEY, content TEXT);
INSERT INTO my_docs (content) VALUES
('PostgreSQLは強力なデータベースシステムです。'),
('BM25は関連度をランキングするアルゴリズムです。'),
('全文検索をもっと速く、もっと賢く。');

-- 3. 検索可能なTSVECTORカラムとGINインデックスを作成
ALTER TABLE my_docs ADD COLUMN ts_vector TSVECTOR;
UPDATE my_docs SET ts_vector = textsearch.pg_textsearch_tsv(content);
CREATE INDEX idx_my_docs_ts_vector ON my_docs USING GIN (ts_vector);

-- 4. BM25で関連度を付けて検索!
SELECT id, content, textsearch.bm25(ts_vector, textsearch.query_bm25('データベース')) AS relevance_score
FROM my_docs
WHERE ts_vector @@ textsearch.query_bm25('データベース')
ORDER BY relevance_score DESC;

ぶっちゃけ誰向け?

まとめ

いやー、これは本当にすごい拡張が出てきましたね!PostgreSQLだけでBM25ベースの高品質な全文検索ができるようになるなんて、まさに夢のようじゃないですか? 外部サービスに頼らざるを得なかった多くのエンジニアにとって、これは本当に救世主になると思います。導入も比較的簡単だし、パフォーマンスも期待できる。これからのPostgreSQLの可能性をまた一つ広げてくれる、そんな期待感でいっぱいです!みんなもぜひ試してみて、この感動を味わってほしいな!これからの開発が楽しみだね!