Elasticsearch C++ клиент: мощный инструмент для высокопроизводительного поиска
Elasticsearch — это распределённая поисковая система на базе Apache Lucene, которая широко используется для полнотекстового поиска, анализа логов и обработки больших объёмов данных. Хотя официальный клиент для C++ отсутствует, разработчики могут эффективно взаимодействовать с Elasticsearch через REST API с помощью библиотеки elasticlient — легковесного C++ клиента, специально созданного для работы с Elasticsearch.
Библиотека elasticlient предоставляет удобный интерфейс для выполнения всех основных операций: индексации документов, поиска, обновления, удаления и управления кластером. Она построена поверх библиотеки libcurl для HTTP-запросов и nlohmann/json для работы с JSON, что обеспечивает высокую производительность и совместимость с современными стандартами C++17/20.
Основные возможности elasticlient
- Полная поддержка REST API Elasticsearch (версии 6.x, 7.x и 8.x)
- Асинхронные и синхронные запросы
- Автоматическая сериализация/десериализация JSON через nlohmann/json
- Поддержка bulk-операций для массовой загрузки данных
- Управление индексами (создание, удаление, настройка маппинга)
- Работа с поисковыми запросами (match, term, range, bool и др.)
- Обработка ошибок и повторные попытки подключения
Установка и настройка
Для установки elasticlient можно использовать CMake и vcpkg или собрать вручную. Рекомендуемый способ через vcpkg:
# Установка через vcpkg
vcpkg install elasticlient
# Подключение в CMakeLists.txt
find_package(elasticlient REQUIRED)
target_link_libraries(my_app PRIVATE elasticlient::elasticlient)
Также потребуются зависимости:
- libcurl (с поддержкой HTTPS)
- nlohmann/json (версия 3.9+)
- C++ компилятор с поддержкой C++17 (GCC 8+, Clang 7+, MSVC 2019+)
Базовые примеры использования
Подключение к Elasticsearch
#include <elasticlient/client.h>
int main() {
// Создание клиента с подключением к локальному экземпляру
elasticlient::Client client("http://localhost:9200");
// Проверка соединения
auto status = client.get("/");
if (status.statusCode() == 200) {
std::cout << "Connected to Elasticsearch!" << std::endl;
}
return 0;
}
Индексация документа
#include <elasticlient/client.h>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() {
elasticlient::Client client("http://localhost:9200");
// Создание документа
json document = {
{"title", "Введение в C++"},
{"author", "Иван Петров"},
{"year", 2023},
{"tags", {"программирование", "C++", "учебник"}}
};
// Индексация в индекс "books" с ID "1"
auto response = client.index("books", "_doc", "1", document.dump());
if (response.statusCode() == 201) {
std::cout << "Document indexed successfully!" << std::endl;
}
return 0;
}
Поиск документов
#include <elasticlient/client.h>
#include <iostream>
int main() {
elasticlient::Client client("http://localhost:9200");
// Поисковый запрос
json query = {
{"query", {
{"match", {
{"title", "C++"}
}}
}}
};
auto response = client.search("books", "_search", query.dump());
if (response.statusCode() == 200) {
auto results = json::parse(response.body());
for (const auto& hit : results["hits"]["hits"]) {
std::cout << "Found: " << hit["_source"]["title"] << std::endl;
}
}
return 0;
}
Продвинутые возможности
Bulk-индексация для массовой загрузки
#include <elasticlient/bulk.h>
int main() {
elasticlient::Client client("http://localhost:9200");
elasticlient::Bulk bulk(client, "books", "_doc");
// Добавление нескольких документов
for (int i = 0; i < 1000; ++i) {
json doc = {
{"title", "Book #" + std::to_string(i)},
{"author", "Author " + std::to_string(i % 10)}
};
bulk.indexDocument(std::to_string(i), doc.dump());
}
//