2010-06-08 18 views
8

Uso il django-haystack per una pagina di ricerca sul mio sito. Fondamentalmente ho finito, ma non sono abbastanza soddisfatto dell'ordinamento e non sono abbastanza sicuro di come il pagliaio decida come ordinare tutto.ordinamento django-haystack - Come posso gestire questo?

So che posso scavalcare il SearchQuerySet utilizzando order_by ma che lo supera completamente. Diciamo che voglio forzare la ricerca per ordinare in magazzino (BooleanField), in modo che i prodotti disponibili siano visualizzati in cima, ma poi fare tutto il resto come normalmente farebbe. Come lo faccio?

Ho provato a fare order_by('-in_stock', 'content') il contenuto della figura era quello che usava di default ma produce risultati molto diversi da se lo lascio fare il suo stesso ordine.

Grazie per qualsiasi input su questo argomento!

risposta

18

È necessario disporre di un indice in search_indexes.py con in_magazzino:

class YourModel(indexes.SearchIndex): 
    in_stock = indexes.BooleanField(model_attr='model_in_stock') 

e negli URL:

sqs = SearchQuerySet().models(YourModel).order_by('-in_stock', 'score') # score is a field of haystack 

In questo modo, si mostrano i risultati del primo caso sono in azione e poi per punteggio!

+0

E se il mio campo personalizzato dovesse avere lo stesso nome "punteggio"? – eugene

+0

è possibile che la versione corrente di Haystack non supporti l'ordinamento in base al punteggio? Ho ottenuto l'errore KeyError: Nessun campo chiamato 'score'' – maciek

+0

Ho appena controllato i documenti e dovrebbe ancora funzionare, potresti mostrarmi un po' di più del tuo codice con http://dpaste.com? – diegueus9

2

Per ordinare su un CharField, renderlo memorizzabile, ma non indicizzabile.

sorted_name = indexes.CharField(indexed=False, stored=True) 

Se è necessario renderlo ordinabile e indicizzabile, utilizzare due campi diversi in SearchIndex.

Problemi correlati