SQL Academy · レッスン

tsvectorとGINによる全文検索

tsvector列、GINインデックス、設定可能な全文検索辞書を使って、本番環境向けの全文検索を構築します。

レッスン 2/414 ステップ

「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':2

tsqueryを構築する

クエリを解析します。

SELECT to_tsquery('english', 'fox & jumping');     -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');

マッチング:@@

ドキュメントをクエリと照合します。

SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery;     -- t

FTSのインデックス作成

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ファジーマッチングのためのトライグラム検索(pg_trgm)
  2. tsvectorとGINによる全文検索
  3. PostGISによる地理空間インデックス
  4. pgvectorによるベクトル検索
← SQL Academyに戻る