2014-05-06 9 views
7

Ho esaminato i documenti e ho persino creato alcuni backend di ricerca, ma sono ancora molto confuso su ciò che queste cose fanno nel pagliaio. cerca in fondo alla ricerca dei campi che hai inserito nella tua classe che eredita indexes.SearchIndex, index.Indexable, o è il back-end che cerca il testo all'interno del tuo modello? Qualcuno può spiegarmelo?Django Haystack: responsabilità del modello e degli indici del modello

Nel pagliaio del django creerai una classe che definisce quali campi devono essere interrogati (beh è così che ho capito bene) in questo modo:

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()) 

potrai anche creare un modello txt tha farò qualcosa - non sono sicuro di cosa. So che il backend di ricerca andrà oltre questo modello durante l'algoritmo di ricerca.

{{ 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 %} 

Come si può vedere il modello ha alcuni campi che la mia classe di indice non ha, tuttavia, questi saranno cercati dal backend di ricerca. Allora, perché anche i campi nell'indice? Quali sono i rotoli della classe di indice e il modello di indice? Qualcuno può spiegarmelo per favore.

+0

Non sono sicuro di averti capito completamente. Puoi aggiungere qualche esempio (preferibilmente in codice) di tale back-end e spiegare in dettaglio che cosa ti confonde esattamente? Stai chiedendo come funziona Haystack in sottofondo, sei generalmente confuso su come utilizzare alcune funzionalità? – yuvi

+0

Ho fatto il meglio che potevo. Sono solo molto confuso su quale sia esattamente lo scopo sui rotoli della classe index e del template dell'indice e su cosa viene cercato dal backend. – user2734679

+1

Questo è molto più chiaro. Non sono sicuro di poterti aiutare, ma ora la domanda è molto meglio. Spero che qualche ninjaio di pagliaio arriverà presto! – yuvi

risposta

7

La classe ProductIndex è la cosa principale qui. Haystack userà questa configurazione per indicizzare il tuo modello Product in base ai campi che hai scelto di indicizzare e in che modo. Potete leggere di più su di esso here.

Il modello che è stato creato verrà utilizzato da questo campo text = indexes.CharField(document=True, use_template=True). In questo modello includiamo tutti i dati importanti dal modello o dai modelli correlati, perché? perché questo è utilizzato per eseguire query di ricerca su tutti i dati se non si desidera cercare in un solo campo.

# 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)