すべてのクエリは辞書にある必要がありますか?
いいえ。最初に使用されるテキスト検索構成に応じて、単語の語幹のみがインデックスに含まれているためです。しかし、もっと重要なのは:
いいえ。なぜなら、その上で全文検索はプレフィックス一致も可能だからです:
これはうまくいくでしょう:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
3つのことに注意してください。
この場合to_tsquery()
、ではなくを使用しますplainto_tsquery()
(マニュアルを引用):
... 入力の演算子、重みラベル、またはプレフィックス一致ラベルをplainto_tsquery
認識しませんtsquery
'simple'
テキスト検索構成を使用してを生成しtsquery
ます。明らかに「avail」という単語をそのまま使用し、ステミングを適用しないためです。
追加:*
それプレフィックス検索にする、すなわち「無駄」で始まるすべての語彙素を見つけます。
重要:これは、ドキュメント内の語彙素(語幹)のプレフィックス検索です。ワイルドカード(content ~* 'avail'
)なしの正規表現一致は、まったく同じではありません!後者は(語彙素の開始まで)左アンカーではなく、「FOOavail」なども見つかります。
クエリで説明されている動作が必要か、追加された正規表現に相当する動作が必要かは不明です。すでに提案されている@Evanのpg_trgm
ようなトライグラムインデックス()は、そのための適切なツールです。dba.SEには多くの関連する質問があります。検索してみてください。
概要:
デモ
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
最近の関連する回答(検索を最適化するための別のアプローチの章):
メール?
電子メールに言及したので、テキスト検索パーサーは電子メールを識別し、それらを個別の単語/語彙素に分割しないことに注意してください。考慮してください:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
セパレーター@
と.
メールのスペースをスペース(' '
)に置き換えて、含まれている単語のインデックスを作成します。
また、英語(または他の言語)の単語ではなく、メールで名前を処理しているため、テキスト検索構成を使用して、ステミングおよびその他の言語機能を無効にします。'simple'
次を使用してts_vector
列を作成します。
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
文書化されている場所、および2)to_tsvector('simple'..)
そのtsvの将来のクエリがtsqueryにも「単純な」構成を必要とするという指示と一緒にビルドに関する言及はありませんか?tsvector / tsqueryでステミングを無効にすることの影響を明確にする必要があると思います。