Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Django
Code

Как индексировать и запрашивать данные с Haystack и Elasticsearch в Python

by
Length:MediumLanguages:

Russian (Pусский) translation by Anna k.Ivanova (you can also view the original English article)

Haystack

Haystack - это библиотека Python, которая обеспечивает модульный поиск для Django. Она имеет API, который обеспечивает поддержку различных поисковых бэкэндов, таких как Elasticsearch, Whoosh, Xapian и Solr.

Elasticsearch

Elasticsearch - популярная поисковая система Lucene, способная выполнять полнотекстовый поиск, и она разработана на Java.

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

Elastic Search and Google

Установите Django Haystack и Elasticsearch

Первый шаг - настроить Elasticsearch и запустить его локально на вашей машине. Elasticsearch требует Java, поэтому на вашем компьютере должна быть установлена Java.

Мы собираемся следовать инструкциям с сайта Elasticsearch.

Загрузите архив Elasticsearch 1.4.5 следующим образом:

Извлеките его следующим образом:

Затем он создаст пакет файлов и папок в вашем текущем каталоге. Затем мы идем в каталог bin следующим образом:

Запустите Elasticsearch следующим образом.

Чтобы убедиться, что он успешно установлен, перейдите по адресу http://127.0.0.1:9200/, и вы должны увидеть что-то вроде этого.

Убедитесь, что у вас также есть haystack.

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

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

Давайте создадим приложение для клиентов.

settings.py Конфигурации

Чтобы использовать Elasticsearch для индексирования нашего контента, доступного для поиска, нам нужно определить внутренний параметр для стога сена в файле settings.py нашего проекта. Мы собираемся использовать Elasticsearch в качестве нашего бэкенда.

HAYSTACK_CONNECTIONS является обязательным параметром и должен выглядеть следующим образом:

В файле settings.py мы также собираемся добавить haystack и клиентов в список installed apps.

Создаваем модели

Давайте создадим модель для клиентов. В customers/models.py добавьте следующий код.

Зарегистрируйте свою модель Customer в admin.py следующим образом:

Создаем базу данных и Super User

Примените ваши миграции и создайте учетную запись администратора.

Запустите свой сервер и перейдите по адресу http://localhost:8000/admin/. Теперь вы сможете увидеть свою модель клиента там. Двигаемся дальше и добавляем новых клиентов в админку.

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

Чтобы проиндексировать наши модели, мы начинаем с создания SearchIndex. Объекты SearchIndex определяют, какие данные должны быть помещены в поисковый индекс. Каждый тип модели должен иметь уникальный searchIndex.

Объекты SearchIndex - это способ, которым haystack определяет, какие данные должны быть помещены в поисковый индекс, и обрабатывает поток данных. Чтобы построить SearchIndex, мы собираемся наследовать от indexes.SearchIndex и indexes.Indexable, определяем поля, которые мы хотим сохраните наши данные с помощью и определите метод get_model.

Давайте создадим CustomerIndex, чтобы соответствовать моделированию наших Customer. Создайте файл search_indexes.py в каталоге приложения клиентов и добавьте следующий код.

EdgeNgramField - это поле в haystack SearchIndex, которое предотвращает неправильные совпадения, когда части двух разных слов смешиваются друг с другом.

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

document=True указывает основное поле для поиска внутри. Кроме того, use_template=True в поле text позволяет нам использовать шаблон данных для построения документа, который будет проиндексирован.

Давайте создадим шаблон в каталоге шаблонов наших клиентов. Внутри search/indexes/customers/customers_text.txt добавьте следующее:

Переиндексируем данные

Теперь, когда наши данные находятся в базе данных, пришло время добавить их в наш поисковый индекс. Для этого просто запустите ./manage.py rebuild_index. Вы получите итоги того, сколько моделей было обработано и помещено в индекс.

Кроме того, вы можете использовать RealtimeSignalProcessor, который автоматически обрабатывает обновления/удаления для вас. Чтобы использовать его, добавьте следующее в файл settings.py.

Запрос данных

Мы будем использовать шаблон поиска и Haystack API для запроса данных.

Шаблон поиска

Добавьте URL-адреса стога сена в ваш URLconf.

Давайте создадим наш шаблон поиска. В templates/search.html добавьте следующий код.

Page.object_list - это список объектов SearchResult, который позволяет нам получить отдельные объекты модели, например, result.first_name.

Ваша полная структура проекта должна выглядеть примерно так:

The project directory structure

Теперь запустите сервер, перейдите к 127.0.0.1:8000/search/ и выполните поиск, как показано ниже.

Running a search on a local server

Поиск Albert даст результаты всех клиентов с именем Albert. Если ни один клиент не имеет имени Albert, то запрос даст пустые результаты. Не стесняйтесь поиграть со своими собственными данными.

Haystack API

В Haystack есть класс SearchQuerySet, который разработан для упрощения и согласованности выполнения поиска и повторения результатов. Большая часть API SearchQuerySet знакома с ORM QuerySet от Django.

В customer/views.py добавьте следующий код:

autocomplete - это быстрый способ поиска автозаполнения. Он должен быть запущен для полей, которые являются либо EdgeNgramField, либо NgramField.

В приведенном выше Queryset мы используем метод contains, чтобы фильтровать наш поиск, чтобы получать только результаты, содержащие наши определенные символы. Например, Al будет получать только данные о клиентах, которые содержат Al. Обратите внимание, что результаты будут получены только из полей, определенных в файле customer_text.txt.

The results of a query

Помимо поиска полей contains Field Lookup, есть другие доступные поля для выполнения запросов, в том числе:

  • content
  • contains
  • exact
  • gt
  • gte
  • lt
  • lte
  • in
  • startswith
  • endswith
  • range
  • fuzzy

Заключение

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

Elasticsearch также широко используется для поиска контента, анализа данных и запросов. Для получения дополнительной информации посетите сайты Haystack и Elasticsearch.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.