Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django-haystack ordering - How do I handle this?

I'm using django-haystack for a search page on my site. I'm basically done, but not quite happy with the ordering and not quite sure how haystack decides how to order everything.

I know I can over-ride the SearchQuerySet by using order_by but that over-rides it entirely. Let's say I want to force the search to order by in stock (BooleanField), so that the products that are in stock show up on top, but then do everything else as it normally would. How do I do that?

I tried doing order_by('-in_stock', 'content') figure content was what it used by default but it produces very different results from if I just leave it to do its own ordering.

Thanks for any input on this matter!

like image 731
Bartek Avatar asked Jun 08 '10 17:06

Bartek


2 Answers

You must have a index in your search_indexes.py with in_stock:

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

and in your urls:

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

In this way, you show the results first if they are in stock and then by score!

like image 195
diegueus9 Avatar answered Sep 28 '22 17:09

diegueus9


To sort on a CharField, make it storable, but not indexable.

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

If you need to have it sortable and indexable, use two different fields in the SearchIndex.

like image 22
mexekanez Avatar answered Sep 28 '22 19:09

mexekanez