pip install django-haystack
python
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'my_project_index',
},
}
python
from haystack import indexes
from myapp.models import MyModel
class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return MyModel
def index_queryset(self, using=None):
return self.get_model().objects.all()
python
from django.urls import path
from haystack.views import SearchView
urlpatterns = [
path('search/', SearchView(), name='haystack_search'),
]
python
from django import forms
class SearchForm(forms.Form):
query = forms.CharField(label='Search')
python
from django.shortcuts import render
from haystack.query import SearchQuerySet
def search(request):
form = SearchForm(request.GET)
results = []
if form.is_valid():
query = form.cleaned_data['query']
results = SearchQuerySet().filter(content=query)
return render(request, 'search.html', {'form': form, 'results': results})
html
<form method="get" action="{% url 'haystack_search' %}">
{{ form.as_p }}
<button type="submit">Search</button>
</form>
{% if results.count > 0 %}
<ul>
{% for result in results %}
<li>{{ result.object }}</li>
{% endfor %}
</ul>
{% else %}
<p>No results found.</p>
{% endif %}