Nếu bạn đánh rơi SearchRank
và chỉ cần lọc bằng cách sử dụng truy vấn, nó sẽ sử dụng chỉ mục GIN và hoạt động nhanh hơn nhiều:
query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)
Bạn có thể thêm .explain()
kết thúc để xem truy vấn và xem chỉ mục có được sử dụng hay không:
print(entries.explain(analyze=True))
Bạn sẽ thấy truy vấn bằng cách sử dụng Bitmap Heap Scan và Thời gian thực thi sẽ nhanh hơn nhiều.
Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms
Khi bạn chú thích như bạn ở trên, bạn đang chú thích mọi Article
đối tượng - vì vậy postgres quyết định thực hiện Seq Scan (hoặc Parallel Seq Scan) mà nó quyết định là hiệu quả hơn. Thông tin thêm tại đây
Thử thêm .explain(verbose=True)
hoặc .explain(analyze=True)
với phương pháp SearchRank ban đầu của bạn để so sánh.
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))
Tôi đang tự mình đối mặt với vấn đề này, với một bảng có 990 nghìn mục nhập mất ~ 10 giây. Nếu bạn có thể lọc truy vấn trước chú thích bằng cách sử dụng bất kỳ trường nào khác - nó sẽ đẩy người lập kế hoạch truy vấn trở lại sử dụng Chỉ mục.