Django Trigram相似性查询不如具有相同结果的原始查询快

问题描述 投票:0回答:1

目标是按相似性顺序快速搜索相似值。

这是Django中的查询:Model.objects.annotate(similarity=TrigramSimilarity('field_name', query)).filter(similarity__gt=0.3).order_by('-similarity').values('field_name')[0:30]

以上内容将转换为此查询:SELECT "table"."field_name" FROM "table" WHERE SIMILARITY("table"."field_name", query_value) > 0.3 ORDER BY SIMILARITY("table"."field_name", query_value) DESC LIMIT 30

这需要大约1.3秒,但如果我在psql中运行它:

SELECT field_name FROM table WHERE field_name % 'query_value' ORDER BY similarity(field_name, 'query_value') DESC LIMIT 30

它更快,并具有相同的正确输出。除了输入raw sql命令之外,我怎么能用Django实现这个呢?

另一个问题是如何将SELECT DISTINCT field_name添加到该字段。目前,当我尝试添加它时,我得到了ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list,即使我只在ORDER BY simlarity函数中使用了所选的field_name。

非常感谢!

django postgresql
1个回答
1
投票

有点古老的问题,但我正在搞乱三元组latgely并遇到类似的问题。

当你使用函数时,非常重要的是(如此处所述 - https://dba.stackexchange.com/questions/103821/best-index-for-similarity-function/103823#103823)索引不被使用!你必须使用运营商 - 所以%

© www.soinside.com 2019 - 2024. All rights reserved.