Ответ 1
Вы правы, учебник кажется немного расплывчатым, но вот как я это понимаю. Для каждого экземпляра модели Note
Haystack отображает шаблон данных с использованием этого экземпляра и индексирует созданные шаблоны. Представленный шаблон является "документом" для экземпляра. В учебнике говорится: "Это позволяет нам использовать шаблон данных (а не конкатенацию с ошибкой) для создания документа, который поисковая система будет использовать при поиске". Поэтому, если вы хотите, чтобы поле title
было доступно для поиска, вы включили бы только {{ object.title }}
в шаблон данных.
Таким образом, другие поля в модели NoteIndex
используются для фильтрации результатов поискового запроса. Если ваша индексная модель выглядит так:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
вы не сможете опубликовать поисковый запрос, который говорит: "Дайте мне все заметки, опубликованные в прошлом году, где foo
появляется в тексте документа". Если вы включили pub_date
в качестве поля в NoteIndex
(как и в учебнике), вы можете сделать такой запрос, как:
recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5]
который запрашивает 5 последних опубликованных документов, содержащих слово foo
. Я полагаю, что, не включая pub_date
в модели NoteIndex
, вы можете запросить content='foo'
, а затем сами фильтровать результаты, но я бы представлял, что это гораздо более эффективный запрос, если вы сообщите Haystack об индексировании времени поля, которые вы можете фильтровать.
Что касается того, как будут отображаться результаты поиска, для его указания используется другой шаблон. В самом основном использовании Haystack, которое они показывают в учебнике, шаблон для отображения результатов поиска находится в search/search.html: http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-template
Вы можете выполнить итерацию результатов поиска и распечатать все поля экземпляра модели (result.object
), которые вы хотите.