2012-12-19 10 views
12

Sto cercando di mettere la testa sullo django-haystack tutorial per aggiungere funzionalità di ricerca alla mia applicazione. Sfortunatamente, non capisco bene alcune parti chiave quando si tratta di costruire l'indice di ricerca.Quali campi del modello nel tutorial di django-haystack vengono indicizzati?

Nel tutorial, il seguente modello Django serve come un esempio:

class Note(models.Model): 
    user = models.ForeignKey(User) 
    pub_date = models.DateTimeField() 
    title = models.CharField(max_length=200) 
    body = models.TextField() 

La rispettiva classe di indice per il modello Note è questo:

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    author = indexes.CharField(model_attr='user') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 

    def get_model(self): 
     return Note 

Ultimo ma non meno importante, io sono ha chiesto di creare un modello di dati simile al seguente:

{{ object.title }} 
{{ object.user.get_full_name }} 
{{ object.body }} 

Dopo readi Nell'intero tutorial, sono ancora confuso su cosa si sta indicizzando ora. Per quanto ho capito, il contenuto dei campi author e pub_date verrà utilizzato per creare l'indice. Il campo text è semplicemente per fornire alcune impostazioni. E il modello di dati specifica come i risultati della ricerca verranno visualizzati in seguito, cioè quali campi del modello utilizzare per essere visualizzati nei risultati della ricerca.

È corretto o ho completamente torto? Il tutorial e la documentazione sono piuttosto vaghi in molti aspetti secondo me. Grazie mille in anticipo.

+2

uomo, è digitato esattamente la domanda esatta sono venuto qui a digitare, 2 anni dopo! – GreenAsJade

+2

Uomo, hai digitato esattamente la domanda esatta che sono venuto qui per scrivere, 4 anni dopo! @GreenAsJade Man, hai digitato esattamente il commento che sono venuto qui per scrivere, 2 anni dopo! Ma ho ancora qualcosa da aggiungere. La documentazione è in realtà spazzatura totale. –

risposta

16

Hai ragione, il tutorial sembra un po 'vago, ma ecco come lo capisco. Per ogni istanza del modello Note, Haystack esegue il rendering del modello di dati utilizzando tale istanza e indicizza i modelli di rendering. Il modello renderizzato è il "documento" per l'istanza. Il tutorial dice: "Questo ci permette di utilizzare un modello di dati (piuttosto che una concatenazione incline agli errori) per costruire il documento che il motore di ricerca utilizzerà nella ricerca". Pertanto, se si desidera che il campo title sia ricercabile, includere solo {{ object.title }} nel modello di dati.

Quindi gli altri campi nel modello NoteIndex vengono utilizzati per filtrare i risultati della query di ricerca. Se il modello indice sembrava proprio come questo:

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 

non sarebbe in grado di emettere una query di ricerca che dice: "Dammi tutte le note pubblicati nel corso dell'ultimo anno dove foo compare nel testo del documento. " Se si include pub_date come un campo nel NoteIndex (come fanno nel tutorial) allora si può fare una query come la seguente:

recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5] 

che chiede per i 5 documenti più recentemente pubblicati che contengono la parola foo . Suppongo che, senza includere lo pub_date nel modello NoteIndex, potresti interrogare per content='foo' e poi filtrare i risultati da solo, ma immagino sia una query molto più efficiente se dici a Haystack al momento dell'indicizzazione sui campi che potresti voler filtrare sopra.

Per quanto riguarda la modalità di visualizzazione dei risultati di ricerca, si utilizza un modello diverso per specificarlo. Nell'utilizzo di Haystack più semplice, mostrato nel tutorial, il modello per la visualizzazione dei risultati di ricerca va in search/search.html: http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-template È possibile scorrere i risultati della ricerca e stampare i campi dell'istanza del modello (result.object) che ti piacerebbe.

+1

Grazie mille, Emily, l'hai spiegato molto bene. :) Un punto essenziale che non ho capito è che il campo 'text' è sufficiente per eseguire una ricerca full-text e che gli altri campi vengono utilizzati solo per filtrare ulteriormente i risultati della ricerca. Il tutorial potrebbe essere stato scritto in modo più chiaro perché non ho ottenuto la definizione di * documento * nel contesto della ricerca. Ma ora penso sia chiaro per me. Vielen Dank! :) – pemistahl

2

Nella definizione di classe,

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    author = indexes.CharField(model_attr='user') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 

negozi Haystack l'indice di user attributo del database come author, e l'indice del campo del database pub_date come pub_date nell'indice

Il modello include solo il " campi "ricercabili". Ad esempio, potresti voler salvare alcuni dati sensibili negli indici di ricerca che puoi nascondere dalla ricerca non specificandoli nel modello.

text può essere pensato come ricerca a testo libero

+0

Ah, ho pensato che i campi ricercabili sarebbero già stati definiti specificando i campi che dovrebbero essere indicizzati. Ma le origini dell'indice possono essere diverse dai campi ricercabili. Penso che questo sia quello che non ho capito. Grazie! :) – pemistahl

Problemi correlati