提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 TrigramSimilarity Django

时间:2018-10-18 23:03:06

标签: python django python-3.x postgresql

我正在尝试使用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“,相似度...                                                  ^       提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

为什么会发生此错误。请帮助我。

5 个答案:

答案 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 而是使用常规字段。