跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++

Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装

Elasticsearch 是开源分布式搜索引擎,支持自动发现与分片机制。介绍 ES 与 Kibana 的安装部署流程,解析索引、文档、映射等核心概念。重点展示 C++ 客户端 API 封装方法,涵盖索引管理、CRUD 操作及代码示例,辅助开发者快速集成搜索引擎功能。

女王发布于 2026/3/25更新于 2026/5/67 浏览
Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装

概述

本文从 Elasticsearch(ES)简介、安装到核心概念,结合 Kibana 可视化工具,全面讲解其分布式搜索能力。重点演示 C++ 客户端 API 封装,涵盖索引管理、CRUD 操作,并通过代码示例实现数据增删查改。

一. ES 介绍及简单使用

1. 介绍

Elasticsearch 简称 ES,是开源分布式搜索引擎。

特点:

  1. 分布式相关:具备分布式特性,支持自动发现、索引自动分片与索引副本机制。
  2. 易用性与接口:采用 RESTful 风格接口,零配置,能让用户以简单方式操作。
  3. 多数据源与扩展性:可对接多数据源,本身扩展性好,能扩展到上百台服务器,处理 PB 级别数据。
  4. 存储检索及时性:近乎实时地存储、检索数据。
  5. 技术底层与封装:由 Java 开发,以 Lucene 为核心实现索引和搜索功能,但通过简单 RESTful API 隐藏 Lucene 复杂度,降低全文搜索门槛。

数据操作面向与方式:

  1. 面向对象:面向文档(document oriented),可存储整个对象或文档。
  2. 数据处理:不只是存储,还会对每个文档内容建立索引以实现可搜索;支持对文档(而非行式/列式数据)进行索引、搜索、排序、过滤等操作。

2. 安装过程

步骤命令/操作
1. 导入 GPG 密钥`wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch
2. 添加 APT 源`echo "deb [signed-by=...] https://artifacts.elastic.co/packages/8.x/apt stable main"
3. 更新 & 安装sudo apt update && sudo apt install elasticsearch
4. 启动 & 自启sudo systemctl start elasticsearch && sudo systemctl enable elasticsearch
5. 检查状态sudo systemctl status elasticsearch
6. 测试访问curl http://localhost:9200/
7. (可选)远程访问修改 network.host: 0.0.0.0 并重启
8. (可选)设置密码sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
检测是否安装成功
  1. 启动 ES:在 Shell 中执行命令 sudo systemctl start elasticsearch。
  2. 查看 ES 服务的状态:在 Shell 中执行命令 sudo systemctl status elasticsearch.service。

ES 服务状态

ES 服务详情

  • 可以看到,ES 服务成功运行并部署在服务器的 9200 端口上。

ES 访问测试

  • ES 服务成功能进行访问。
对应配置文件修改

默认仅本机可访问;使用 Vim 编辑 /etc/elasticsearch/elasticsearch.yml 文件。

新增配置:

  • network.host: 0.0.0.0
  • http.port: 9200
  • cluster.initial_master_nodes: ["node-1"]

3. ES 核心知识概念

1. 索引(Index–>库)
  • 是什么:数据的逻辑容器(类似数据库)
  • 例子:
    • logs-2024(存储 2024 年的日志数据)
    • products(存储商品信息)
    • users(存储用户数据)
2. 文档(Document)
  • 是什么:索引中的一条具体数据(JSON 格式)

例子:

// 在 users 索引中的一条文档
{"name":"张三","age":25,"email":"[email protected]","join_date":"2024-01-15"}
3. 字段(Field)
  • 是什么:文档中的单个数据项
  • 例子(来自上面的文档):
    • name 字段(值:'张三')
    • age 字段(值:25)
    • email 字段(值:'[email protected]')
4. 类型(Type–>类似表)(7.x 后已废弃)
  • 旧版例子(6.x 及之前):
    • 在 content 索引中可能有:
      • article 类型(存储文章)
      • comment 类型(存储评论)
  • 新版(7.x+):
    • 一个索引只能有一种类型(默认 _doc)
    • 例子:users 索引中所有文档都是 _doc 类型
5. 映射(Mapping)
  • 是什么:定义字段的数据类型
  • 如果你插入 {"price": 99.99},ES 会自动推断 price 为 float 类型
  • 如果你插入 {"status": "active"},ES 会自动推断 status 为 text 类型

例子:

