Cliente Elasticsearch C++: una potente herramienta para búsquedas de alto rendimiento
Elasticsearch es un sistema de búsqueda distribuido basado en Apache Lucene, ampliamente utilizado para búsqueda de texto completo, análisis de registros y procesamiento de grandes volúmenes de datos. Aunque no existe un cliente oficial para C++, los desarrolladores pueden interactuar eficazmente con Elasticsearch a través de REST API utilizando la biblioteca elasticlient, un cliente C++ ligero creado específicamente para trabajar con Elasticsearch.
La biblioteca elasticlient proporciona una interfaz conveniente para realizar todas las operaciones principales: indexación de documentos, búsqueda, actualización, eliminación y gestión del clúster. Está construida sobre la biblioteca libcurl para solicitudes HTTP y nlohmann/json para trabajar con JSON, lo que garantiza un alto rendimiento y compatibilidad con los estándares modernos de C++17/20.
Características principales de elasticlient
- Soporte completo para REST API de Elasticsearch (versiones 6.x, 7.x y 8.x)
- Solicitudes asíncronas y síncronas
- Serialización/deserialización automática de JSON mediante nlohmann/json
- Soporte para operaciones bulk para carga masiva de datos
- Gestión de índices (creación, eliminación, configuración de mapeo)
- Trabajo con consultas de búsqueda (match, term, range, bool, etc.)
- Manejo de errores y reintentos de conexión
Instalación y configuración
Para instalar elasticlient se puede usar CMake y vcpkg o compilarlo manualmente. La forma recomendada es mediante vcpkg:
# Instalación mediante vcpkgvcpkg install elasticlient
# Vinculación en CMakeLists.txtfind_package(elasticlient REQUIRED)target_link_libraries(my_app PRIVATE elasticlient::elasticlient)También se requieren dependencias:
- libcurl (con soporte HTTPS)
- nlohmann/json (versión 3.9+)
- Compilador C++ con soporte para C++17 (GCC 8+, Clang 7+, MSVC 2019+)
Ejemplos básicos de uso
Conexión a Elasticsearch
#include <elasticlient/client.h>
int main() { // Creación del cliente con conexión a la instancia local elasticlient::Client client("http://localhost:9200"); // Verificación de la conexión auto status = client.get("/"); if (status.statusCode() == 200) { std::cout << "¡Conectado a Elasticsearch!" << std::endl; } return 0;}Indexación de un documento
#include <elasticlient/client.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { elasticlient::Client client("http://localhost:9200"); // Creación del documento json document = { {"title", "Introducción a C++"}, {"author", "Iván Petrov"}, {"year", 2023}, {"tags", {"programación", "C++", "manual"}} }; // Indexación en el índice "books" con ID "1" auto response = client.index("books", "_doc", "1", document.dump()); if (response.statusCode() == 201) { std::cout << "¡Documento indexado exitosamente!" << std::endl; } return 0;}Búsqueda de documentos
#include <elasticlient/client.h>#include <iostream>
int main() { elasticlient::Client client("http://localhost:9200"); // Consulta de búsqueda 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 << "Encontrado: " << hit["_source"]["title"] << std::endl; } } retu También en la biblioteca
Rate Limiting en PHP: Limitación de frecuencia de solicitudes para proteger el sitio
Trabajo con imágenes en Go: redimensionar y recortar con la librería imaging
Caching en Java: Redis, Caffeine, Ehcache — guía completa