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
プレフィックス照合
ちょうどのために左アンカーパターン(無大手ワイルドカード)あなたは、適切なと最適な取得演算子クラス B-Treeインデックスのために: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インデックスが機能します。
dba.SEに関するこれらの関連回答の詳細、説明、例、リンク: