Om du tappar SearchRank
och bara filtrera med hjälp av frågan så kommer det att använda GIN-indexet och prestera mycket, mycket snabbare:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Du kan lägga till .explain()
för att avsluta för att ta en titt på frågan och se om indexet används:
print(entries.explain(analyze=True))
Du bör se frågan med Bitmap Heap Scan och exekveringstiden bör vara mycket snabbare.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
När du kommenterar som du är ovan, kommenterar du varje Article
objekt - så postgres bestämmer sig för att utföra en Seq Scan (eller Parallel Seq Scan) som den bestämmer är mer effektiv. Mer information här
Testa att lägga till .explain(verbose=True)
eller .explain(analyze=True)
till din ursprungliga sökrankningsmetod för att jämföra.
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))
Jag står själv inför det här problemet, med en tabell med 990 000 poster som tar ~10 sekunder. Om du kan filtrera frågan före anteckningen med andra fält - kommer det att skjuta frågeplaneraren tillbaka mot att använda indexet.
Från det här svaret