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

时间:2017-04-27 12:18:03

标签: django postgresql

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

这是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。

非常感谢!

1 个答案:

答案 0 :(得分:1)

有点老问题,但是我正在搞乱三卦并遇到类似的问题。

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