Django Haystack

django-haystack предоставляет модульную архитектуру поиска для Django с поддержкой различных движков.

Установка

1# Установка пакета
2pip install django-haystack elasticsearch
1# Или через Poetry
2poetry add django-haystack elasticsearch

Настройка

 1# settings.py
 2INSTALLED_APPS = [
 3    'haystack',
 4]
 5
 6HAYSTACK_CONNECTIONS = {
 7    'default': {
 8        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
 9        'URL': 'http://127.0.0.1:9200/',
10        'INDEX_NAME': 'haystack',
11    },
12}

Создание индексов

 1# search_indexes.py
 2from haystack import indexes
 3from .models import Book
 4
 5class BookIndex(indexes.SearchIndex, indexes.Indexable):
 6    text = indexes.CharField(document=True, use_template=True)
 7    title = indexes.CharField(model_attr='title')
 8    author = indexes.CharField(model_attr='author__name')
 9    published_date = indexes.DateTimeField(model_attr='published_date')
10
11    def get_model(self):
12        return Book
13
14    def index_queryset(self, using=None):
15        return self.get_model().objects.all()

Шаблон для поиска

1<!-- templates/search/indexes/myapp/book_text.txt -->
2{{ object.title }}
3{{ object.author.name }}
4{{ object.description }}

Использование поиска

 1from haystack.query import SearchQuerySet
 2
 3# Простой поиск
 4results = SearchQuerySet().filter(content='python')
 5
 6# Поиск по полям
 7results = SearchQuerySet().filter(title='Django')
 8
 9# Комбинированный поиск
10results = SearchQuerySet().filter(
11    content='python',
12    author='John Doe'
13).order_by('-published_date')

FAQ

Q: Как обновлять индекс автоматически?
A: Используй RealtimeSignalProcessor в настройках.

Q: Можно ли использовать без Elasticsearch?
A: Да, поддерживаются Whoosh, Solr и другие движки.