Elasticsearch клиент для C++: elasticlient и полное руководство

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

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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;
    }
}

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

Пример подсчёта количества

Рекомендаций