Spec-Zone.ru › Wagtail 3

Индексирование

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

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

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

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

Если индекс поиска хранится отдельно от базы данных (например, при использовании 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 позволяет сопоставлять результаты с частями слов. Например, это установлено по умолчанию для поля заголовка, поэтому страница с заголовком Hello World! будет найдена, если пользователь введёт только Hel в поле поиска.
  • boost (int/float) - Это позволяет задавать поля, имеющие большее значение, чем другие. Установка высокого значения для поля приведет к тому, что страницы с совпадениями в этом поле будут ранжироваться выше. По умолчанию это 2 для поля заголовка страницы и 1 для всех других полей.
  • es_extra (dict) - Это поле позволяет разработчику задать или переопределить любой параметр поля в отображении Elasticsearch. Используйте это, если вы хотите использовать возможности Elasticsearch, которые ещё не поддерживаются Wagtail.

index.AutocompleteField

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

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

Подсказка

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

index.FilterField

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

index.RelatedFields

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

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

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 по названиям её related_links:

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>]

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

Spec-Zone.ru

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