ファジーマッチングのためのトライグラム検索(pg_trgm)
pg_trgm拡張、GiST/GINトライグラムインデックス、similarity()を使って類似する文字列を検索します。
「ファジーマッチングのためのトライグラム検索(pg_trgm)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
なぜトライグラムなのか
LIKE %word%はB-treeインデックスを使用できません。トライグラム(「3文字の部分文字列」)をGIN/GiSTと組み合わせることで、高速なあいまい検索や部分文字列検索が可能になります。
拡張を有効にする
pg_trgmはPostgreSQLのcontribに含まれています:
CREATE EXTENSION IF NOT EXISTS pg_trgm;単語のトライグラム
文字列のトライグラムを表示します:
SELECT show_trgm('database');
-- {dat, aba, atab, tab, abas, base, ase, ...}類似度関数
[0..1]の浮動小数点値です:
SELECT similarity('database', 'datbase'); -- ~0.75
SELECT similarity('hello', 'world'); -- ~0.0%演算子
類似度がしきい値(デフォルトは0.3)を上回る場合にtrueを返します:
SELECT 'database' % 'datbase'; -- t
SET pg_trgm.similarity_threshold = 0.4;部分文字列検索用インデックス
GINトライグラムインデックスによって、LIKE '%word%'が高速になります:
CREATE INDEX users_name_trgm ON users USING GIN (full_name gin_trgm_ops);
-- Now this is index-supported:
SELECT * FROM users WHERE full_name ILIKE '%ali%';GiSTとGINの比較
- GIN — 読み取りは高速、書き込みは低速、インデックスは大きい
- GiST — 書き込みは高速、読み取りは低速、インデックスは小さい
あいまい検索では、ほとんどのチームがGINを選択します。
あいまい一致クエリ
誤字があっても類似した文字列を検索します:
SELECT full_name, similarity(full_name, 'datbase') AS sim
FROM users
WHERE full_name % 'datbase'
ORDER BY sim DESC
LIMIT 10;ランキング用の距離
<->演算子は距離(1 - 類似度)を返すため、ORDER BY distance ASCで並べ替えられます:
SELECT full_name
FROM users
WHERE full_name % 'alice'
ORDER BY full_name <-> 'alice'
LIMIT 10;トライグラムによるオートコンプリート
pg_trgmをLIKEによるプレフィックス検索と組み合わせると、応答性の高いオートコンプリートを実現できます:
SELECT name
FROM products
WHERE name % $1
OR name ILIKE $1 || '%'
ORDER BY similarity(name, $1) DESC
LIMIT 8;トライグラムの限界
トライグラムは入力の文字体系に対して機能します。CJK言語には異なるトークン化が必要です。自然言語の全文検索には、tsvector + GINを使用します。
他のインデックスとの組み合わせ
複数のフィルターを含むクエリでは、Bitmap Andを使用してトライグラムインデックスとB-treeを組み合わせられます:
EXPLAIN ANALYZE
SELECT * FROM users
WHERE full_name ILIKE '%ali%' AND country = 'US';まとめ
pg_trgmは「先頭ワイルドカード」の問題を解決します。
- GINトライグラムインデックス → 高速なLIKE %x%
- あいまい一致には%演算子とsimilarity()
- ランキングには<->距離
- オートコンプリートや誤字に強い検索に最適
クイックチェック
通常のB-treeインデックスでは、なぜWHERE name LIKE '%alice%'を高速化できないのでしょうか?
よくある質問
「ファジーマッチングのためのトライグラム検索(pg_trgm)」レッスンは無料ですか?
はい。「ファジーマッチングのためのトライグラム検索(pg_trgm)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ファジーマッチングのためのトライグラム検索(pg_trgm)」で何を学びますか?
pg_trgm拡張、GiST/GINトライグラムインデックス、similarity()を使って類似する文字列を検索します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ファジーマッチングのためのトライグラム検索(pg_trgm)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ファジーマッチングのためのトライグラム検索(pg_trgm)
- tsvectorとGINによる全文検索
- PostGISによる地理空間インデックス
- pgvectorによるベクトル検索