如何为Django PostgreSQL的__trigram_similar查询设置相似度阈值?
如何在Django中调整Trigram Similarity的相似度阈值
问题描述
我们在使用Django的__trigram_similar查询时功能正常,但不知道怎么调整相似度阈值。当前过滤代码如下:
class MarkerViewSet(viewsets.ReadOnlyModelViewSet): queryset = tablename.objects.all() def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) queryset = queryset.filter(colname__trigram_similar=search_value)
尝试在filter()参数中添加similarity__gt=0.1时触发错误:
django.core.exceptions.FieldError: Cannot resolve keyword 'similarity_gt' into field
我们了解到可通过PostgreSQL的set_limit(即SET pg_trgm.similarity_threshold)手动调整,但更希望直接在Django中完成设置。
解决方案
方法1:使用TrigramSimilarity表达式自定义单查询阈值
__trigram_similar查询默认使用PostgreSQL的全局trgm阈值,要为单个查询自定义阈值,需直接用TrigramSimilarity计算相似度后过滤:
首先导入模块:
from django.contrib.postgres.search import TrigramSimilarity
修改filter_queryset方法:
def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) # 为字段计算相似度,过滤出阈值大于0.1的结果 queryset = queryset.annotate( similarity=TrigramSimilarity('colname', search_value) ).filter(similarity__gt=0.1) return queryset
该方法的优势是可以针对不同查询设置不同阈值,不会影响全局配置。
方法2:在Django中设置全局pg_trgm阈值
如果希望所有trigram查询都使用统一阈值,可以通过Django的数据库连接执行SET命令:
from django.db import connection def filter_queryset(self, queryset): queryset = super().filter_queryset(queryset) # 设置当前连接的相似度阈值为0.1 with connection.cursor() as cursor: cursor.execute("SET pg_trgm.similarity_threshold = 0.1") # 执行原有trigram相似查询 queryset = queryset.filter(colname__trigram_similar=search_value) return queryset
注意:此设置仅对当前数据库连接生效,若使用连接池,需确保每个连接都正确配置,或直接在PostgreSQL配置文件中修改默认阈值。
内容的提问来源于stack exchange,提问作者Chris Dixon
相关产品推荐
相关产品推荐