// 手动定义的映射示例
{"mappings":{"properties":{"name":{"type":"text"},// 文本类型
"age":{"type":"integer"},// 整数类型
"email":{"type":"keyword"},// 关键词类型(精确匹配)
"join_date":{"type":"date"}// 日期类型}}}

自动推断的例子:

提示:在 ES 7.x 及以上版本,创建索引时通常不需要指定类型(使用默认的 _doc 类型即可),但是专注于索引和字段映射的设计更重要。

4. Kibana 介绍

Kibana 是什么?

Kibana 是 Elasticsearch 的可视化工具,用 网页界面 展示和分析 ES 里的数据(比如日志、图表、仪表盘)。

Kibana 和 Elasticsearch 的关系
  1. Kibana 必须连接 Elasticsearch 才能用(就像手机需要网络才能上网)。
  2. Elasticsearch 负责 存数据、搜索数据(像数据库)。
  3. Kibana 负责 把 ES 里的数据变成图表、仪表盘(让人更容易看懂)。

简单比喻:

  • Elasticsearch = 仓库(存东西)
  • Kibana = 展示柜(把仓库里的数据摆出来给人看)

常见用途:

  • 看 日志(比如网站报错)
  • 做 数据图表(比如访问量统计)
  • 监控 服务器状态(比如 CPU 使用率)

访问方式:浏览器打开 http://你的服务器 IP:5601 即可使用(这是它的默认端口,可以根据配置文件进行修改)。

关系图如下:

Kibana 与 ES 关系

5. 安装 Kibana 过程

验证安装:使用以下命令检查 Kibana 服务的状态:

sudo systemctl status kibana 

设置开机自启(可选):如果你希望 Kibana 在系统启动时自动启动,可以使用以下命令来启用自启动:

sudo systemctl enable kibana 

启动 Kibana 服务:安装完成后,启动 Kibana 服务:

sudo systemctl start kibana 

配置 Kibana(可选):根据需要配置 Kibana。配置文件通常位于 /etc/kibana/kibana.yml。可能需要设置如服务器地址、端口、Elasticsearch URL 等:

sudo vim /etc/kibana/kibana.yml 

例如,你可能需要设置 Elasticsearch 服务的 URL,大概在 32 行左右:

elasticsearch.host:"http://localhost:9200"

安装 Kibana:使用 apt 命令安装 Kibana:

sudo apt install kibana 

下面演示下:

Kibana 安装界面

  • 这里对对应的 Kibana 的配置文件进行编辑:默认监听所有 ip 并部署在本地的 8999 端口,然后 它收到的数据发送到 localhost 的 9200 端口(也就是 es 服务器),接收到的答复再呈现可视化出来方便用户观看。

Kibana 配置界面

  • 监听端口正监听,服务正常运行。

Kibana 服务状态

  • 下面访问对应的 ip+port 可以看到 Kibana 服务。

6. Kibana-ES 使用

下面操作下:

Kibana 首页

Kibana 索引管理

Kibana 查询结果

  • 找到对应 Kibana 能与 ES 服务交互请求与答复的界面。

下面进行创建索引,增删查一下:

Kibana 创建索引

  • 构建对应的信息索引类型与映射(可以理解成类似 MySQL 表里的字段但是一个索引只能有一个类型也就是表)。

Kibana 插入数据

  • 成功插入对应数据。

Kibana 全量查询

  • 进行全量查询。

Kibana 按需查询

  • 按需查询。

Kibana 删除索引

  • 成功删除整个索引(这里也可以选择对应插入数据时候的 id 进行单个删除)。

7. ES Client 使用及封装使用接口

ES 接口
1. search - 搜索文档
cpr::Response search(const std::string &indexName,// 索引名(如 "users")
const std::string &docType,// 类型(ES 7.x+ 可忽略,传空字符串 "")
const std::string &body,// 查询 DSL 的 JSON 字符串(如 {"query": {"match_all": {}}})
const std::string &routing // 路由键(可选,默认空));

作用:在指定索引中执行搜索查询(类似 SQL 的 SELECT)。
例子:

// 搜索 users 索引中所有文档
auto response = search("users", "", R"({"query": {"match_all": {}}})");
2. get - 获取单个文档
cpr::Response get(const std::string &indexName,// 索引名(如 "products")
const std::string &docType,// 类型(ES 7.x+ 可忽略)
const std::string &id,// 文档 ID(如 "1")
const std::string &routing // 路由键(可选));

作用:根据 ID 获取索引中的特定文档(类似 SQL 的 SELECT * FROM table WHERE id=1)。
例子:

// 获取 products 索引中 ID 为 "100" 的文档
auto response = get("products", "", "100");
3. index - 创建/更新文档
cpr::Response index(const std::string &indexName,// 索引名(如 "orders")
const std::string &docType,// 类型(ES 7.x+ 可忽略)
const std::string &id,// 文档 ID(如 "2";若为空则 ES 自动生成)
const std::string &body,// 文档内容的 JSON 字符串(如 {"name": "Book"})
const std::string &routing // 路由键(可选));

作用:向索引中写入或更新一个文档(ID 存在则更新,不存在则创建)。
例子:

// 插入/更新 orders 索引中 ID 为 "5" 的文档
auto response = index("orders", "", "5", R"({"item": "Laptop", "price": 999})");
4. remove - 删除文档
cpr::Response remove(const std::string &indexName,// 索引名(如 "logs")
const std::string &docType,// 类型(ES 7.x+ 可忽略)
const std::string &id,// 要删除的文档 ID(如 "3")
const std::string &routing // 路由键(可选));

作用:根据 ID 删除索引中的文档(类似 SQL 的 DELETE FROM table WHERE id=3)。
例子:

// 删除 logs 索引中 ID 为 "20240101" 的文档
auto response = remove("logs", "", "20240101");
类比 SQL 操作
ES 接口对应 SQL 操作核心功能
searchSELECT ... WHERE ...搜索/查询数据
getSELECT * FROM ... WHERE id=?按 ID 精确获取数据
indexINSERT/UPDATE写入或更新数据
removeDELETE删除数据

这些接口是 Elasticsearch REST API 的 C++ 封装(通过 HTTP 请求库 cpr 实现,也就是说用到的除了 elasticsearch 库还有 cpr 库(C++ 仿照 Python 的 requests 库实现的))。

ES 客户端 API 二次封装
封装思想
  • 为什么需要封装? 方便直接把对应固有的属性特征直接创建好,构建好对应 json 格式,为用户搞好对应单一添加接口方便操作(比如可以根据用户需要创建对应属性,根据用户需要插入对应数据集合,根据用户选择何种模式进行 search 完成 json 序列化与发送及获取应答等。)

封装了四种主要操作:索引创建、数据新增、数据查询、数据删除。

其实就是按照之前 Kibana 演示的发送的格式进行 json 对象构建,然后用户来调用添加最后进行统一序列化发送 + 应答接收等。

  • 这里每次给这几个类传入的是 client 对象(构建好的);而不是初始化的时候构建这样为了利用资源充分减少消耗。
  • 创建索引发送请求 + 构建输入进行插入发送请求 + 分两种情况(分片与不分片)进行匹配查询发送请求 + 删除指定 id 的数据进行发送请求的四个类。
封装源码

对应封装的代码:

1. 封装功能接口可结合注释看详解:

文件名:es_oper.cc

2. 封装接口格式依据对应文本请求:

文件名:according.txt

测试效果

测试效果:

测试效果 1

测试效果 2

  • 这里可以发现对应创建索引/增加数据/修改数据/按需查询数据/删除数据都是正常的(删除的话根据插入的数据 id 进行删除即可)。

注意:

这里可能会先清空然后再进行新添加对应数据,也就是再新覆盖的时候如果进行查询可能会查到空也就是并发接收请求故可以等它更新完再进行查(采取休眠几秒等待更新完成再次查询)。

测试源码

测试代码:

#include"../../common/es_oper.hpp"
#include<gflags/gflags.h>
DEFINE_bool(run_mode,false,"程序的运行模式,false-调试; true-发布;");
DEFINE_string(log_file,"","发布模式下,用于指定日志的输出文件");
DEFINE_int32(log_level,0,"发布模式下,用于指定日志输出等级");
int main(int argc,char*argv[]){
 google::ParseCommandLineFlags(&argc,&argv,true);
 init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
 // 进行客户端构建:std::vector<std::string> host{"http://127.0.0.1:9200/"};
 auto client = std::make_shared<elasticlient::Client>(host);
 // 索引创建
 // bool ret = EsIndex(client, "test_user").append("nickname").append("phone", "keyword", "standard", true).create();
 // if (ret == false) { LOG_INFO("索引创建失败!"); return -1; }
 // else { LOG_INFO("索引创建成功!"); }
 
 // 数据的新增
 bool ret = EsInsertData(client,"test_user").append("nickname","张三").append("phone","15566667777").insert("00001");
 if(ret ==false){LOG_ERROR("数据插入失败!");return-1;}
 else{LOG_INFO("数据新增成功!");}
 
 // 数据的修改
 ret = EsInsertData(client,"test_user").append("nickname","张三").append("phone","13344445555").insert("00001");
 if(ret ==false){LOG_ERROR("数据更新失败!");return-1;}
 else{LOG_INFO("数据更新成功!");}
 
 // std::this_thread::sleep_for(std::chrono::seconds(3)); // 这里可能会先清空然后再进行新添加对应数据,也就是再新覆盖的时候如果进行查询可能会查到空
 // 也就是并发接收请求故可以等它更新完再进行查
 
 // 条件数据查询:Json::Value user =EsSearch(client,"test_user").append_should_match("phone.keyword","13344445555")
 // .append_must_not_terms("nickname.keyword", {"张三"}).search();
 if(user.empty()|| user.isArray()==false){LOG_ERROR("结果为空,或者结果不是数组类型");return-1;}
 else{LOG_INFO("数据检索成功!");}
 int sz = user.size();
 LOG_DEBUG("检索结果条目数量:{}", sz);
 for(int i =0; i < sz; i++){
 LOG_INFO("nickname: {}", user[i]["_source"]["nickname"].asString());
 }
 
 // 进行数据移除操作(id)
 // ret = EsRemoveData(client, "test_user").remove("00001");
 // if (ret == false) { LOG_ERROR("删除数据失败"); return -1; }
 // else { LOG_INFO("数据删除成功!"); }
 return 0;
}

二. 本篇小结

本文以实操为导向,从 ES/Kibana 部署起步,解析其核心组件(索引、文档、映射等),并通过 C++ 封装示例,展示如何通过二次开发简化 ES 操作来为后续项目简化操作。

目录

  1. 概述
  2. 一. ES 介绍及简单使用
  3. 1. 介绍
  4. 2. 安装过程
  5. 检测是否安装成功
  6. 对应配置文件修改
  7. 3. ES 核心知识概念
  8. 1. 索引(Index–>库)
  9. 2. 文档(Document)
  10. 3. 字段(Field)
  11. 4. 类型(Type–>类似表)(7.x 后已废弃)
  12. 5. 映射(Mapping)
  13. 4. Kibana 介绍
  14. Kibana 是什么?
  15. Kibana 和 Elasticsearch 的关系
  16. 5. 安装 Kibana 过程
  17. 6. Kibana-ES 使用
  18. 7. ES Client 使用及封装使用接口
  19. ES 接口
  20. 1. search - 搜索文档
  21. 2. get - 获取单个文档
  22. 3. index - 创建/更新文档
  23. 4. remove - 删除文档
  24. 类比 SQL 操作
  25. ES 客户端 API 二次封装
  26. 封装思想
  27. 封装源码
  28. 测试效果
  29. 测试源码
  30. 二. 本篇小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型微调技术分类与 LoRA 实践指南
  • 模拟算法实战:替换问号、提莫攻击、Z 字形变换等 5 题详解
  • Java 正则表达式基础与实战:元字符、限定符及 Email 验证
  • Pi0 机器人 VLA 大模型在昇腾 A2 平台上的测评与部署
  • 飞牛 NAS 配置 IPv6 动态解析至阿里云域名教程
  • Docker 部署 OpenClaw 常见问题与自定义模型配置指南
  • AI 与存储结合:智能存储实践与挑战
  • F5 刷新后,浏览器前端究竟发生了什么?
  • 论文查重与 AIGC 检测技术解析:从痛点到解决方案
  • 基于 OpenAI Whisper 与 Claude 的播客内容矩阵自动化实战
  • Stable Diffusion 三种安装部署方案详解
  • 基于 C++ 与 SFML 的 2026 新春烟花模拟程序
  • Linux 系统下 libwebkit2gtk-4.1 安装与配置详解
  • 8 篇必读的大模型前沿论文解析
  • Java 9 至 Java 25:语言演进与技术革新全解析
  • 国内人工智能领域头部企业概览与求职方向分析
  • 职场经验谈:若无必要离职原因,建议谨慎跳槽
  • 医疗连续体机器人模块化控制界面设计与 Python 库应用
  • AI Agent Web Search 技能:互联网搜索与信息聚合
  • Studio One 7 核心功能解析:从创作到母带的一体化 DAW 工作流

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online