Hvis du dropper SearchRank
og bare filtrer ved hjælp af forespørgslen, det vil bruge GIN-indekset og udføre meget, meget hurtigere:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Du kan tilføje .explain()
for at afslutte for at tage et kig på forespørgslen og se om indekset er brugt:
print(entries.explain(analyze=True))
Du bør se forespørgslen ved hjælp af Bitmap Heap Scan, og udførelsestiden skulle være meget hurtigere.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Når du kommenterer, som du er ovenfor, kommenterer du hver Article
objekt - så postgres beslutter at udføre en Seq Scan (eller Parallel Seq Scan), som den beslutter er mere effektiv. Mere info her
Prøv at tilføje .explain(verbose=True)
eller .explain(analyze=True)
til din oprindelige SearchRank-metode for at sammenligne.
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))
Jeg står selv over for dette problem med en tabel med 990.000 poster, der tager ~10 sekunder. Hvis du kan filtrere forespørgslen før annoteringen ved hjælp af andre felter - vil det skubbe forespørgselsplanlæggeren tilbage mod at bruge indekset.
Fra dette svar