具有pg_trgm的Postgres中的相似性函数

时间:2010-02-12 20:44:03

标签: sql postgresql fuzzy-search

我正在尝试使用Postgres中的相似度函数来进行模糊文本匹配,但每当我尝试使用它时,我都会收到错误:

function similarity(character varying, unknown) does not exist

如果我向文本添加显式强制转换,我会收到错误:

function similarity(text, text) does not exist

我的查询是:

SELECT (similarity("table"."field"::text, %s::text)) AS "similarity", "table".* FROM "table" WHERE similarity > .5 ORDER BY "similarity" DESC LIMIT 10

我是否需要做一些事情来实现pg_trgm?

6 个答案:

答案 0 :(得分:47)

使用postgresql 9.1:

安装后(在ubuntu上)sudo apt-get install postgresql-contrib,因为tomaszbak回答。

你只需要执行sql命令:

CREATE EXTENSION pg_trgm;

答案 1 :(得分:9)

您必须安装pg_trgm。在debian中,请输入这个sql:/usr/share/postgresql/8.4/contrib/pg_trgm.sql。从命令行:

psql -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql

或者在psql shell中:

\i /usr/share/postgresql/8.4/contrib/pg_trgm.sql

该脚本默认安装在公共模式中,如果要将其安装在其他位置,则编辑顶部的搜索路径(以便只需删除模式即可完成卸载/升级)。

答案 2 :(得分:7)

在ubuntu上你需要运行

sudo apt-get install postgresql-contrib

获取/usr/share/postgresql/8.4/contrib/pg_trgm.sql

答案 3 :(得分:3)

如果pg_trgm架构中安装了public扩展而不是,则必须在使用similarity函数时明确指定架构

select schema.similarity(foo,bar) from schema.baz

答案 4 :(得分:2)

对于Postgres 8.4 ,请执行以下操作:

作为sudo用户运行:

sudo apt-get install postgresql-contrib-8.4

切换到postgres用户:

sudo su - postgres

执行命令

psql -U DB_USER -d DB_NAME -f /usr/share/postgresql/8.4/contrib/pg_trgm.sql

重新启动postgres

答案 5 :(得分:1)

在针对将Django 1.11 ORM用于Postgres 9.4上三字母相似度的函数运行Django Test Runner的上下文中,我遇到了同样的问题。

我必须做一些事情才能使其正常工作:

1)OP正确地说,这要求启用pg_trgm扩展名。但是,在postgres9.4中,这是基于每个数据库启用的。由于Django每次运行都会删除并重新创建测试数据库,因此新的测试数据库未安装扩展名。为了解决这个问题,我在postgres的默认新创建的数据库模板中初始化了pg_trgm扩展名。为此的命令是psql -d template1 -c 'CREATE EXTENSION pg_trgm;'用户postgres来运行。

2)必须重新启动Postgres

3)Django测试运行程序没有意识到这一点,因此我不得不从Django 1.11.12升级到1.11.18(大概在更高版本的Django中也已修复)