2016-07-08 6 views
0

Ich habe das Beispiel Getting Starting - Django Haystack gefolgt, ihr Modell für meins auszuwechseln. In search_indexes.py hat die Methode index_queryset den Kommentar "Wird verwendet, wenn der gesamte Index für das Modell aktualisiert wurde". es wird jedoch jedes Mal aufgerufen, wenn ich eine Suche aus der Sicht search/search.htmlWarum wird index_queryset jedes Mal aus der Suchansicht in django-Haystack aufgerufen?

Die Methode selbst ruft alle Objekte aus der Datenbank und ist sehr langsam, also nehme ich an, dies ist nicht das beabsichtigte Verhalten.

search_indexes.py

import datetime 
from haystack import indexes 
from article.models import Article 


class ArticleIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    article_id = indexes.IntegerField(model_attr='id') 
    title = indexes.CharField(model_attr='title') 
    summary = indexes.CharField(model_attr='summary') 
    content = indexes.CharField(model_attr='content') 
    published_at = indexes.DateTimeField(model_attr='published_at') 

def get_model(self): 
    return Article 

def index_queryset(self, using=None): 
    return self.get_model().objects.filter(
     published_at__lte=datetime.datetime.now()) 

ich den Stack-Trace eingefangen, wo man es aus aufgerufen wurde:

python2.7/site-packages/haystack/views.py(53)__call__() 
-> return self.create_response() 
python2.7/site-packages/haystack/views.py(133)create_response() 
-> (paginator, page) = self.build_page() 
python2.7/site-packages/haystack/views.py(110)build_page() 
-> self.results[start_offset:start_offset + self.results_per_page] 
python2.7/site-packages/haystack/query.py(272)__getitem__() 
-> self._fill_cache(start, bound) 
python2.7/site-packages/haystack/query.py(191)_fill_cache() 
-> to_cache = self.post_process_results(results) 
python2.7/site-packages/haystack/query.py(214)post_process_results() 
-> objects = index.read_queryset(using=self.query._using) 
python2.7/site-packages/haystack/indexes.py(144)read_queryset() 
-> return self.index_queryset(using=using) 
myApplication/article/search_indexes.py(20)index_queryset() 
-> return self.get_model().objects.filter(

Anmerkung: Ich django Version 1.7.10 bin mit und django-Heuhaufen-Version 2.4.1

Antwort

1

Dies ist beabsichtigtes Verhalten - es ist der Docstring, der falsch ist. Die Funktion index_queryset gibt im Grunde das Abfrage-Set zurück, das Haystack verwenden wird, um die Suchergebnisse zu erhalten (sowie Dokumente zu indizieren).

Sie sagen:

Die Methode selbst alle Objekte aus der Datenbank erhält und ist sehr langsam

Eigentlich ist es nicht. Die Methode gibt nur einen Abfrage-Satz zurück. Querysets are lazy, so trifft die Methode nicht die Datenbank. Die Datenbank wird nur getroffen, wenn versucht wurde, auf die Ergebnisse des Abfrage-Sets zuzugreifen.

Dies wird passieren, nachdem Ihre Suche ausgeführt wurde und Haystack die Ergebnisse zurückgibt. An diesem Punkt wird das Abfrage-Set weiter gefiltert, um die Objekte zurückzugeben, die der Suche entsprechen. Wenn dies langsam ist, kann dies auf ein grundsätzliches Leistungsproblem mit Ihrer Modellstruktur hinweisen.

Verwandte Themen