これをクエリして結果を取得したいと思います。
SELECT * FROM (
SELECT id, subject
FROM mailboxes
WHERE tsv @@ plainto_tsquery('avail')
) AS t1 ORDER by id DESC;
これは機能し、tsv
を含むAvailable
を含む行を返します。しかし、avai
(ドロップlable
)を使用すると、何も見つかりません。
すべてのクエリは辞書にある必要がありますか?このような文字をクエリすることはできませんか?電子メールの本文(コンテンツ)が含まれているデータベースがあり、毎秒大きくなるにつれて速くしたいと考えています。現在使用しています
... WHERE content ~* 'letters`
すべてのクエリは辞書にある必要がありますか?
いいえ、使用されている テキスト検索設定 に応じて、Wordの語幹のみがインデックスに含まれているためです。しかし、より重要なこと:
いいえ。なぜなら、その上に 全文検索 も が可能なプレフィックスマッチング :
これはうまくいくでしょう:
_SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
_
3のことに注意してください:
この場合、to_tsquery()
ではなくplainto_tsquery()
を使用します。これは、( マニュアルの引用 )のためです。
... _
plainto_tsquery
_は、入力のtsquery
演算子、重みラベル、またはプレフィックス一致ラベルを認識しません
明らかにWord 'avail'をそのまま使用し、ステミングを適用しないため、_'simple'
_テキスト検索構成を使用してtsquery
を生成します。
_:*
_を追加してプレフィックス検索にします。つまり、「avail」で始まるすべての語彙素を検索します。
重要:これは、ドキュメント内の語彙素(Word語幹)のプレフィックス検索です。ワイルドカードを使用しない正規表現の一致(_content ~* 'avail'
_)は、まったく同じではありません。後者は(語彙素の先頭まで)固定されておらず、「FOOavail」なども検出されます。
クエリで概説されている動作が必要か、追加された正規表現に相当するものが必要かは不明です。トライグラムインデックス( _pg_trgm
_ )のような @ Evanは既に提案されています はそのための適切なツールです。 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', '[email protected]')
_
_(email,"Email address",[email protected],{simple},simple,{[email protected]})
_
メールの区切り記号_@
_と_.
_をスペース(_' '
_)に置き換えて、含まれている単語のインデックスを作成します。
また、メールではnamesを扱っているので、英語(または他の言語)wordsではなく、 _'simple'
_ステミングおよびその他の言語機能を無効にするテキスト検索設定:
_ts_vector
_列を作成するには:
_SELECT to_tsvector('simple', translate('[email protected]', '@.', ' ')) AS tsv;
_