Ben django-haystack ve whoosh motoru ile basit bir kurulum var. 19 nesne üreten bir arama 8 saniye sürdü. Tekrarlanan sorguların bir demetinin olduğunu belirlemek için django-debug-toolbar'ı kullandım.Django haystack whoosh süper yavaş
o sorgular olmayacaktı yinelenen bu yüzden daha sonra önceden getirir ilişkilerine benim arama görünümünü güncelleme:
class MySearchView(SearchView):
template_name = 'search_results.html'
form_class = SearchForm
queryset = RelatedSearchQuerySet().load_all().load_all_queryset(
models.Customer, models.Customer.objects.all().select_related('customer_number').prefetch_related(
'keywords'
)
).load_all_queryset(
models.Contact, models.Contact.objects.all().select_related('customer')
).load_all_queryset(
models.Account, models.Account.objects.all().select_related(
'customer', 'account_number', 'main_contact', 'main_contact__customer'
)
).load_all_queryset(
models.Invoice, models.Invoice.objects.all().select_related(
'customer', 'end_customer', 'customer__original', 'end_customer__original', 'quote_number', 'invoice_number'
)
).load_all_queryset(
models.File, models.File.objects.all().select_related('file_number', 'customer').prefetch_related(
'keywords'
)
).load_all_queryset(
models.Import, models.Import.objects.all().select_related('import_number', 'customer').prefetch_related(
'keywords'
)
).load_all_queryset(
models.Event, models.Event.objects.all().prefetch_related('customers', 'contracts', 'accounts', 'keywords')
)
Ancak bu durumda bile arama hala 5 saniye sürer. Söyleyebileceğim kadarıyla
, konu haystack/query:779::__getitem__
yatıyor, her 1.5 saniyede bir mal, iki kez isabet: Sonra bana bu bilgiyi verdi, django-debug-toolbar
gelen profilleyiciyi kullandı. Söz konusu kodun içine baktım, ancak anlam ifade edemiyorum. Peki buradan nereye giderim?
Arama indeksinizde kaç tane nesne var? – phildini
@phildini "19 nesne" –
'__getitem__' veritabanına 2 sorgu tetikler gibi görünüyor. '_fill_cache'ye bir göz atın, genel olarak yaklaşık 3 saniye süren iki kez get_results’u çağırır. Tüm öğelerin veritabanından önceden getirildiğinden emin misiniz? –