Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装
Elasticsearch 分布式搜索引擎介绍、Kibana 安装与配置、核心概念(索引、文档、映射)解析。演示 C++ 客户端 API 封装,实现索引创建、数据增删查改操作,结合代码示例展示二次开发流程,为项目集成提供参考。

Elasticsearch 分布式搜索引擎介绍、Kibana 安装与配置、核心概念(索引、文档、映射)解析。演示 C++ 客户端 API 封装,实现索引创建、数据增删查改操作,结合代码示例展示二次开发流程,为项目集成提供参考。

本文从 Elasticsearch(ES)简介、安装到核心概念,结合 Kibana 可视化工具,全面讲解其分布式搜索能力。重点演示 C++ 客户端 API 封装,涵盖索引管理、CRUD 操作,并通过代码示例实现数据增删查改,为后续项目操作做铺垫。
Elasticsearch 简称 ES,是开源分布式搜索引擎。
特点:
数据操作面向与方式:
| 步骤 | 命令/操作 |
|---|---|
| 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 |
启动 es:在 Shell 中执行命令 sudo systemctl start elasticsearch。
查看 es 服务的状态:在 Shell 中执行命令 sudo systemctl status elasticsearch.service。
可以看到,ES 服务成功运行并部署在服务器的 9200 端口上。
es 服务成功能进行访问。
默认仅本机可访问;使用 Vim 编辑/etc/elasticsearch/elasticsearch.yml 文件。
新增配置:
network.host: 0.0.0.0http.port: 9200cluster.initial_master_nodes: ["node-1"]logs-2024(存储 2024 年的日志数据)products(存储商品信息)users(存储用户数据)例子:
// 在 users 索引中的一条文档
{"name":"张三","age":25,"email":"[email protected]","join_date":"2024-01-15"}
name 字段(值:'张三')age 字段(值:25)email 字段(值:'[email protected]')content 索引中可能有:
article 类型(存储文章)comment 类型(存储评论)_doc)users 索引中所有文档都是 _doc 类型{"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类型即可),但是专注于索引和字段映射的设计更重要。
Kibana 是 Elasticsearch 的可视化工具,用 网页界面 展示和分析 ES 里的数据(比如日志、图表、仪表盘)。
简单比喻:
常见用途:
访问方式:浏览器打开 http://你的服务器 IP:5601 即可使用(这是它的默认端口,可以根据配置文件进行修改)。
验证安装:使用以下命令检查 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 的配置文件进行编辑:默认监听所有 ip 并部署在本地的 8999 端口,然后 它收到的数据发送到 localhost 的 9200 端口(也就是 es 服务器),接收到的答复再呈现可视化出来方便用户观看。
监听端口正监听,服务正常运行。
下面访问对应的 ip+port 可以看到 kibana 服务。
下面操作下:
下面进行创建索引,增删查一下:
构建对应的信息索引类型与映射(可以理解成类似 mysql 表里的字段但是一个索引只能有一个类型也就是表)。
成功插入对应数据。
进行全量查询。
按需查询。
成功删除整个索引(这里也可以选择对应插入数据时候的 id 进行单个删除)。
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": {}}})");
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");
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})");
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");
| ES 接口 | 对应 SQL 操作 | 核心功能 |
|---|---|---|
search | SELECT ... WHERE ... | 搜索/查询数据 |
get | SELECT * FROM ... WHERE id=? | 按 ID 精确获取数据 |
index | INSERT/UPDATE | 写入或更新数据 |
remove | DELETE | 删除数据 |
这些接口是 Elasticsearch REST API 的 C++ 封装(通过 HTTP 请求库 cpr 实现,也就是说用到的除了 elasticsearch 库还有 cpr 库(c++仿照 python 的 requests 库实现的))。
封装了四种主要操作:索引创建、数据新增、数据查询、数据删除。
其实就是按照之前 kibana 演示的发送的格式进行 json 对象构建,然后用户来调用添加最后进行统一序列化发送 + 应答接收等。
对应封装的代码:
1·封装功能接口可结合注释看详解:
2 封装接口格式依据对应文本请求:
测试效果:
注意:
这里可能会先清空然后再进行新添加对应数据,也就是再新覆盖的时候如果进行查询可能会查到空也就是并发接收请求故可以等它更新完再进行查(采取休眠几秒等待更新完成再次查询)。
测试代码:
#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);
/////////这里不需要持久对象直接匿名对象向 es 服务端发送构建完成即可:
// 索引创建
// 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",).();
(ret ==){
();
;
}{
();
}
ret =(client,).(,).(,).();
(ret ==){
();
;
}{
();
}
;
}
本文以实操为导向,从 ES/Kibana 部署起步,解析其核心组件(索引、文档、映射等),并通过 C++ 封装示例,展示如何通过二次开发简化 ES 操作来为后续项目简化操作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online