Elasticsearch клиент для C++: полное руководство по elasticlient
Elasticsearch — мощная распределённая поисковая система, построенная на Apache Lucene. Для взаимодействия с ней из C++ существует несколько библиотек. В этой статье мы подробно рассмотрим elasticlient — легковесный, современный и удобный клиент, который использует библиотеку libcurl для HTTP-запросов и nlohmann/json для работы с JSON. Он идеально подходит для встраивания поисковых функций в нативные приложения, серверные компоненты и инструменты анализа данных.
Основные возможности elasticlient
- Поддержка всех основных операций Elasticsearch: индексация, обновление, удаление документов.
- Выполнение поисковых запросов с полным текстом, фильтрами и агрегациями.
- Управление индексами: создание, удаление, настройка маппингов.
- Пакетная обработка (bulk) для высокой производительности.
- Поддержка SSL/TLS и базовой аутентификации.
- Асинхронные запросы через callback-механизмы.
Установка библиотеки
Для сборки elasticlient потребуется компилятор с поддержкой C++17 и установленные зависимости: libcurl (разработка) и nlohmann-json. Установка через пакетный менеджер (Ubuntu/Debian):
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++
Сборка из исходников:
git clone https://github.com/elastic/elasticlient.git
cd elasticlient
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4
sudo make install
Базовое подключение и настройка
Для начала работы создайте экземпляр клиента, указав URL вашего кластера Elasticsearch:
#include <elasticlient/client.h>
#include <iostream>
int main() {
elasticlient::Client client({"http://localhost:9200"});
// Проверка соединения
auto ping = client.ping();
if (ping.status() == 200) {
std::cout << "Соединение установлено!" << std::endl;
}
return 0;
}
Для кластера из нескольких нод передайте список URL:
elasticlient::Client client({
"http://node1:9200",
"http://node2:9200",
"http://node3:9200"
});
Работа с документами
Индексация нового документа (создание или обновление):
#include <nlohmann/json.hpp>
using json = nlohmann::json;
json doc = {
{"title", "Elasticsearch для C++"},
{"content", "Подробное руководство по использованию клиента elasticlient"},
{"tags", {"cpp", "elasticsearch", "поиск"}},
{"views", 0}
};
auto result = client.index("articles", "article", doc.dump(), "1");
if (result.status() == 201) {
std::cout << "Документ создан: " << result.body() << std::endl;
}
Получение документа по ID:
auto getResult = client.get("articles", "article", "1");
if (getResult.status() == 200) {
json docJson = json::parse(getResult.body());
std::cout << "Заголовок: " << docJson["_source"]["title"] << std::endl;
}
Обновление существующего документа (частичное):
json updateFields = {
{"doc", {{"views", 42}}}
};
auto updateResult = client.update("articles", "article", "1", updateFields.dump());
Поиск и фильтрация
Выполнение полнотекстового поиска с использованием Query DSL:
json searchQuery = {
{"query", {
{"bool", {
{"must", {
{{"match", {{"content", "руководство"}}}}
}},
{"filter", {
{{"term", {{"tags", "cpp"}}}}
}}
}}
}},
{"size", 10}
};
auto searchResult = client.search("articles", searchQuery.dump());
if (searchResult.status() == 200) {
json hits = json::parse(searchResult.body())["hits"]["hits"];
for (const auto& hit : hits) {
std::cout << "ID: " << hit["_id"]
<< ", score: " << hit["_score"]
<< ", title: " << hit["_source"]["title"]
<< std::endl;
}
}
Агрегации для аналитики
Пример подсчёта количества