我正在尝试使用TrigramSimilarity
进行全文搜索。我已经在PostgreSQL中激活了pg_trgm
扩展。并在我安装的应用程序中添加了django.contrib.postgres
。但是当我尝试查询时
blog.objects.annotate(similarity=TrigramSimilarity('name', 'abc'),).filter(similarity__gt=0.3).order_by('-similarity')
但它给了我一个错误
心理战2.编程错误:函数相似性(字符变化,未知(不存在 第 1 行:...others_2","blog_mod",相似性... ^ 提示:没有函数与给定的名称和参数类型匹配。可能需要添加显式类型强制转换。
为什么会发生此错误。请帮助我。
该错误指示尚未安装扩展。我不知道为什么会这样。可能您没有在用于 django 的数据库中安装扩展?
可以从你的 django 代码中执行原始 sql 查询。这将确保您以正确的数据库/架构为目标。
from django.db import connection
with connection.cursor() as cursor:
cursor.execute('CREATE EXTENSION IF NOT EXISTS pg_trgm')
你也可以使用 Django 的自定义TrigramExtension
迁移。创建扩展查询是相同的。但是,如果在还需要启用pg_trgm的测试数据库上运行集成测试,则迁移是一个好主意。
https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/operations/#database-migration-operations
这是因为(我不知道为什么?TrigramSimilarity不适用于search_query。相反,它将与字符串一起使用。或者两者都不使用SearchVectorField,而是使用常规字段。
如果在公共架构中创建pg_trgm扩展,则可以在另一个架构中获取错误。这对我有用:
select public.similarity('foo','bar');
而如果我尝试 Szymon 的解决方案,Postgres 告诉我扩展已经存在。我还没有找到这方面的文档。
我有同样的问题。如果在安装此扩展之前未在搜索路径中包含将使用TrigramSimilarity()
的架构,则会发生这种情况。
尝试
SET search_path TO my_schema
然后
CREATE EXTENSION IF NOT EXISTS pg_trgm;
我的猜测是您可能没有连接到正确的数据库。
在 Ubuntu 中。尝试。。。
$ sudo su postgres
$ psql <db_name>
<db_name> = Name of DB being used by the Django project.
e.g psql badass_db
$ CREATE EXTENSION pg_trgm;