我正在try 使用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的全文搜索功能中受益.

推荐答案

全文搜索有利于查找单词,而不是子字符串.

对于子字符串搜索,最好使用PostgreSQL 9.1提供的like '%don%'pg_trgm扩展名,以及using gin (column_name gin_trgm_ops)using gist (column_name gist_trgm_ops)索引.但是索引会非常大(甚至比表大几倍),写性能也不是很好.

select * from depesz blog上有一个very good example of using pg_trgm for substring search.

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

PostgreSQL散列连接与嵌套循环和散列索引

为什么Postgres在打印时能完全缩短时间跨度?

无法使用PGx连接到Postgres数据库AWS RDS

如何返回old_ids和重复行的映射';来自PostgreSQL函数的s new_id

Postgres 使用不同元素数据类型的订单数据

连接到 PostgreSQL 时没有属性执行错误

PostgreSQL - 列出模式中的所有唯一约束

Postgres 查询计划器不会使用更便宜的复合索引

使用间隔参数的 go postgres 准备好的语句不起作用

PostgreSQL - 我应该如何使用 first_value()?

PostgreSQL:将时间戳转换为时间 - 或仅从时间戳列中检索时间

postgresql:致命:password authentication failed for user "douglas"

Rails ActiveRecord - 如何获取两个日期之间的记录

大型查询后 psycopg2 泄漏内存

PostgreSQL 使用 UUID 与文本作为主键

在同一台机器上创建多个 Postgres 实例

在 postgres 中存在不同的 string_agg 问题

Capistrano 与 PostgreSQL,错误:database is being accessed by other users

JOIN (SELECT ... ) ue ON 1=1?