Elasticsearch — это мощный инструмент с открытым исходным кодом, который представляет собой поисковую и аналитическую систему. Программа разработана нидерландской компанией Elastic.
Смысл Elasticsearch заключается в обеспечении быстрого и эффективного поиска по большим объемам данных — текстах, цифрах или других типах данных. Elasticsearch — это не просто база данных, а целая система, построенная на движке Apache Lucene, который считается одним из самых производительных решений в области индексации и поиска данных.
Взаимодействие Elasticsearch с данными происходит в формате JSON — удобном формате, который массово используют современные приложения. Также программа поддерживает распределенную архитектуру при которой данные могут храниться и обрабатываться на нескольких серверах одновременно, тем самым обеспечивая высокую отказоустойчивость и масштабируемость.
Elasticsearch применяется в тех кейсах, в которых нужно быстро находить, анализировать или обрабатывать большие объемы информации. Его универсальность позволяет использовать его в самых разных сферах, включая такие, как:
Поисковые системы
Если вы вводите запрос в интернет-магазине или ищете статью в блоге, Elasticsearch может стоять за этим процессом, обеспечивая мгновенные результаты даже при миллионах записей.
Аналитика логов
Elasticsearch можно использовать, например, для анализа логов серверов, чтобы выявлять сбои, атаки или аномалии в реальном времени.
Бизнес-аналитика
Elasticsearch помогает обрабатывать данные о продажах, клиентах или поведении пользователей.
Обработка больших данных
В научных исследованиях или IoT-проектах Elasticsearch справляется с большими потоками данных от различных источников.
Отдельно стоит выделить, что Elasticsearch не просто производит поиск данных — он умеет агрегировать, фильтровать и визуализировать данные, что делает его незаменимым для разработчиков, аналитиков и администраторов. Благодаря своим возможностям он стал основой для экосистемы Elastic Stack, куда входят такие инструменты, как Kibana (инструмент для визуализации данных) и Logstash (система для обработки логов).
Изображение: dev.to
Принцип работы Elasticsearch основан на концепции индексации. Когда пользователь добавляет данные — например, документ в формате JSON, — система разбивает его на части, анализирует и создает индекс. Данный индекс представляет собой своего рода «оглавление», которое позволяет быстро находить необходимые данные. Приведем практический пример: если пользователь загружает файл с текстом «Elasticsearch помогает искать», он разобьет его на слова («Elasticsearch», «помогает», «искать») и свяжет каждое слово с местом, где оно встречается.
Индексы в Elasticsearch представляют собой логические контейнеры, которые напоминают базы данных в традиционных СУБД. Каждый индекс подразделяется на шарды — небольшие части, которые распределяются по узлам кластера. Шарды обеспечивают параллельную обработку запросов и высокую скорость даже при огромных объемах данных. Дополнительно присутствует функционал реплик — копии шардов, которые повышают отказоустойчивость: если один сервер выйдет из строя, данные останутся доступны. Архитектурная схема сети изображена ниже:
Запросы к Elasticsearch выполняются через REST API. Например, отправив запрос GET /test_index1/_search?q=query
, пользователь получит все документы, где встречается слово "query". Система использует сложные алгоритмы ранжирования, чтобы показать наиболее релевантные результаты.
dbaas
Несмотря на то, что Elasticsearch позиционируется как база данных, система принципиально отличается от реляционных базы данных (RDBMS), таких как MySQL или PostgreSQL. Главное отличие заключается в том, что RDBMS хранят данные в таблицах с жесткой структурой, которая включает в себя строки, столбцы и связи между таблицами. Elasticsearch же работает с неструктурированными данными в формате JSON, где структура может меняться от документа к документу.
Еще одно отличие — подход к поиску. В RDBMS для поиска по тексту нужно создавать дополнительные индексы или использовать сложные запросы SQL, что может замедлять выполнение запросов. Elasticsearch изначально заточен под полнотекстовый поиск и делает это намного быстрее благодаря инвертированному индексу — специальной структуре, где каждому слову соответствует список документов.
RDBMS лучше подходят для транзакционных операций (например, банковских систем), где важна строгая целостность данных. Elasticsearch — это в первую очередь инструмент для анализа и поиска данных, где приоритет отдается скорости и гибкости. Например, для разработки интернет-магазина можно использовать СУБД MySQL для хранения заказов, а Elasticsearch для реализации поиска по каталогу товаров.
Главная особенность Elasticsearch — это полнотекстовый поиск. Он умеет не только искать точные совпадения, но и понимать контекст. Например, запрос «книга о собаках» найдет документы с фразами вроде «книги про собак» или «собаки в литературе» благодаря встроенному анализу текста. Можно настроить поиск таким образом, чтобы он учитывал синонимы, опечатки или даже разные языки.
Elasticsearch не только ищет данные, но и анализирует их. С помощью агрегаций можно подсчитать, сколько раз встречается слово, найти среднее значение чисел в документах или построить гистограмму. Например, в логах сервера можно мгновенно узнать, сколько ошибок 404 было за последний час. Это делает его мощным инструментом для аналитики в режиме реального времени.
Elasticsearch спроектирован как распределенная система. Развертывание можно начать с одного сервера, а затем добавлять десятки или сотни узлов по мере необходимости (горизонтальное масштабирование) с целью обработки большого объема данных. Кластер автоматически распределяет нагрузку и данные между узлами. Если один узел выходит из строя, реплики на других узлах продолжают работу, что обеспечивает высокую доступность.
Рассмотрим на практике установку и базовую настройку ElasticSearch на базе Ubuntu 24.04, развернутой на облачном сервере Timeweb Cloud.
Сервер должен соответствовать следующим требованиям:
Сервер можно создать в панели управления в разделе «Облачные серверы». В процессе:
Остальные параметры можно оставить без изменений.
Сервер будет запущен через пару минут, и вы сможете найти IP-адрес, логин и пароль для подключения на Дашборде сервера.
Все команды необходимо выполнять от root
или обычного пользователя с правами sudo
.
openjdk-11-jre
, необходимый для работы Elasticsearch:apt update && apt -y install openjdk-11-jre
openjdk
была успешно выполнена, путем вывода версии Java:java -version
echo "deb [trusted=yes] https://mirror.yandex.ru/mirrors/elastic/8/ stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
apt update && apt -y install 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
systemctl start elasticsearch
systemctl status elasticsearch
curl
на адрес и порт, используемый Elasticsearch: curl -X GET "http://localhost:9200"
В ответ должен вернуться ответ в формате JSON, в котором будет отображено имя кластера, версия Elasticsearch и дополнительная информация, которая может быть полезна при отладке проблем:
Elasticsearch предоставляет широкий набор команд и API для управления кластером, индексами, данными и выполнения запросов. Рассмотрим основные команды и API с примерами их применения. Все взаимодействие с Elasticsearch обычно происходит через REST API с использованием HTTP-запросов (например, через curl, Kibana, Dev Tools или клиентские библиотеки).
curl -X GET "http://localhost:9200/_cluster/health" -H 'Content-Type: application/json'
Показывает статус (green, yellow, red), количество узлов, шардов и т.д.
curl -X GET "http://localhost:9200/_cluster/state" -H 'Content-Type: application/json'
curl -X GET "http://localhost:9200/_nodes/stats" -H 'Content-Type: application/json'
curl -X PUT "http://localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}'
curl -X GET "http://localhost:9200/my_index" -H 'Content-Type: application/json'
curl -X DELETE "http://localhost:9200/my_index" -H 'Content-Type: application/json'
curl -X PUT "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
"title": "Example Document",
"content": "This is a test"
}'
curl -X GET "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json'
curl -X POST "http://localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d'
{
"doc": {
"content": "Updated content"
}
}'
curl -X DELETE "http://localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json'
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": {}
}
}'
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"aggs": {
"by_title": {
"terms": {
"field": "title.keyword"
}
}
}
}'
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"
}
}
]
}'
curl -X GET "http://localhost:9200/_tasks" -H 'Content-Type: application/json'
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 — это отличный выбор, который стоит рассмотреть.