Elasticsearch-py – работа с Elasticsearch

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Elasticsearch — это распределённая поисковая система на базе Apache Lucene. Она широко используется для полнотекстового поиска, логирования, мониторинга и аналитики. Чтобы работать с Elasticsearch из Python, используется официальный клиент — elasticsearch-py, который предоставляет доступ ко всем API Elasticsearch через Python-код.

Elasticsearch-py – работа с Elasticsearch позволяет реализовать продвинутый поиск, агрегации и обработку больших объёмов данных напрямую в Python-приложениях, включая веб-сервисы, аналитические инструменты и системы мониторинга.

Установка и подключение к кластеру

Установка

bash
pip install elasticsearch

Подключение к локальному кластеру

python
from elasticsearch import Elasticsearch es = Elasticsearch("http://localhost:9200")

Подключение к удалённому кластеру с авторизацией

python
es = Elasticsearch( "https://your-cluster:9200", basic_auth=("user", "password"), verify_certs=True )

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

  • Индекс — аналог таблицы в реляционных БД

  • Документ — JSON-объект, хранящийся в индексе

  • Поле — атрибут документа

  • Маппинг (mapping) — описание структуры документа и типов полей

Создание индексов и схем

python
mapping = { "mappings": { "properties": { "title": {"type": "text"}, "tags": {"type": "keyword"}, "published": {"type": "date"} } } } es.indices.create(index="articles", body=mapping)

Удаление индекса:

python
es.indices.delete(index="articles")

Проверка существования:

python
es.indices.exists(index="articles")

Добавление, обновление и удаление документов

Добавление документа

python
doc = {"title": "Elasticsearch для начинающих", "tags": ["поиск", "данные"], "published": "2024-01-01"} es.index(index="articles", id=1, document=doc)

Обновление

python
es.update(index="articles", id=1, doc={"title": "Обновлённый заголовок"})

Удаление

python
es.delete(index="articles", id=1)

Поиск и фильтрация данных

Простой поиск

python
query = {"query": {"match": {"title": "Elasticsearch"}}} response = es.search(index="articles", body=query)

Фильтрация и булевы запросы

python
query = { "query": { "bool": { "must": [{"match": {"title": "поиск"}}], "filter": [{"term": {"tags": "данные"}}] } } }

Пагинация:

python
es.search(index="articles", body=query, from_=0, size=10)

Анализаторы и полнотекстовый поиск

Elasticsearch использует анализаторы для разбиения текста на токены:

python
query = {"query": {"match_phrase": {"title": "поиск данных"}}}

Поддерживаются запросы:

  • match

  • multi_match

  • wildcard

  • regexp

  • fuzzy

Агрегации и аналитика

Пример агрегации по полю tags:

python
query = { "size": 0, "aggs": { "tags_count": { "terms": {"field": "tags"} } } }

Вывод статистики:

python
{ "aggs": { "dates": {"date_histogram": {"field": "published", "calendar_interval": "month"}} } }

Работа с Bulk API

Массовая загрузка данных:

python
from elasticsearch.helpers import bulk actions = [ {"_index": "articles", "_id": i, "_source": {"title": f"Article {i}"}} for i in range(100) ] bulk(es, actions)

Обработка ошибок и управление статусами

python
from elasticsearch.exceptions import NotFoundError try: es.get(index="articles", id=999) except NotFoundError: print("Документ не найден")

Интеграция с Pandas и визуализация

python
import pandas as pd res = es.search(index="articles", body=query, size=1000) docs = [hit["_source"] for hit in res["hits"]["hits"]] df = pd.DataFrame(docs)

Визуализация данных возможна через Kibana или Plotly, Matplotlib, Seaborn.

Интеграция с Django, FastAPI, Flask

Django

Можно создать индекс и использовать его для полнотекстового поиска по моделям.

FastAPI

Elasticsearch подключается как сервис через dependency:

python
def get_es(): return Elasticsearch("http://localhost:9200")

Flask

Подключение клиента при инициализации приложения и использование в маршрутах.

