PostgreSQL中TrigramSimilarity报错:similarity函数不存在
问题:使用TrigramSimilarity调整搜索排名触发ProgrammingError
访问/search/路径时出现错误:
function similarity(character varying, unknown) does not exist
没有匹配给定名称和参数类型的函数,可能需要添加显式类型转换
相关代码:
def search_content(query: str) -> QuerySet | None: if query: search_vector = SearchVector("name", weight="A") + SearchVector("description", weight="B") shows = ( Show.objects.annotate( search=search_vector, similarity=TrigramSimilarity('name', query), ) .filter(similarity__gt=0.4) .values("id", "name", "baner", "release_date", "search", "similarity") ) movies = ( Movie.objects.annotate( search=search_vector, similarity=TrigramSimilarity('name', query), ) .filter(similarity__gt=0.4) .values("id", "name", "baner", "release_date", "search", "similarity") ) episodes = ( Episode.objects.annotate( search=search_vector, similarity=TrigramSimilarity('name', query), ) .filter(similarity__gt=0.4) .values("id", "name", "baner", "release_date", "search", "similarity") ) qs = shows.union(movies, episodes).order_by("-similarity") return qs else: return None
解决方案
1. 安装PostgreSQL的pg_trgm扩展
Django的TrigramSimilarity依赖PostgreSQL的pg_trgm模块,这是触发该错误的最常见原因。
- 直接执行SQL命令:
CREATE EXTENSION IF NOT EXISTS pg_trgm; - 或通过Django迁移自动执行:
创建新迁移文件(例如0002_add_pg_trgm.py),内容如下:
运行from django.db import migrations class Migration(migrations.Migration): dependencies = [ # 替换为你的应用上一个迁移,比如('your_app', '0001_initial') ] operations = [ migrations.RunSQL('CREATE EXTENSION IF NOT EXISTS pg_trgm;'), ]python manage.py migrate完成安装。
2. 显式转换参数类型
若扩展已安装仍报错,可能是参数类型不匹配,需强制转换为字符类型:
from django.db.models import Cast, CharField # 修改annotate中的similarity定义 similarity=TrigramSimilarity(Cast('name', CharField()), query)
同时确保query为字符串类型(代码中已标注query: str,若从请求获取,可额外用str(query)确认类型)。
3. 检查Django配置
确认django.contrib.postgres已添加到INSTALLED_APPS:
INSTALLED_APPS = [ # 其他应用 'django.contrib.postgres', ]
且Django版本≥1.10(TrigramSimilarity从该版本开始支持)。
内容的提问来源于stack exchange,提问作者MMEEUR
相关产品推荐
相关产品推荐

