Ich habe eine einfache Einrichtung mit Django-Heuhaufen und whoosh Motor. Eine Suche nach 19 Objekten dauerte 8 Sekunden. Ich benutzte die Django-Debug-Toolbar, um festzustellen, dass ich eine Reihe von wiederholten Abfragen hatte.Django Heuhaufen Whoosh super langsam
ich dann meine Suche auf Prefetch Beziehungen aktualisiert, so dass Abfragen duplizieren nicht passieren würde:
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')
)
Aber selbst dann die Suche dauert noch 5 Sekunden. Früher habe ich dann den Profiler von django-debug-toolbar
, die mir diese Informationen gab:
Von dem, was ich sagen kann, das Problem liegt in haystack/query:779::__getitem__
, die zweimal getroffen wird, jeder kostet 1,5 Sekunden. Ich habe den fraglichen Code durchgesehen, kann aber keinen Sinn daraus machen. Wohin gehe ich von hier?
Wie viele Objekte befinden Sie in Ihrem Suchindex? – phildini
@phildini "19 Objekte" –
Es scheint, als ob '__getitem__' 2 Abfragen an die Datenbank auslöst. Schauen Sie sich '_fill_cache' an, es ruft zweimal 'get_results' auf, was insgesamt etwa 3 Sekunden dauert. Sind Sie sicher, dass alle Artikel vorab von der Datenbank abgerufen wurden? –