全文検索
PostgreSQL の全文検索の仕組みとは?
全文検索は、完全一致の部分文字列ではなく単語によってドキュメントを照合する機能で、tsvector、tsquery、@@ 演算子を使います。GIN インデックスを使うと高速になります。
PostgreSQL に組み込まれた全文検索は、ドキュメントをトークンに分解し、それらを語彙素(lexeme)に正規化して(たとえば単語を語幹に還元して)、結果を tsvector として保存します。検索クエリは tsquery で、@@ 演算子はドキュメントがそれに一致するかどうかを判定します。
english などのテキスト検索設定によって、テキストを単語に分割する方法、無視する一般的な単語、語幹処理の方法が決まります。ts_rank などのランキング関数を使うと、結果を関連度順に並べられます。検索を高速にするには、tsvector の式に GIN インデックスを作成し、クエリでもインデックスと同じ設定を使ってください。
例
この例では、記事のテキストを tsvector としてインデックス化し、search と postgres の両方を含む行を検索します。一致するのは記事 1 だけです。
CREATE TABLE articles (id int PRIMARY KEY, body text NOT NULL);
INSERT INTO articles VALUES
(1, 'Postgres supports full text search with tsvector and tsquery'),
(2, 'Indexes make lookups fast');
CREATE INDEX articles_fts ON articles USING gin (to_tsvector('english', body));
SELECT id
FROM articles
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'search & postgres');拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。