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

我可以使用类似条件,但是我希望从Postgres中的全文搜索功能的性能中受益。

全文搜索非常适合查找单词而不是子字符串。

对于子字符串搜索,您最好将like '%don%'pg_trgm扩展相关,可从PostgreSQL 9.1和using gin (column_name gin_trgm_ops)using gist (column_name gist_trgm_ops)索引。但是您的索引将很大(甚至比桌子大几倍),并且写作表演不是很好。

有一个很好的例子,即在depesz博客中使用pg_trgm进行子字符串搜索。

一种狂野而疯狂的做法将是创建所有文档的TSVECTOR索引,并逆转。并将您的查询也转换为postfix搜索。

这本质上是索尔对其反向wildcardfilterfactory

所做的
select
reverse('brown fox')::tsvector @@ (reverse('rown') || ':*')::tsquery --true

最新更新