28

ワイルドカードを使用して部分一致に対応できる 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 の全文検索機能のパフォーマンスを活用したいと考えていました。

4

2 に答える 2

20

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

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

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

于 2012-10-25T15:36:25.553 に答える
8

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

これは基本的に、Solr がそのReversedWildcardFilterFactoryを使用して行うことです。

select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true
于 2014-08-01T01:26:03.343 に答える