Безопасность и авторизация

  • Используйте HTTPS-соединения

  • Настраивайте basic_auth, API ключи, IAM в Elastic Cloud

  • Ограничивайте доступ по ролям и индексам

Сравнение с другими решениями

Решение Поиск Агрегации Скорость Интеграция
Elasticsearch Да Да Очень высокая Да
PostgreSQL FTS Да Ограничено Средняя Да
Typesense Да Частично Высокая REST API
Meilisearch Да Частично Очень высокая Ограниченно

Тестирование с Elasticsearch-py

  • Используйте docker-compose с тестовым кластером

  • Создавайте отдельный тестовый индекс

  • Очищайте индекс после тестов: es.indices.delete(index="test_index")

Часто задаваемые вопросы (FAQ)

1. Что такое elasticsearch-py?
Официальный Python-клиент для подключения к Elasticsearch.

2. Можно ли использовать Elasticsearch как основную базу данных?
Нет, он предназначен для поиска и аналитики, а не хранения критичных данных.

3. Поддерживает ли elasticsearch-py работу с кластером?
Да, клиент автоматически балансирует нагрузку между узлами.

4. Как загружать много данных?
Используйте bulk() из модуля helpers.

5. Как выполнять агрегации?
Через ключ aggs в теле запроса.

6. Подходит ли Elasticsearch для автодополнения и поиска по фильтрам?
Да, это одно из его сильных применений.

Полный справочник по ключевым функциям и модулям библиотеки Elasticsearch-py для Python

Установка

bash
pip install elasticsearch

Убедитесь, что Elasticsearch-сервер работает (локально или удалённо).


Подключение к кластеру

Метод Описание
Elasticsearch(...) Создание клиента с указанием хоста и параметров.
python
from elasticsearch import Elasticsearch es = Elasticsearch("http://localhost:9200")

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

Метод Описание
index(index, id, document) Индексирует (добавляет/обновляет) документ.
create(index, id, document) Создает документ, если его ещё нет.
python
doc = {"user": "Ваня", "message": "Привет, Elasticsearch!"} es.index(index="messages", id=1, document=doc)

Получение и удаление документов

Метод Описание
get(index, id) Получить документ по ID.
exists(index, id) Проверка существования документа.
delete(index, id) Удаляет документ.
python
es.get(index="messages", id=1)

Поиск документов

Метод Описание
search(index, query={...}) Выполняет запрос поиска.
match, term, bool, range и др. Основные типы запросов.
python
query = { "query": { "match": { "message": "привет" } } } res = es.search(index="messages", query=query)

Обновление документов

Метод Описание
update(index, id, doc) Частичное обновление документа.
python
es.update(index="messages", id=1, doc={"doc": {"user": "Петя"}})

Управление индексами

Метод Описание
indices.create(index, body) Создание индекса с настройками и маппингом.
indices.delete(index) Удаление индекса.
indices.exists(index) Проверка существования индекса.
indices.get(index) Получение настроек и маппинга.
indices.put_mapping(...) Обновление схемы документа.
python
es.indices.create(index="products", body={ "mappings": { "properties": { "name": {"type": "text"}, "price": {"type": "float"} } } })

Bulk-запросы (массовые операции)

Модуль Описание
elasticsearch.helpers.bulk() Позволяет выполнять множество операций за один HTTP-запрос.
python
from elasticsearch.helpers import bulk actions = [ {"_index": "messages", "_id": 2, "_source": {"user": "Оля", "message": "Привет!"}}, {"_index": "messages", "_id": 3, "_source": {"user": "Макс", "message": "Как дела?"}} ] bulk(es, actions)

Агрегации

Тип Описание
terms, avg, max, min, sum Основные типы агрегаций.
python
query = { "aggs": { "users": { "terms": {"field": "user.keyword"} } } } res = es.search(index="messages", query={"match_all": {}}, aggs=query["aggs"])

Пагинация (scroll и from/size)

Метод Описание
from и size Простая пагинация.
scroll, scroll_id Пошаговая выгрузка больших объемов данных.