from haystack import indexes
from blog.models import Post
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
author = indexes.CharField(model_attr='author__username')
published_at = indexes.DateTimeField(model_attr='published_at')
def get_model(self):
return Post
def index_queryset(self, using=None):
"""Only index published posts."""
return self.get_model().objects.filter(status='published')
from haystack.query import SearchQuerySet
from django.shortcuts import render
def search_view(request):
query = request.GET.get('q', '')
if query:
results = SearchQuerySet().filter(content=query).load_all()
# Faceting
results = results.facet('author')
# Highlighting
results = results.highlight()
else:
results = []
return render(request, 'search/results.html', {
'results': results,
'query': query
})
Haystack provides unified search across backends (Elasticsearch, Solr, Whoosh). I define search indexes mapping models to searchable fields. It handles full-text search, faceting, and highlighting. The SearchQuerySet API is similar to Django's ORM. I use SearchIndex classes to specify indexed fields and document preparation. For autocomplete, I use edge n-grams. Haystack supports real-time indexing via signals or batch updates. This enables Google-like search in Django apps without writing backend-specific code.