Создавайте и выполняйте запросы 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 runningfrom 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 в документации. Я узнал об этой библиотеке, когда искал альтернативу генерации сложных динамических запросов, и это определенно принесло мне большую пользу. Надеюсь, вы сочтете это полезным!