SearchRank
を削除した場合 クエリを使用してフィルタリングするだけで、GINインデックスが使用され、はるかに高速に実行されます。
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
.explain()
を追加できます
終了してクエリを確認し、インデックスが使用されているかどうかを確認します。
print(entries.explain(analyze=True))
ビットマップヒープスキャンを使用してクエリが表示され、実行時間がはるかに速くなるはずです。
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
上記のように注釈を付けると、すべてに注釈を付けることになります。 Article
オブジェクト-したがって、postgresはSeqスキャン(またはParallel Seq Scan)を実行することを決定します。これはより効率的であると判断します。詳細情報
.explain(verbose=True)
を追加してみてください または.explain(analyze=True)
比較する最初のSearchRankメソッドに。
query = SearchQuery(termo,config='portuguese')
search_rank = SearchRank(F('search_vector'), query)
entries = Article.objects.annotate(rank=search_rank).filter(search_vector=query).order_by('-rank')
print(entries.explain(analyze=True))
私はこの問題に自分で直面しています。テーブルには、約10秒かかる990kエントリが含まれています。他のフィールドを使用してアノテーションの前にクエリをフィルタリングできる場合は、クエリプランナーをインデックスの使用に戻します。
この回答 から