Als u de SearchRank
. laat vallen en filter gewoon met behulp van de zoekopdracht, het zal de GIN-index gebruiken en veel, veel sneller presteren:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
U kunt .explain()
toevoegen
om te eindigen om de zoekopdracht te bekijken en te zien of de index wordt gebruikt:
print(entries.explain(analyze=True))
U zou de query moeten zien met Bitmap Heap Scan en de uitvoeringstijd zou veel sneller moeten zijn.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Wanneer u annoteert zoals hierboven, annoteert u elke Article
object - dus postgres besluit een Seq Scan (of Parallel Seq Scan) uit te voeren waarvan het besluit dat het efficiënter is. Meer info hier
Probeer .explain(verbose=True)
. toe te voegen of .explain(analyze=True)
naar uw oorspronkelijke SearchRank-methode om te vergelijken.
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))
Ik heb zelf met dit probleem te maken, met een tabel met 990k-items die ~ 10 seconden duurt. Als u de query vóór de annotatie kunt filteren met andere velden, zal de queryplanner teruggaan naar het gebruik van de Index.
Van dit antwoord