類似性の高い順に高速検索することを目的としています。 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のみを使用します。
ありがとうございます!