You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:38:20