2014-05-06 16 views
7

Przeszedłem przez dokumenty, a nawet stworzyłem kilka końcowych wyników wyszukiwania, ale nadal jestem bardzo zdezorientowany tym, co te rzeczy robią w stogu siana. szukaj powrotem koniec przeszukiwania pola można umieścić w swojej klasie, która dziedziczy indexes.SearchIndex, indexes.Indexable lub jest tylny koniec przeszukiwania tekstu wewnątrz szablonu? czy ktoś może mi to wyjaśnić?Django Haystack: odpowiedzialność za indeksy szablonów i modeli

w Django stóg_siana zostanie utworzona klasa, która definiuje, które pola powinny być sprawdzane (dobrze to rozumiem):

class ProductIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    name = indexes.CharField(model_attr='title', boost=1.75) 
    description = indexes.CharField(model_attr='description') 
    short_description = indexes.CharField(model_attr='short_description') 

    def get_model(self): 
     return Product 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(active=True, 
              published_at__lte=datetime.now()) 

Utworzysz również szablon txt tha t coś zrobi - nie jestem pewien co. Wiem, że backend wyszukiwania przejdzie przez ten szablon podczas algorytmu wyszukiwania.

{{ object.name }} 
{{ object.description }} 
{{ object.short_description }} 
{% for related in object.related %} 
    {{ related.name }} 
    {{ related.description }} 
{% endfor %} 

{% for category in object.categories.all %} 
    {% if category.active %} 
     {{ category.name }} 
    {% endif %} 
{% endfor %} 

Jak widać szablon ma pewne pola, które moja klasa indeksu nie ma, jednak będą one poszukiwane przez backend wyszukiwania. Dlaczego więc mają pola w indeksie? Co to jest rola klasy indeksu i szablon indeksu? Czy ktoś może mi to wyjaśnić.

+0

Nie jestem pewien, czy całkowicie cię rozumiem. Czy możesz dodać przykład (najlepiej w kodzie) takiego backendu i wyjaśnić szczegółowo, co dokładnie wprowadza Cię w błąd? Pytasz, w jaki sposób Haystack działa w tle, czy ogólnie nie wiesz, jak korzystać z niektórych funkcji? – yuvi

+0

Zrobiłem, co mogłem, Yuvi. Jestem po prostu bardzo zdezorientowany, co dokładnie jest celem na rolkach klasy indeksu i szablonu indeksu oraz tego, co jest przeszukiwane przez backend. – user2734679

+1

To jest o wiele jaśniejsze. Nie jestem pewien, czy mogę ci pomóc, ale teraz pytanie jest o wiele lepsze. Mam nadzieję, że niedługo pojawią się ninja stogu siana! – yuvi

Odpowiedz

7

Klasa ProductIndex jest tutaj najważniejsza. Haystack użyje tej konfiguracji do zindeksowania modelu Product zgodnie z polami wybranymi do zaindeksowania iw jaki sposób. Możesz przeczytać więcej na ten temat here.

Utworzony przez Ciebie szablon zostanie użyty w tym polu text = indexes.CharField(document=True, use_template=True). W tym szablonie uwzględniamy wszystkie ważne dane z modelu lub powiązanych modeli, dlaczego? ponieważ służy do wyszukiwania wszystkich danych, jeśli nie chcesz wyszukiwać w jednym polu.

# filtering on single field 
qs = SearchQuerySet().models(Product).filter(name=query) 

# filtering on multiple fields 
qs = SearchQuerySet().models(Product).filter(name=query).filter(description=query) 

# filtering on all data where ever there is a match 
qs = SearchQuerySet().models(Product).filter(text=query)