Elasticsearch — это мощный инструмент с открытым исходным кодом, который представляет собой поисковую и аналитическую систему. Программа разработана нидерландской компанией Elastic.
Смысл Elasticsearch заключается в обеспечении быстрого и эффективного поиска по большим объемам данных — текстах, цифрах или других типах данных. Elasticsearch — это не просто база данных, а целая система, построенная на движке Apache Lucene, который считается одним из самых производительных решений в области индексации и поиска данных.
Взаимодействие Elasticsearch с данными происходит в формате JSON — удобном формате, который массово используют современные приложения. Также программа поддерживает распределенную архитектуру при которой данные могут храниться и обрабатываться на нескольких серверах одновременно, тем самым обеспечивая высокую отказоустойчивость и масштабируемость.
Elasticsearch применяется в тех кейсах, в которых нужно быстро находить, анализировать или обрабатывать большие объемы информации. Его универсальность позволяет использовать его в самых разных сферах, включая такие, как:
-
Поисковые системы
Если вы вводите запрос в интернет-магазине или ищете статью в блоге, Elasticsearch может стоять за этим процессом, обеспечивая мгновенные результаты даже при миллионах записей.
-
Аналитика логов
Elasticsearch можно использовать, например, для анализа логов серверов, чтобы выявлять сбои, атаки или аномалии в реальном времени.
-
Бизнес-аналитика
Elasticsearch помогает обрабатывать данные о продажах, клиентах или поведении пользователей.
-
Обработка больших данных
В научных исследованиях или IoT-проектах Elasticsearch справляется с большими потоками данных от различных источников.
Отдельно стоит выделить, что Elasticsearch не просто производит поиск данных — он умеет агрегировать, фильтровать и визуализировать данные, что делает его незаменимым для разработчиков, аналитиков и администраторов. Благодаря своим возможностям он стал основой для экосистемы Elastic Stack, куда входят такие инструменты, как Kibana (инструмент для визуализации данных) и Logstash (система для обработки логов).
Изображение: dev.to
Как работает ElasticSearch?
Основные принципы работы
Принцип работы Elasticsearch основан на концепции индексации. Когда пользователь добавляет данные — например, документ в формате JSON, — система разбивает его на части, анализирует и создает индекс. Данный индекс представляет собой своего рода «оглавление», которое позволяет быстро находить необходимые данные. Приведем практический пример: если пользователь загружает файл с текстом «Elasticsearch помогает искать», он разобьет его на слова («Elasticsearch», «помогает», «искать») и свяжет каждое слово с местом, где оно встречается.
Индексы в Elasticsearch представляют собой логические контейнеры, которые напоминают базы данных в традиционных СУБД. Каждый индекс подразделяется на шарды — небольшие части, которые распределяются по узлам кластера. Шарды обеспечивают параллельную обработку запросов и высокую скорость даже при огромных объемах данных. Дополнительно присутствует функционал реплик — копии шардов, которые повышают отказоустойчивость: если один сервер выйдет из строя, данные останутся доступны. Архитектурная схема сети изображена ниже:
Запросы к Elasticsearch выполняются через REST API. Например, отправив запрос GET /test_index1/_search?q=query
, пользователь получит все документы, где встречается слово "query". Система использует сложные алгоритмы ранжирования, чтобы показать наиболее релевантные результаты.
dbaas
Разница между ElasticSearch и реляционными базами данных
Несмотря на то, что Elasticsearch позиционируется как база данных, система принципиально отличается от реляционных базы данных (RDBMS), таких как MySQL или PostgreSQL. Главное отличие заключается в том, что RDBMS хранят данные в таблицах с жесткой структурой, которая включает в себя строки, столбцы и связи между таблицами. Elasticsearch же работает с неструктурированными данными в формате JSON, где структура может меняться от документа к документу.
Еще одно отличие — подход к поиску. В RDBMS для поиска по тексту нужно создавать дополнительные индексы или использовать сложные запросы SQL, что может замедлять выполнение запросов. Elasticsearch изначально заточен под полнотекстовый поиск и делает это намного быстрее благодаря инвертированному индексу — специальной структуре, где каждому слову соответствует список документов.
RDBMS лучше подходят для транзакционных операций (например, банковских систем), где важна строгая целостность данных. Elasticsearch — это в первую очередь инструмент для анализа и поиска данных, где приоритет отдается скорости и гибкости. Например, для разработки интернет-магазина можно использовать СУБД MySQL для хранения заказов, а Elasticsearch для реализации поиска по каталогу товаров.
Основные функции ElasticSearch
Полнотекстовый поиск
Главная особенность Elasticsearch — это полнотекстовый поиск. Он умеет не только искать точные совпадения, но и понимать контекст. Например, запрос «книга о собаках» найдет документы с фразами вроде «книги про собак» или «собаки в литературе» благодаря встроенному анализу текста. Можно настроить поиск таким образом, чтобы он учитывал синонимы, опечатки или даже разные языки.
Анализ и обработка данных
Elasticsearch не только ищет данные, но и анализирует их. С помощью агрегаций можно подсчитать, сколько раз встречается слово, найти среднее значение чисел в документах или построить гистограмму. Например, в логах сервера можно мгновенно узнать, сколько ошибок 404 было за последний час. Это делает его мощным инструментом для аналитики в режиме реального времени.
Масштабируемость и кластеры
Elasticsearch спроектирован как распределенная система. Развертывание можно начать с одного сервера, а затем добавлять десятки или сотни узлов по мере необходимости (горизонтальное масштабирование) с целью обработки большого объема данных. Кластер автоматически распределяет нагрузку и данные между узлами. Если один узел выходит из строя, реплики на других узлах продолжают работу, что обеспечивает высокую доступность.
Установка и базовая настройка ElasticSearch
Рассмотрим на практике установку и базовую настройку ElasticSearch на базе Ubuntu 24.04, развернутой на облачном сервере Timeweb Cloud.
Сервер должен соответствовать следующим требованиям:
- Минимум 4 ГБ оперативной памяти (лучше 8 ГБ для выполнения реальных задач).
- Минимум 4-ядерный процессор (рекомендуется 8-ядерный и выше, в зависимости от типа задач и объема данных).
- Java 11 или новее (Elasticsearch требует JVM).
Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе:
- Выберите регион с минимальным пингом для быстрой передачи данных.
- Выберите конфигурацию, достаточную для ваших задач. В рамках данной статьи для установки и базовой настройки Elasticsearch без реальной нагрузки будет достаточно конфигурации c двухъядерным процессором, 2 ГБ оперативной памяти и 40 ГБ места на NVMe-диске.
Остальные параметры можно оставить без изменений.
Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.
Установка Elasticsearch
Все команды необходимо выполнять от root
или обычного пользователя с правами sudo
.
- Обновляем индекс репозиториев и устанавливаем пакет
openjdk-11-jre
, необходимый для работы Elasticsearch:
apt update && apt -y install openjdk-11-jre
- Проверим, что установка
openjdk
была успешно выполнена, путем вывода версии Java:
java -version
- Добавляем репозиторий Яндекса, содержащий пакет Elasticsearch, при помощи команды:
echo "deb [trusted=yes] https://mirror.yandex.ru/mirrors/elastic/8/ stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
- Повторно обновляем индекс репозиториев и устанавливаем Elasticsearch:
apt update && apt -y install elasticsearch
На этом установка успешно завершена. Далее мы рассмотрим базовую настройку.
Базовая настройка Elasticsearch
Прежде чем приступать к редактированию основного конфигурационного файла Elasticsearch, необходимо сделать его резервную копию, чтобы в будущем можно было откатиться при возникновении проблем.
Сделаем копию файла elasticsearch.yml
, сохранив ее под новым именем — elasticsearch.yml.backup
:
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.backup
- С помощью любого текстового редактора открываем на редактирование основной конфигурационный файл
elasticsearch.yml
:
nano /etc/elasticsearch/elasticsearch.yml
И меняем следующие параметры, предварительно раскомментировав необходимые строки (путем удаления символа #
):
cluster.name
: Задает уникальное имя для кластера.
network.host
: Указывается, на каких адресах будет доступен Elasticsearch. Можно задать доступ только с localhost или все адреса (0.0.0.0) для доступа к сервису из внешней сети.
http.port
: Порт, который использует Elasticsearch.
path.data
: Указывается полный путь, где хранятся данные Elasticsearch.
path.logs
: Указывается полный путь до лог-файлов Elasticsearch.
xpack.security.enabled
: Настройка, отвечающая за включение функции безопасности X-Pack.
X-Pack — это встроенное расширение Elasticsearch, предназначенное для работы с аутентификацией, авторизацией и шифрованием (SSL/TLS). Когда эта настройка включена (задано значение true), Elasticsearch требует аутентификации для доступа к кластеру и может использовать HTTPS для защиты сетевых соединений. В нашем случае мы отключим данную функцию, однако для production-решений она должна быть обязательно включена.
Сохраняем изменения и выходим из файла.
- Перезапускаем демон
systemctl
и добавляем сервис в автозагрузку:
systemctl daemon-reload && systemctl enable elasticsearch
- Запускаем Elasticsearch при помощи команды:
systemctl start elasticsearch
- Проверяем статус сервиса:
systemctl status elasticsearch
- Для проверки работоспособности отправим запрос при помощи утилиты
curl
на адрес и порт, используемый Elasticsearch:
curl -X GET "http://localhost:9200"
В ответ должен вернуться ответ в формате JSON, в котором будет отображено имя кластера, версия Elasticsearch и дополнительная информация, которая может быть полезна при отладке проблем:
Основные команды и API
Elasticsearch предоставляет широкий набор команд и API для управления кластером, индексами, данными и выполнения запросов. Рассмотрим основные команды и API с примерами их применения. Все взаимодействие с Elasticsearch обычно происходит через REST API с использованием HTTP-запросов (например, через curl, Kibana, Dev Tools или клиентские библиотеки).
1. Управление кластером (Cluster API)
- Cluster Health: Проверка состояния кластера.
curl -X GET "http://localhost:9200/_cluster/health" -H 'Content-Type: application/json'
Показывает статус (green, yellow, red), количество узлов, шардов и т.д.
- Cluster State: Подробная информация о состоянии кластера (включая узлы, индексы, маршрутизация).
curl -X GET "http://localhost:9200/_cluster/state" -H 'Content-Type: application/json'
- Node Stats: Статистика по узлам (CPU, память, диск).
curl -X GET "http://localhost:9200/_nodes/stats" -H 'Content-Type: application/json'
2. Управление индексами (Index API)
- Create Index: Создание нового индекса.
curl -X PUT "http://localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}'
- Get Index: Просмотр настроек индекса.
curl -X GET "http://localhost:9200/my_index" -H 'Content-Type: application/json'
- Delete Index: Удаление индекса.
curl -X DELETE "http://localhost:9200/my_index" -H 'Content-Type: application/json'
3. Работа с документами (Document API)
- Index Document: Добавление или обновление документа в индексе.
curl -X PUT "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
"title": "Example Document",
"content": "This is a test"
}'
- Get Document: Получение документа по ID.
curl -X GET "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json'
- Update Document: Частичное обновление документа.
curl -X POST "http://localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d'
{
"doc": {
"content": "Updated content"
}
}'
- Delete Document: Удаление документа.
curl -X DELETE "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json'
- Match All: Получение всех документов.
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}'
- Aggregations: Группировка и анализ данных.
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"aggs": {
"by_title": {
"terms": {
"field": "title.keyword"
}
}
}
}'
- Allocate Shard: Ручное перемещение шарда (например, для балансировки).
curl -X POST "http://localhost:9200/_cluster/reroute" -H 'Content-Type: application/json' -d'
{
"commands": [
{
"move": {
"index": "my_index",
"shard": 0,
"from_node": "node1",
"to_node": "node2"
}
}
]
}'
6. Мониторинг и диагностика
- Task Management API: Проверка текущих задач.
curl -X GET "http://localhost:9200/_tasks" -H 'Content-Type: application/json'
- Explain API: Разбор, почему документ соответствует запросу.
curl -X GET "http://localhost:9200/_tasks" -H 'Content-Type: application/json'
Explain API
Разбор, почему документ соответствует запросу.
curl -X GET "http://localhost:9200/my_index/_explain/1" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {"content": "test"}
}
}'
Надежные базы данных в облаке
Заключение
Elasticsearch — это не просто инструмент для поиска, а универсальная платформа, которая сочетает в себе скорость, гибкость и мощные аналитические возможности. Он позволяет решать задачи от мгновенного поиска на сайтах до обработки огромных массивов данных в реальном времени, находя применение в самых разных сферах — от электронной коммерции до анализа логов и научных исследований. Его распределенная архитектура и простота интеграции делают его незаменимым в современном мире технологий, где данные играют ключевую роль.
Установить и настроить Elasticsearch несложно, а его богатый функционал открывает безграничные возможности для разработчиков и аналитиков. С каждым годом этот инструмент продолжает эволюционировать, подтверждая свою репутацию одного из лидеров в области поиска и анализа данных.
Если вам нужно эффективно работать с большими потоками информации, Elasticsearch — это отличный выбор, который стоит рассмотреть.