我正在尝试使用TrigramSimilarity
进行全文搜索。我已经在PostgreSQL中激活了pg_trgm
扩展名。并在已安装的应用中添加了django.contrib.postgres
。但是当我尝试查询时
blog.objects.annotate(similarity=TrigramSimilarity('name', 'abc'),).filter(similarity__gt=0.3).order_by('-similarity')
但是它给了我一个错误
psycopg2.ProgrammingError:函数相似性(字符不同,未知)不存在 LINE 1:... others_2“,” blog_mod“,相似度... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
为什么会发生此错误。请帮助我。
答案 0 :(得分:2)
该错误表明尚未安装扩展。我不知道为什么会这样。可能您没有在用于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
答案 1 :(得分:0)
我有同样的问题。如果在安装此扩展名之前未包括将在搜索路径中使用TrigramSimilarity()
的架构,则会发生这种情况。
尝试
SET search_path TO my_schema
然后
CREATE EXTENSION IF NOT EXISTS pg_trgm;
答案 2 :(得分:0)
我的猜测是您可能尚未连接到正确的数据库。
在Linux中。试试...
$ 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;
答案 3 :(得分:0)
如果在公共模式中创建了pg_trgm扩展,则可以在另一个模式中得到错误。这对我有用:
select public.similarity('foo','bar');
而如果我尝试Szymon的解决方案,Postgres会告诉我该扩展名已经存在。我还没有找到相关文档。
答案 4 :(得分:0)
这是因为(我不知道为什么?)TrigramSimilarity 不适用于 search_query。相反,它将与字符串一起使用。或者都不使用 SearchVectorField 而是使用常规字段。