Построение indexes
Теперь необходимо зарегистрировать модели, которые требуется сохранить в поисковой механизме. Конвенция для Haystack гласит что нужно создать файл search_indexes.py в приложении и зарегестрировать там свои модели. Создайте новый файл в каталоге приложения блога и назовите его search_indexes.py. Добавьте в него следующий код:
from haystack import indexes
from .models import Post
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
def get_model(self):
return Post
def index_queryset(self, using=None):
return self.get_model().published.all()
Это пользовательская настройка SearchIndex для модели Post. С помощью этого индекса мы говорим Haystack, какие данные из этой модели должны индексироваться в поисковом механизме. Индекс строится по индексам подкласса indexes.SearchIndex и indexes.Indexable. Каждый SearchIndex требует, чтобы одно из его полей имело document=True. Конвенция говорит нам назвать это поле text. Это поле является основным полем поиска. С use_template=True, мы говорим Haystack, что это поле будет отображаться в шаблоне данных для построения документа, который будет индексироваться поисковым механизмом. Поле publish — это поле datetime, которое будет также индексироваться. Мы указали, что это поле соответствует полю публикации модели Post, используя параметр model_attr. Поле будет индексироваться с содержимым поля publish индексированного объекта Post.
Дополнительные поля, подобные этому, полезны для предоставления дополнительных фильтров для поиска. Метод get_model() должен вернуть модель для документов, которые будут храниться в этом индексе. Метод index_queryset() возвращает QuerySet для объектов, которые будут индексироваться. Обратите внимание, что индексироваться будут только опубликованные записи.
Теперь создайте файл search/indexes/blog/post_text.txt в каталоге шаблонов приложения блога и добавьте в него следующий код:
{{ object.title }}
{{ object.tags.all|join:", " }}
{{ object.body }}
Это путь по умолчанию для шаблона документа для поля text нашего индекса. Haystack использует имя приложения и имя модели для динамического построения пути. Каждый раз, когда мы собираемся индексировать объект, Haystack будет строить документ на основе этого шаблона, а затем индексировать документ в поисковой механизме Solr.
Теперь, когда у нас есть пользовательский search index, необходимо создать соответствующую схему Solr. Конфигурация Solr основана на XML, поэтому необходимо создать схему XML для данных, которые мы собираемся индексировать. К счастью, Haystack предлагает способ динамического создания схемы на основе наших индексов поиска. Откройте терминал и выполните следующую команду:
python manage.py build_solr_schema
Необходимо просмотреть выходные данные XML. Если взглянуть на нижнюю часть созданного кода XML, вы увидите, что поля PostIndex, Haystack генерирует автоматически:
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="publish" type="date" indexed="true" stored="true" multiValued="false" />
Скопируйте все выходные данные XML из исходного тега <?xml version="1.0" ?>
до тега </schema>
Этот XML-это схема для индексации данных в Solr. Вставьте новую схему в файл blog/conf/schema.xml в каталоге установки Solr. Файл schema.xml включается в код, который поставляется вместе с этой главой, поэтому можно также скопировать.
Откройте http://127.0.0.1:8983/Solr/ в браузере и перейдите на вкладку Core Admin, затем щелкните в blog, а затем нажмите кнопку Reload:
Мы перегрузили ядро, чтобы оно учитывало изменения из schema.xml. Когда ядро завершит перезагрузку, Новая схема будет готова к индексированию новых данных.