2012-10-25 12 views
15

私は、ワイルドカードを使用して部分一致を処理できるPostgresqlを使用して全文検索を実行しようとしています。Postgresqlプレフィックスワイルドカード(フルテキスト用)

検索語の後に後置修飾子ワイルドカードを付けるのは簡単ですが、接頭辞ワイルドカードを指定する方法はわかりません。私のような接頭辞の検索を行うように見えるカントしかし

例えば、私は何かなどを使用して簡単に十分なpostfixの検索を行うことができます。..

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', 'don:*')) 

は「ロンドン」

に一致する結果を返す必要があります。.. 。理想的には

SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don')) 

私は...

のような、ワイルドカードは検索語の前と最後に接頭辞持っている何かをしたいと思います210
SELECT "t1".* 
FROM "t1" 
WHERE (to_tsvector('simple', "t1"."city") @@ to_tsquery('simple', ':*don:*')) 

私はLIKE条件を使うことができますが、私はPostgresの全文検索機能の恩恵を期待していました。

+2

で何をするか、本質的である:http://www.postgresql.org/docs/current/static/textsearch-controls.html 'ドン:*' **は** a *接頭辞*検索です。接頭辞と接尾辞の検索を混在させることは可能でしょうか? –

答えて

9

フルテキスト検索は、部分文字列ではなく単語の検索に適しています。

方が良いのPostgreSQL 9.1と using gin (column_name gin_trgm_ops)または using gist (column_name gist_trgm_ops)インデックスから入手 pg_trgm拡張子を持つ like '%don%'を使用したい文字列検索のために

。しかし、あなたのインデックスは非常に大きく(あなたのテーブルよりも数倍も大きい)、パフォーマンスはあまり良くありません。

select * from depesz blogにはvery good example of using pg_trgm for substring searchがあります。

+0

答えをいただきありがとうございます。私たちはすでにクエリの点で類似したものを実装していますので、トリグラムを追加することで、私たちが必要とするパフォーマンスを得ることができれば幸いです。再度、感謝します。 –

+0

gist(column_name gist_trgm_ops)を1列ではなく2列で使用する方法は? –

6

これを実行するには、すべてのドキュメントのtsvectorインデックスを逆に作成するのが賢明です。そして後置検索のためにあなたの質問を逆にしてください。

これは、Solrには、マニュアルによるとそのReversedWildcardFilterFactory

select 
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true 
+2

実践かどうか、それは邪悪なクールなトリックだ。 – Medorator

+1

残念ながら、 'rown'の代わりに' row'を照会すると結果は返されません。その理由は、それが最初から最後までチェックしますが、最初の(この状況では最後の)文字からのみであり、中間からのものではないからです。 –

+0

@BernardPotockiは仕様に含まれていません;)フルテキスト検索では、部分文字列を使用しなくても十分です。 'row'を検索して' brown'にマッチさせたいなら、これは正規表現の良いユースケースです –

関連する問題