pip install django-haystack
python
INSTALLED_APPS = [
...
'haystack',
...
]
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'my_index',
},
}
python
from haystack import indexes
from .models import MyModel
class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
content = indexes.CharField(model_attr='content')
def get_model(self):
return MyModel
def index_queryset(self, using=None):
return self.get_model().objects.all()
def search(self, query=None, sort_by=None, **kwargs):
queryset = super(MyModelIndex, self).search(query, **kwargs)
if sort_by == 'title':
queryset = queryset.order_by('title')
elif sort_by == 'content':
queryset = queryset.order_by('content')
return queryset
python
from haystack.query import SearchQuerySet
def search_view(request):
query = request.GET.get('q', '')
sort_by = request.GET.get('sort_by', None)
search_results = SearchQuerySet().models(MyModel).filter(content=query).order_by('-pub_date')
if sort_by:
search_results = search_results.load_all().auto_query(query).models(MyModel).filter(content=query).order_by()
return render(request, 'search_results.html', {'results': search_results})