Pokud vynecháte SearchRank
a stačí filtrovat pomocí dotazu, použije index GIN a bude fungovat mnohem, mnohem rychleji:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Můžete přidat .explain()
na konec, abyste se podívali na dotaz a zjistili, zda je index použit:
print(entries.explain(analyze=True))
Měli byste vidět dotaz pomocí Bitmap Heap Scan a doba provádění by měla být mnohem rychlejší.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Když přidáváte poznámky jako výše, přidáváte poznámky každý Article
objekt - takže postgres se rozhodne provést Seq Scan (nebo Parallel Seq Scan), který je podle něj efektivnější. Další informace zde
Zkuste přidat .explain(verbose=True)
nebo .explain(analyze=True)
k vaší původní metodě SearchRank k porovnání.
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))
Sám čelím tomuto problému, s tabulkou s 990 000 záznamy, která trvá ~ 10 sekund. Pokud můžete filtrovat dotaz před anotací pomocí jakýchkoli jiných polí – posune to plánovač dotazů zpět k použití indexu.