10

SELECT * FROM table WHERE attr LIKE '%text%'PostgreSQL で tsvector を使用するようなものをエミュレートする方法を探しています。

辞書を使用せずに tsvector 属性を作成しました。さて、次のようなクエリ...

SELECT title
FROM table
WHERE title_tsv @@ plainto_tsquery('ph:*');  

... 'Physics'、'PHP' などのすべてのタイトルを返します。しかし、タイトルが 'Zend Fram' で始まるすべてのレコードを返すクエリを作成するにはどうすればよいでしょうか (たとえば、'Zend Framework' を返す必要があります)。

もちろん、次のようなものを使用できます。

SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend')
AND   title_tsv @@ to_tsquery('fram:*');

ただし、これは少し厄介なようです。

したがって、問題は、次のようなものを使用して上記のクエリを定式化する方法はありますか?

SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend fram:*');
4

4 に答える 4

8
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend') and
title_tsv @@ to_tsquery('fram:*')  

次と同等です。

SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend & fram:*')

もちろん、「Zendにはフレームワークがない」こともわかります。

もちろん、tsquery の一致後に title に対して正規表現の一致を表現することもできますが、explain analyze を使用して、tsquery の前ではなく後に実行されていることを確認する必要があります。

于 2011-05-27T17:26:28.827 に答える
6

Postgres 9.6では、全文検索用のフレーズ検索機能が導入されています。だからこれは今動作します:

SELECT title
FROM  tbl
WHERE title_tsv @@ to_tsquery('zend <-> fram:*');

<->FOLLOWED BY 演算子です。

'foo Zend Framework bar'または'Zend frames'は検出されますが、' foo Zend has no framework bar' は検出されません。

Postgres 9.6のリリース ノートを引用します。

新しい演算子<->andを使用して、フレーズ検索クエリを tsquery 入力で指定できます。前者は、その前後の語彙素がその順序で互いに隣接していなければならないことを意味します。後者は、語彙素が正確に離れている必要があることを意味します。<N>N

最高のパフォーマンスを得るには、GIN インデックスを使用したクエリをサポートします。

CREATE INDEX tbl_title_tsv_idx ON tbl USING GIN (title_tsv);

またはtitle_tsv、テーブルにまったく格納しないでください (テーブルを肥大化させ、書き込みを複雑にします)。代わりに式インデックスを使用できます。

CREATE INDEX tbl_title_tsv_idx ON tbl USING GIN (to_tsvector('english', title));

式を不変にするには、テキスト検索構成 (多くの場合、言語固有) を指定する必要があります。それに応じてクエリを調整します。

...
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'zend <-> fram:*');
于 2016-12-13T02:21:52.713 に答える
3

Trigramと Gin/Gist インデックスを使用して Postgres でそれを行う方法があります。クリスト・カイヴによるこの記事:部分文字列検索に、単純な例がありますが、いくつかの粗いエッジがあります。

于 2011-05-29T07:43:06.520 に答える