Jeśli opuścisz SearchRank
i po prostu filtruj za pomocą zapytania, użyje indeksu GIN i wykona znacznie, znacznie szybciej:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Możesz dodać .explain()
aby zakończyć, aby spojrzeć na zapytanie i sprawdzić, czy indeks jest używany:
print(entries.explain(analyze=True))
Powinieneś zobaczyć zapytanie za pomocą Bitmap Heap Scan, a czas wykonania powinien być znacznie szybszy.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Kiedy dodajesz adnotacje tak, jak powyżej, robisz adnotacje co Article
obiekt - więc postgres postanawia wykonać Seq Scan (lub Parallel Seq Scan), który uzna za bardziej wydajny. Więcej informacji tutaj
Spróbuj dodać .explain(verbose=True)
lub .explain(analyze=True)
do początkowej metody SearchRank do porównania.
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))
Sam mam do czynienia z tym problemem, z tabelą z 990k wpisów, która zajmuje ~10 sekund. Jeśli możesz przefiltrować zapytanie przed adnotacją przy użyciu innych pól – spowoduje to przesunięcie planowania zapytań z powrotem do korzystania z indeksu.