0Pricing
SQL Academy · レッスン

全文検索入門(tsvector、to_tsquery)

tsvectorで文書にインデックスを作成し、to_tsqueryで自然言語クエリを実行し、ts_rankで結果を順位付けします。

「全文検索入門(tsvector、to_tsquery)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

全文検索とは

LIKE/ILIKEは部分文字列を検索します。一方、全文検索(FTS)は単語を理解し、語幹化、ストップワード、言語規則、関連度による順位付けに対応します。PostgreSQLに組み込まれているため、拡張機能は必要ありません。

2つの基本型

FTSは2つの型を基盤としています。

  • tsvector — 解析済みの文書:語彙素と位置
  • tsquery — 解析済みのクエリ:語彙素とブール演算子

@@ 演算子で両者を照合します。

文書の解析

生のテキストをtsvectorに変換します。

SELECT to_tsvector('english', 'The quick brown foxes jump over the lazy dogs');
-- 'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2
-- Stop words ('the', 'over') dropped; words stemmed (foxes → fox)

クエリの解析

検索入力も同様に処理します。

SELECT to_tsquery('english', 'foxes & dogs');
-- 'fox' & 'dog'

照合

@@ を使ってテストします。

SELECT to_tsvector('english', 'The lazy fox')
        @@ to_tsquery('english', 'fox');    -- TRUE

文書テーブルへのインデックス作成

tsvector列とGINインデックスを追加して、クエリを高速化します。

CREATE TABLE articles (
  id BIGSERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  body  TEXT NOT NULL
);

-- Either keep a generated tsvector column:
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 @@ to_tsquery('english', 'postgres & json')
ORDER BY id DESC;

クエリ内のブール演算子

tsqueryは &(AND)、|(OR)、!(NOT)、およびグループ化をサポートします。

to_tsquery('english', '(cat | dog) & !rabbit');

フレーズ検索

隣接する単語を検索するには <-> を使用します。

to_tsquery('english', 'postgres <-> performance');
-- finds 'postgres performance', not 'postgres is great for performance'

Web向けの使いやすいクエリ:websearch_to_tsquery

Google形式のクエリを受け付けます。

SELECT websearch_to_tsquery('english', 'postgres "json indexing" -mongo');

検索結果の順位付け

ts_rank または ts_rank_cd で順位を付けます。

SELECT id, title,
       ts_rank(search_doc, query) AS rank
FROM articles, to_tsquery('english', 'postgres & json') AS query
WHERE search_doc @@ query
ORDER BY rank DESC
LIMIT 20;

ハイライト表示

一致したスニペットを表示します。

SELECT ts_headline('english', body,
  to_tsquery('english', 'postgres & json'),
  'StartSel=<mark>,StopSel=</mark>')
FROM articles
WHERE search_doc @@ to_tsquery('english', 'postgres & json');

振り返り

FTSはPostgreSQLに組み込まれています。

  • tsvector + tsquery + @@
  • 高速化にはGINインデックス
  • ユーザー入力にはwebsearch_to_tsquery
  • 関連度順の並べ替えにはts_rank

確認問題

tsvectorとtsqueryを照合する演算子はどれですか?

よくある質問

「全文検索入門(tsvector、to_tsquery)」レッスンは無料ですか?

はい。「全文検索入門(tsvector、to_tsquery)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「全文検索入門(tsvector、to_tsquery)」で何を学びますか?

tsvectorで文書にインデックスを作成し、to_tsqueryで自然言語クエリを実行し、ts_rankで結果を順位付けします。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「全文検索入門(tsvector、to_tsquery)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. 連結:||とCONCAT
  2. UPPER、LOWER、SUBSTRING、REPLACE
  3. TRIM、LPAD、RPAD
  4. 全文検索入門(tsvector、to_tsquery)
← SQL Academyに戻る