tsvectorとGINによる全文検索
tsvector列、GINインデックス、設定可能な全文検索辞書を使って、本番環境向けの全文検索を構築します。
「tsvectorとGINによる全文検索」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
部分文字列検索の先へ:単語を意識した検索
全文検索(FTS)は、語幹処理、ストップワード、ランキングなど、単語を理解します。PostgreSQLにはtsvector型とtsquery型を使った全文検索が組み込まれています。
tsvectorを構築する
ドキュメントを解析します。
SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2tsqueryを構築する
クエリを解析します。
SELECT to_tsquery('english', 'fox & jumping'); -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');マッチング:@@
ドキュメントをクエリと照合します。
SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery; -- tFTSのインデックス作成
tsvector列とGINインデックスを追加します。
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);クエリ実行
高速な絞り込み検索を行います。
SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;ts_rankによるランキング
ts_rankは、単語の出現頻度と位置に基づいて結果をスコアリングします。ts_rank_cdは位置を考慮したCover Densityを使用します。
SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;ts_headlineによるスニペット
一致した単語をハイライトして、マッチした断片を表示します。
SELECT ts_headline('english', body,
websearch_to_tsquery('english', $1),
'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);フレーズ検索
隣接する単語を検索します。
SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');複数フィールドのブースト
setweightを使い、本文よりタイトルに大きな重みを付けます。
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
setweight(to_tsvector('english', coalesce(body,'')), 'B')
) STORED;言語設定
english設定では、ストップワードや語幹処理などを定義します。PostgreSQLには多くの言語が用意されており、言語ごとに切り替えられます。
SELECT to_tsvector('turkish', 'Veritabanı performansı');組み込みFTSの限界
英語に近い言語や基本的なランキングには適しています。より高度な要件(BM25、ベクトル埋め込み、ファセット検索)には、Postgresと併せてElasticsearchまたはOpenSearchの利用を検討してください。
まとめ
PostgreSQLのFTSは、十分に実用的なデフォルトの選択肢です。
- tsvector + tsquery + @@によるマッチング
- 高速化のためのGINインデックス
- ユーザー入力向けのwebsearch_to_tsquery
- ランキングとハイライト表示を行うts_rank/ts_headline
クイックチェック
全文検索クエリで記事を高速に絞り込む必要があります。どのインデックスを使いますか?
AI チューターと学ぶ SQL — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 46
- レッスン
- 183
よくある質問
「tsvectorとGINによる全文検索」レッスンは無料ですか?
はい。「tsvectorとGINによる全文検索」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「tsvectorとGINによる全文検索」で何を学びますか?
tsvector列、GINインデックス、設定可能な全文検索辞書を使って、本番環境向けの全文検索を構築します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「tsvectorとGINによる全文検索」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ファジーマッチングのためのトライグラム検索(pg_trgm)
- tsvectorとGINによる全文検索
- PostGISによる地理空間インデックス
- pgvectorによるベクトル検索