web-dev-qa-db-ja.com

GINインデックスのTSVECTOR列から部分一致を取得する

これをクエリして結果を取得したいと思います。

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`
13
xangr

すべてのクエリは辞書にある必要がありますか?

いいえ、使用されている テキスト検索設定 に応じて、Wordの語幹のみがインデックスに含まれているためです。しかし、より重要なこと:

いいえ。なぜなら、その上に 全文検索が可能なプレフィックスマッチング

これはうまくいくでしょう:

_SELECT id, subject
FROM   mailboxes
WHERE  tsv @@ to_tsquery('simple', 'avail:*')
ORDER  BY id DESC;_

3のことに注意してください:

  1. この場合、to_tsquery()ではなくplainto_tsquery()を使用します。これは、( マニュアルの引用 )のためです。

    ... _plainto_tsquery_は、入力のtsquery演算子、重みラベル、またはプレフィックス一致ラベルを認識しません

  2. 明らかにWord 'avail'をそのまま使用し、ステミングを適用しないため、_'simple'_テキスト検索構成を使用してtsqueryを生成します。

  3. _:*_を追加してプレフィックス検索にします。つまり、「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;
_
23