FTSはサポートしていませんLIKE
以前に受け入れられた答えは正しくありませんでした。全文索引を使用した全文検索は、演算子用ではありませLIKE
ん。独自の演算子があり、任意の文字列に対しては機能しません。辞書とステミングに基づいた単語で動作します。単語のプレフィックスマッチングはサポートしていますが、演算子はサポートしていません。LIKE
のトリグラムインデックスLIKE
左アンカーのパターンだけでなく、すべてのパターンをサポートするGINおよびGiSTトリグラムインデックスpg_trgm
のオペレータークラスを提供する追加モジュールをインストールします。LIKE
ILIKE
インデックスの例:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
または:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
クエリの例:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
トリグラム?短い文字列はどうですか?
インデックス値の文字が3文字未満の単語は引き続き機能します。マニュアル:
文字列に含まれるトリグラムのセットを決定するとき、各単語には接頭辞2つのスペースと接尾辞1つのスペースがあると見なされます。
そして、3文字未満の検索パターン?マニュアル:
正規表現検索と正規表現検索の両方LIKE
で、抽出可能なトリグラムのないパターンは、フルインデックススキャンに縮退することに注意してください。
つまり、インデックス/ビットマップインデックススキャンは引き続き機能し(プリペアドステートメントのクエリプランは機能しません)、パフォーマンスが向上することはありません。1文字または2文字の文字列はほとんど選択的ではなく(基になるテーブルの数パーセント以上が一致する)、全表スキャンの方が高速であるため、インデックスのサポートによって最初からパフォーマンスが向上しないため、通常は大きな損失はありません。
text_pattern_ops
またはCOLLATE "C"
プレフィックスマッチング用
アップデート
Postgres 9.1以降、COLLATE "C"
より優れています。見る:
元の回答
左に固定されたパターン(先頭のワイルドカードなし)の場合、btreeインデックスに適した演算子クラスtext_pattern_ops
を使用して最適化を取得します:またはvarchar_pattern_ops
。標準のPostgresの両方の組み込み機能であり、追加のモジュールは必要ありません。同様のパフォーマンスですが、インデックスははるかに小さくなります。
インデックスの例:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
クエリの例:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
または、「C」ロケール(事実上ロケールなし)でデータベースを実行する必要がある場合は、とにかくすべてがバイト順序に従ってソートされ、デフォルトの演算子クラスを持つプレーンなbtreeインデックスがその役割を果たします。
参考文献