DjangoDjango

Sorting on chardfields in Haystack and Elasticsearch

Mar 23, 2014 · Updated: Jul 12, 2021 · by Tim Kamanin

Current version on Haystack (2.10) combined with Elasticsearch produces weird results when you want to sort search results on charfield, the issue has been reported here https://github.com/toastdriven/django-haystack/issues/866 and here: https://github.com/toastdriven/django-haystack/issues/569

Long story short, to fix the problem you need to set indexed=False and stored=True on CharFields that you want to use for sorting.

You should also set indexed=False on BooleanFields (if there are any in the search index model). Here's an example how the correct module would look like:

class BlogIndex(indexes.SearchIndex, indexes.Indexable):
    title = indexes.CharField(model_attr="title")
    sorted_name = indexes.CharField(model_attr="title", indexed=False, stored=True)
    text = indexes.CharField(document=True, use_template=True)
    active = indexes.BooleanField(model_attr="active", indexed=False)

As you see above, we have created two fields for model_attr='title', first is regular, called title, the second one is sorted_name that is used for sorts. We also set Boolean 'active' as non-indexed, however it'll work for your search filters, it just won't get tokenized (yep, strange, but fact).

Hey, if you've found this useful, please share the post to help other folks find it:

There's even more:

Subscribe for updates

  • via Twitter: @timonweb
  • old school RSS:
  • or evergreen email ↓ ↓ ↓