web-dev-qa-db-ja.com

全文のPostgresqlプレフィックスワイルドカード

ワイルドカードを使用して部分一致に対応できるPostgresqlを使用してフルテキストクエリを実行しようとしています。

検索語の後に接尾辞のワイルドカードを付けるのは簡単なようですが、接頭辞のワイルドカードを指定する方法がわかりません。

たとえば、次のようなものを使用して、後置検索を簡単に実行できます。

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') )

理想的には、検索語の先頭と末尾にワイルドカードを付けたいと思います。

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

LIKE条件を使用できますが、Postgresの全文検索機能のパフォーマンスの恩恵を受けることを望んでいました。

20
Paul Carey

全文検索は、部分文字列ではなく単語を見つけるのに適しています。

部分文字列検索の場合は、PostgreSQL 9.1およびusing gin (column_name gin_trgm_ops)またはusing Gist (column_name Gist_trgm_ops)インデックスから利用可能な_like '%don%'_拡張子を持つ_pg_trgm_を使用することをお勧めします。ただし、インデックスは非常に大きく(テーブルの数倍でも)、書き込みパフォーマンスはあまり良くありません。

部分文字列検索にpg_trgmを使用する非常に良い例 on select * from depesz blog があります。

13
Tometzky

それを行うためのワイルドでクレイジーな方法の1つは、すべてのドキュメントのtsvectorインデックスを逆に作成することです。また、後置検索のクエリも逆にします。

これは基本的に、Solrがその ReversedWildcardFilterFactory で行うことです。

select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true
6
Neil McGuigan