Spec-Zone.ru › Wagtail 2

Индексация

Чтобы сделать модель поисковой, вам нужно добавить её в поисковый индекс. Все страницы, изображения и документы индексируются автоматически, поэтому вы можете сразу начать их поиск.

Если вы создали дополнительные поля в подклассе страницы или изображения, вы можете добавить эти новые поля в поисковый индекс, чтобы поисковый запрос пользователя соответствовал их содержимому. См. Индексация дополнительных полей для получения информации о том, как это сделать.

Если у вас есть пользовательская модель, которую вы хотите сделать поисковой, см. Индексация пользовательских моделей.

Обновление индекса

Если поисковый индекс хранится отдельно от базы данных (например, при использовании Elasticsearch), вам необходимо поддерживать их синхронизацию. Есть два способа сделать это: использовать обработчики сигналов поиска или периодически вызывать команду update_index. Для лучшей скорости и надёжности рекомендуется использовать оба способа, если это возможно.

Обработчики сигналов

wagtailsearch предоставляет некоторые обработчики сигналов, которые привязаны к сигналам сохранения/удаления всех индексируемых моделей. Это автоматически добавит и удалит их из всех зарегистрированных вами бэкэндов в WAGTAILSEARCH_BACKENDS. Эти обработчики сигналов автоматически регистрируются при загрузке приложения wagtail.search.

В некоторых случаях вы можете не захотеть, чтобы ваше содержимое автоматически переиндексировалось, и вместо этого полагаться на команду update_index для индексации. Если вам нужно отключить эти обработчики сигналов, используйте один из следующих методов:

Отключение автоматического обновления обработчиков сигналов для модели

Вы можете отключить обработчики сигналов для отдельной модели, добавив search_auto_update = False в качестве атрибута класса модели.

Отключение автоматического обновления обработчиков сигналов для поискового бэкенда/всего сайта

Вы можете отключить обработчики сигналов для всего поискового бэкенда, установив значение AUTO_UPDATE бэкенда в False.

Если у всех поисковых бэкэндов AUTO_UPDATE установлено в False, обработчики сигналов будут полностью отключены для всего сайта.

Документацию по настройке AUTO_UPDATE см. в AUTO_UPDATE.

Команда update_index

Wagtail также предоставляет команду для перестроения индекса с нуля.

./manage.py update_index

Рекомендуется запускать эту команду один раз в неделю и в следующие моменты:

  • всё время, когда страницы были созданы через скрипт (например, после импорта)
  • всякий раз, когда были внесены изменения в модели или настройку поиска

Во время выполнения этой команды поиск может не возвращать никаких результатов, поэтому избегайте запуска в пиковые часы.

Примечание

Команда update_index также алиасирована как wagtail_update_index, для использования, когда другой установленный пакет (например, Haystack) предоставляет конфликтующую команду update_index. В этом случае запись другого пакета в INSTALLED_APPS должна находиться выше wagtail.search, чтобы его команда update_index имела приоритет над командой Wagtail.

Индексация дополнительных полей

Для возможности поиска/фильтрации по ним поля необходимо явно добавить в свойство search_fields вашей модели, унаследованной от Page. Это делается путём переопределения search_fields для добавления списка дополнительных объектов SearchField/FilterField.

Пример

Это создаёт модель EventPage с двумя полями: description и date. description индексируется как SearchField, а date индексируется как FilterField.

from wagtail.search import index
from django.utils import timezone

class EventPage(Page):
    description = models.TextField()
    date = models.DateField()

    search_fields = Page.search_fields + [ # Inherit search_fields from Page
        index.SearchField('description'),
        index.FilterField('date'),
    ]


# Get future events which contain the string "Christmas" in the title or description
>>> EventPage.objects.filter(date__gt=timezone.now()).search("Christmas")

index.SearchField

Они используются для выполнения полнотекстового поиска по моделям, обычно для текстовых полей.

Параметры

  • partial_match (boolean) - Установка этого значения в true позволяет сопоставлять результаты по частям слов. Например, это значение установлено для поля title по умолчанию, поэтому страница с названием Hello World! будет найдена, если пользователь введёт только Hel в поле поиска.
  • boost (int/float) - Это позволяет назначить поля более важными, чем другие. Установка высокого значения для поля приведет к тому, что страницы с совпадениями в этом поле будут ранжироваться выше. По умолчанию для поля Page title это значение установлено в 2, а для всех остальных полей — в 1.
  • es_extra (dict) - Это поле позволяет разработчику устанавливать или переопределять любые настройки поля в карте Elasticsearch. Используйте его, если вы хотите использовать любые функции Elasticsearch, которые ещё не поддерживаются в Wagtail.

index.AutocompleteField

Они используются для запросов автозаполнения, которые сопоставляют части слов. Например, страница с названием Hello World! будет найдена, если пользователь введёт только Hel в поле поиска.

