Wenn Sie den SearchRank
fallen lassen und filtern Sie einfach mit der Abfrage, es wird der GIN-Index verwendet und viel, viel schneller ausgeführt:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Sie können .explain()
hinzufügen
zum Ende, um einen Blick auf die Abfrage zu werfen und zu sehen, ob der Index verwendet wird:
print(entries.explain(analyze=True))
Sie sollten die Abfrage mit Bitmap Heap Scan sehen und die Ausführungszeit sollte viel schneller sein.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Wenn Sie wie oben kommentieren, kommentieren Sie alle Article
Objekt - also beschließt Postgres, einen Seq-Scan (oder parallelen Seq-Scan) durchzuführen, der seiner Meinung nach effizienter ist. Weitere Informationen finden Sie hier
Versuchen Sie, .explain(verbose=True)
hinzuzufügen oder .explain(analyze=True)
mit Ihrer anfänglichen SearchRank-Methode vergleichen.
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))
Ich stehe selbst vor diesem Problem, mit einer Tabelle mit 990.000 Einträgen, die ~ 10 Sekunden dauert. Wenn Sie die Abfrage vor der Anmerkung filtern können, indem Sie andere Felder verwenden, wird der Abfrageplaner zurück zur Verwendung des Index gedrängt.
Aus dieser Antwort