我正在尝试使用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?
答案 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中也已修复)