Подтвердить что ты не робот

Какие поля модели в учебнике django-haystack индексируются?

Я пытаюсь придумать учебник django-haystack, чтобы добавить функции поиска в мое приложение. К сожалению, я не совсем понимаю некоторые ключевые моменты, когда дело доходит до построения индекса поиска.

В учебнике приведена следующая модель django:

class Note(models.Model):
    user = models.ForeignKey(User)
    pub_date = models.DateTimeField()
    title = models.CharField(max_length=200)
    body = models.TextField()

Соответствующий индексный класс для модели Note таков:

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    author = indexes.CharField(model_attr='user')
    pub_date = indexes.DateTimeField(model_attr='pub_date')

    def get_model(self):
        return Note

И последнее, но не менее важное: меня попросят создать шаблон данных, который выглядит так:

{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}

Прочитав весь учебник, я все еще смущен тем, что сейчас индексируется. Насколько я понимаю, для создания индекса будет использоваться содержимое полей author и pub_date. Поле text просто для предоставления некоторых настроек. Шаблон данных указывает, как будут отображаться результаты поиска позже, то есть, какие поля модели будут отображаться в результатах поиска.

Является ли это правильным или я совершенно неправ? На мой взгляд, учебник и документация довольно расплывчаты во многих аспектах. Большое вам спасибо заранее.

4b9b3361

Ответ 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), которые вы хотите.

Ответ 2

В определении вашего класса

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    author = indexes.CharField(model_attr='user')
    pub_date = indexes.DateTimeField(model_attr='pub_date')

Haystack хранит индекс атрибута user базы данных как author, а индекс поля базы данных pub_date как pub_date в индексе

Шаблон включает только поля поиска. Например, вы можете сохранить некоторые конфиденциальные данные в индексах поиска, которые вы можете скрыть от поиска, не указав его в шаблоне.

text можно рассматривать как свободный текстовый поиск