2017-04-27 5 views
0

類似性の高い順に高速検索することを目的としています。 Model.objects.annotate(similarity=TrigramSimilarity('field_name', query)).filter(similarity__gt=0.3).order_by('-similarity').values('field_name')[0:30]Django Trigram類似クエリは、同じ結果を持つ生のクエリほど高速ではありません。

上記

このクエリに変換されます:

この

はジャンゴでクエリです

SELECT field_name FROM table WHERE field_name % 'query_value' ORDER BY similarity(field_name, 'query_value') DESC LIMIT 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でこれを実行する場合

これははるかに高速で、正しい出力が同じです。どのように私は生のSQLコマンドを入れて、Djangoでこれを達成することができますか?

もう1つの質問は、それにSELECT DISTINCT field_nameを追加する方法です。現在、追加しようとすると、私はERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select listを取得しますが、ORDER BYのsimlarity関数では、選択したfield_nameのみを使用します。

ありがとうございます!

答えて

関連する問題