Этот параметр принимает те же параметры, что и index.SearchField (за исключением partial_match, который не имеет эффекта).

Совет

Индексируйте только поля, которые отображаются в результатах поиска с index.AutocompleteField. Это позволяет пользователям видеть любые слова, по которым было выполнено частичное соответствие.

index.FilterField

Они добавляются в поисковый индекс, но не используются для полнотекстового поиска. Вместо этого они позволяют вам применять фильтры к результатам поиска.

index.RelatedFields

Это позволяет индексировать поля из связанных объектов. Это работает со всеми типами связанных полей, включая их обратные аксессоры.

Например, если у нас есть книга, связанная с автором, мы можем вложить поля name и date_of_birth автора в книгу:

from wagtail.search import index

class Book(models.Model, index.Indexed):
    ...

    search_fields = [
        index.SearchField('title'),
        index.FilterField('published_date'),

        index.RelatedFields('author', [
            index.SearchField('name'),
            index.FilterField('date_of_birth'),
        ]),
    ]

Это позволит вам искать книги по имени автора.

Это также работает в обратную сторону. Вы можете индексировать книги автора, что позволит искать автора по названиям опубликованных им книг:

from wagtail.search import index

class Author(models.Model, index.Indexed):
    ...

    search_fields = [
        index.SearchField('name'),
        index.FilterField('date_of_birth'),

        index.RelatedFields('books', [
            index.SearchField('title'),
            index.FilterField('published_date'),
        ]),
    ]

Фильтрация по index.RelatedFields

Невозможно фильтровать по каким-либо index.FilterFields в index.RelatedFields с помощью API QuerySet. Однако поля индексируются, поэтому их можно использовать, выполняя запросы к Elasticsearch вручную.

Фильтрация по index.RelatedFields с помощью API QuerySet запланирована на будущую версию Wagtail.

Индексация вызываемых объектов и других атрибутов

Примечание

Это не поддерживается в Бэкенде базы данных (по умолчанию)

Поля поиска/фильтра не должны быть полями модели Django. Они также могут быть любым методом или атрибутом вашего класса модели.

Одним из применений этого является индексация методов get_*_display Django, которые автоматически создаются для полей с выбором.

from wagtail.search import index

class EventPage(Page):
    IS_PRIVATE_CHOICES = (
        (False, "Public"),
        (True, "Private"),
    )

    is_private = models.BooleanField(choices=IS_PRIVATE_CHOICES)

    search_fields = Page.search_fields + [
        # Index the human-readable string for searching.
        index.SearchField('get_is_private_display'),

        # Index the boolean value for filtering.
        index.FilterField('is_private'),
    ]

Вызываемые объекты также предоставляют способ индексации полей из связанных моделей. В примере из Встроенных панелей и кластеров моделей для индексации каждой BookPage по названиям её связанных ссылок:

class BookPage(Page):
    # ...
    def get_related_link_titles(self):
        # Get list of titles and concatenate them
        return '\n'.join(self.related_links.all().values_list('name', flat=True))

    search_fields = Page.search_fields + [
        # ...
        index.SearchField('get_related_link_titles'),
    ]

Индексация пользовательских моделей

Любая модель Django может быть индексирована и по ней можно выполнять поиск.

Для этого унаследуйтесь от index.Indexed и добавьте некоторые search_fields в модель.

from wagtail.search import index

class Book(index.Indexed, models.Model):
    title = models.CharField(max_length=255)
    genre = models.CharField(max_length=255, choices=GENRE_CHOICES)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateTimeField()

    search_fields = [
        index.SearchField('title', partial_match=True, boost=10),
        index.SearchField('get_genre_display'),

        index.FilterField('genre'),
        index.FilterField('author'),
        index.FilterField('published_date'),
    ]

# As this model doesn't have a search method in its QuerySet, we have to call search directly on the backend
>>> from wagtail.search.backends import get_search_backend
>>> s = get_search_backend()

# Run a search for a book by Roald Dahl
>>> roald_dahl = Author.objects.get(name="Roald Dahl")
>>> s.search("chocolate factory", Book.objects.filter(author=roald_dahl))
[<Book: Charlie and the chocolate factory>]
  • Предыдущая Поиск
  • Следующая Поиск

Содержание страницы

  • Индексация
    • Обновление индекса
      • Обработчики сигналов
        • Отключение автоматического обновления обработчиков сигналов для модели
        • Отключение автоматического обновления обработчиков сигналов для поискового бэкенда/всего сайта
      • Команда update_index
    • Индексация дополнительных полей
      • Пример
      • index.SearchField
        • Параметры
      • index.AutocompleteField
      • index.FilterField
      • index.RelatedFields
      • Индексация вызываемых объектов и других атрибутов
    • Индексация пользовательских моделей

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v2.16.3/topics/search/indexing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API