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!
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!
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With