Cliente Elasticsearch para C++: elasticlient e guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cliente Elasticsearch para C++: guia completo sobre elasticlient

\n\n

Elasticsearch é um poderoso sistema de busca distribuído, construído sobre o Apache Lucene. Para interagir com ele a partir do C++, existem várias bibliotecas. Neste artigo, vamos examinar detalhadamente o elasticlient — um cliente leve, moderno e conveniente que utiliza a biblioteca libcurl para requisições HTTP e nlohmann/json para trabalhar com JSON. Ele é ideal para incorporar funções de busca em aplicações nativas, componentes de servidor e ferramentas de análise de dados.

\n\n

Principais recursos do elasticlient

\n
    \n
  • Suporte a todas as operações principais do Elasticsearch: indexação, atualização, exclusão de documentos.
  • \n
  • Execução de consultas de busca com texto completo, filtros e agregações.
  • \n
  • Gerenciamento de índices: criação, exclusão, configuração de mapeamentos.
  • \n
  • Processamento em lote (bulk) para alta performance.
  • \n
  • Suporte a SSL/TLS e autenticação básica.
  • \n
  • Requisições assíncronas através de mecanismos de callback.
  • \n
\n\n

Instalação da biblioteca

\n

Para compilar o elasticlient, será necessário um compilador com suporte a C++17 e as dependências instaladas: libcurl (desenvolvimento) e nlohmann-json. Instalação via gerenciador de pacotes (Ubuntu/Debian):

\n
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++
\n

Compilação a partir do código fonte:

\n
git clone https://github.com/elastic/elasticlient.git\ncd elasticlient\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j4\nsudo make install
\n\n

Conexão básica e configuração

\n

Para começar, crie uma instância do cliente informando a URL do seu cluster Elasticsearch:

\n
#include <elasticlient/client.h>\n#include <iostream>\n\nint main() {\n    elasticlient::Client client({"http://localhost:9200"});\n    // Verificação de conexão\n    auto ping = client.ping();\n    if (ping.status() == 200) {\n        std::cout << "Conexão estabelecida!" << std::endl;\n    }\n    return 0;\n}
\n

Para um cluster com vários nós, passe uma lista de URLs:

\n
elasticlient::Client client({\n    "http://node1:9200",\n    "http://node2:9200",\n    "http://node3:9200"\n});
\n\n

Trabalhando com documentos

\n

Indexação de um novo documento (criação ou atualização):

\n
#include <nlohmann/json.hpp>\nusing json = nlohmann::json;\n\njson doc = {\n    {"title", "Elasticsearch para C++"},\n    {"content", "Guia detalhado sobre o uso do cliente elasticlient"},\n    {"tags", {"cpp", "elasticsearch", "pesquisa"}},\n    {"views", 0}\n};\n\nauto result = client.index("articles", "article", doc.dump(), "1");\nif (result.status() == 201) {\n    std::cout << "Documento criado: " << result.body() << std::endl;\n}
\n

Obtendo um documento pelo ID:

\n
auto getResult = client.get("articles", "article", "1");\nif (getResult.status() == 200) {\n    json docJson = json::parse(getResult.body());\n    std::cout << "Título: " << docJson["_source"]["title"] << std::endl;\n}
\n

Atualização de um documento existente (parcial):

\n
json updateFields = {\n    {"doc", {{"views", 42}}}\n};\nauto updateResult = client.update("articles", "article", "1", updateFields.dump());
\n\n

Pesquisa e filtragem

\n

Executando uma pesquisa de texto completo usando Query DSL:

\n
json searchQuery = {\n    {"query", {\n        {"bool", {\n            {"must", {\n                {{"match", {{"content", "guia"}}}}\n            }},\n            {"filter", {\n                {{"term", {{"tags", "cpp"}}}}\n            }}\n        }}\n    }},\n    {"size", 10}\n};\n\nauto searchResult = client.search("articles", searchQuery.dump());\nif (searchResult.status() == 200) {\n    json                    

Recommendations