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_trgm扩展。但是您的索引会非常大(甚至比您的表大几倍)并且写入性能不是很好。using gin (column_name gin_trgm_ops)using gist (column_name gist_trgm_ops)

有一个很好的例子,使用 pg_trgmselect * from depesz blog进行子字符串搜索。

于 2012-10-25T15:36:25.553 回答
8

一种疯狂而疯狂的方法是创建所有文档的 tsvector 索引,反向。并反转您对后缀搜索的查询。

这基本上就是 Solr 使用其ReversedWildcardFilterFactory所做的事情

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