Создавайте и выполняйте запросы Elasticsearch на Python эффективно с помощью ElasticsearchDSL

При разработке любого внутреннего API вы могли столкнуться с проблемой больших накладных расходов на операции с базой данных. В этой статье я собираюсь обсудить средство от этих длинных операций с базой данных с помощью Elasticsearch. Не волнуйтесь, если вы новичок в термине Elasticsearch. Я постараюсь покрыть это с нуля.

Что такое Elasticsearch?

По своей сути Elasticsearch (ES) - это распределенная полнотекстовая база данных NoSQL. Благодаря NoSQL он не требует никаких структурированных данных и не использует какой-либо стандартный язык структурированных запросов для поиска. По сути, ES - это поисковая система с открытым исходным кодом, которая хранит, индексирует данные и извлекает их с молниеносной скоростью!

Поскольку он построен на основе движка Lucene и HTTP-интерфейса, он распределяется и невероятно легко масштабируется. Это не просто база данных. Это поисковая система, которая предоставляет возможности поисковой системы, такие как система аналитики и другие связанные функции. Он позволяет хранить, искать и анализировать большие объемы данных быстро и почти в режиме реального времени.

Почему я должен это использовать?

Elasticsearch может быть полезен в различных приложениях. Многие популярные приложения используют возможности поиска в реальном времени, такие как Netflix, Tinder и т. Д. Здесь я опишу некоторые из важных вариантов использования:

Механизм хранения блогов

Рассмотрим сценарий, в котором вы хотите сделать свои блоги доступными для поиска. ES идеально подходит для этого, поскольку в большинстве блогов есть поля поиска, и в идеале эта функция поиска будет давать наиболее релевантные возможные результаты запроса. Традиционный SQL не даст вам своевременных эффективных результатов.

Репозиторий документов

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

Основные концепции Elasticsearch

Хорошо иметь представление об основных элементах ES.

Elasticsearch выполняет поиск NRT (почти в реальном времени), который в основном использует следующие компоненты:

  • Кластер: кластер - это набор из одного или нескольких серверов (узлов), которые вместе хранят данные. Он предоставляет возможности интегрированного индексирования и поиска на всех серверах. Это похоже на экземпляр БД с точки зрения реляционной базы данных. Каждый кластер имеет уникальное имя, при этом кластер по умолчанию называется по умолчанию elasticsearch.
  • Узел: узел - это отдельный сервер, который является частью кластера, хранит данные и участвует в индексировании и поиске кластера. Как и кластер, узел идентифицируется именем, которое по умолчанию является случайным универсальным уникальным идентификатором (UUID).
  • Указатель: указатель - это набор документов с похожими характеристиками. Например, у нас может быть индекс для данных о клиентах и ​​еще один для продаж. Индекс идентифицируется уникальным именем, которое относится к индексу при выполнении индексирования, а также операций поиска, обновления и удаления.
  • Документ: документ - это основная единица информации, которую можно проиндексировать. Например, у вас может быть указатель данных клиента и связанных документов для каждого клиента. Он демонстрируется в формате JSON, что делает его более адаптируемым.
  • Осколки: осколок - это подмножество документов индекса. Elasticsearch предоставляет возможность разделить индекс на несколько частей, называемых осколками. Каждый сегмент сам по себе является полностью функциональным и независимым индексом, который может быть размещен на любом узле в кластере.

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

Настройка среды

Настроить Elasticsearch локально очень просто. Вам просто нужно скачать его и запустить исполняемый файл в соответствии с вашей системой. Убедитесь, что на вашем компьютере установлена ​​Java (движок Lucene построен на Java).

После настройки локальной среды вы можете проверить, работает ли она, нажав http://localhost:9200 в браузере или через cURL. Он должен дать вам такой ответ JSON:

Давайте питонизируем!

Elasticsearch предоставляет REST API для управления данными, но для эффективного использования ES с Python существует официальная библиотека под названием elasticsearch.

Просто нажмите следующую команду, чтобы установить его:

pip install elasticsearch

Теперь в Python мы можем использовать эту библиотеку для подключения к экземпляру ES, запущенному на http: // localhost: 9200 /:

# make sure ES is up and running
from elasticsearch import Elasticsearch
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

Используя экземпляр es, вы можете легко выполнить базовую операцию CRUD.

Теперь, чтобы поиграть с фиктивными данными, давайте сначала вставим данные из JSON. Здесь я собираюсь добавить фиктивные данные клиента, хранящиеся в банке. Вы можете сгенерировать на ваш выбор фиктивный JSON из Генератора JSON.

Выполняя эту функцию, сначала экземпляр ES создает индекс с именем my-index, если он еще не существует, и добавляет каждый dictionary один за другим. Поскольку данные идентичны, ES автоматически выполняет создание индекса. Чтобы перечислить все доступные индексы, вы можете сделать print(es.indices.get_alias("*")).

Запросы используются для получения данных, как и в случае с SQL. Мы можем напрямую выполнить запрос, записав его в форме dict:

body = {'query': {'bool': {'must': [{'match': {'gender': 'male'}},
                                 {'range': {'age': {'gte': 25}}}]}}}
res = es.search(index='my-index', body=body)
pprint(res)

Здесь мы просто говорим ES извлечь вставленные данные my-index, где gender равно male, а age больше или равно 25:

Использование этого подхода для запроса данных может усложнить создание длинных и динамических запросов. К счастью для Python, мы можем упростить его с помощью Elasticsearch DSL.

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

query = Q('match', gender='male') & Q('range', age={'gte': 25})
s = Search(using=es, index='my-index').query(query)
response = s.execute()
for hit in response:
    pprint(hit.name)

Как видите, библиотека предоставляет более удобный и идиоматический способ написания запросов и управления ими. Он остается близким к Elasticsearch JSON DSL, отражая его терминологию и структуру.

Библиотека позаботилась о:

  • Создание подходящих Query объектов по имени (т. Е. «Совпадение», «диапазон»).
  • Составление запросов в составной bool запрос.
  • Обеспечение удобного доступа к данным ответа.
  • Удаление ненужных фигурных или квадратных скобок.

Это всего лишь краткое введение. Вы можете узнать больше о Elasticsearch DSL в документации. Я узнал об этой библиотеке, когда искал альтернативу генерации сложных динамических запросов, и это определенно принесло мне большую пользу. Надеюсь, вы сочтете это полезным!