跳到主要内容Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装 | 极客日志C++java
Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装
Elasticsearch 分布式搜索引擎的安装部署与核心概念解析,结合 Kibana 可视化工具演示数据操作,重点展示 C++ 客户端 API 封装方法,涵盖索引管理、增删查改及代码示例。
2924408375 浏览 本篇摘要
本文从 Elasticsearch(ES)简介、安装到核心概念,结合 Kibana 可视化工具,全面讲解其分布式搜索能力。重点演示 C++ 客户端 API 封装,涵盖索引管理、CRUD 操作,并通过代码示例实现数据增删查改,为后续项目操作做铺垫。
一、ES 介绍及简单使用
1. 介绍
Elasticsearch 简称 ES,是开源分布式搜索引擎。
特点:
- 分布式相关:具备分布式特性,支持自动发现、索引自动分片与索引副本机制。
- 易用性与接口:采用 RESTful 风格接口,零配置,能让用户以简单方式操作。
- 多数据源与扩展性:可对接多数据源,本身扩展性好,能扩展到上百台服务器,处理 PB 级别数据。
- 存储检索及时性:近乎实时地存储、检索数据。
- 技术底层与封装:由 Java 开发,以 Lucene 为核心实现索引和搜索功能,但通过简单 RESTful API 隐藏 Lucene 复杂度,降低全文搜索门槛。
数据操作面向与方式:
- 面向对象:面向文档(document oriented),可存储整个对象或文档。
- 数据处理:不只是存储,还会对每个文档内容建立索引以实现可搜索;支持对文档(而非行式/列式数据)进行索引、搜索、排序、过滤等操作。
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 |
检测是否安装成功
- 启动 ES:在 Shell 中执行命令
sudo systemctl start elasticsearch。
- 查看 ES 服务的状态:在 Shell 中执行命令
sudo systemctl status elasticsearch.service。


可以看到,ES 服务成功运行并部署在服务器的 9200 端口上。
对应配置文件修改
默认仅本机可访问;使用 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)
3. 字段(Field)
- 是什么:文档中的单个数据项
- 例子(来自上面的文档):
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 的关系
- Kibana 必须连接 Elasticsearch 才能用(就像手机需要网络才能上网)。
- Elasticsearch 负责 存数据、搜索数据(像数据库)。
- Kibana 负责 把 ES 里的数据变成图表、仪表盘(让人更容易看懂)。
- Elasticsearch = 仓库(存东西)
- Kibana = 展示柜(把仓库里的数据摆出来给人看)
- 看 日志(比如网站报错)
- 做 数据图表(比如访问量统计)
- 监控 服务器状态(比如 CPU 使用率)
访问方式:浏览器打开 http://你的服务器 IP:5601 即可使用(这是它的默认端口,可以根据配置文件进行修改)。
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 等:
vim /etc/kibana/kibana.yml
例如,你可能需要设置 Elasticsearch 服务的 URL,大概在 32 行左右:
elasticsearch.host:"http://localhost:9200"
安装 Kibana:使用 apt 命令安装 Kibana:
- 这里对对应的 kibana 的配置文件进行编辑:默认监听所有 ip 并部署在本地的 8999 端口,然后它收到的数据发送到 localhost 的 9200 端口(也就是 es 服务器),接收到的答复再呈现可视化出来方便用户观看。
- 下面访问对应的 ip+port 可以看到 kibana 服务。
6. Kibana-ES 使用
- 找到对应 kibana 能与 es 服务交互请求与答复的界面。
- 构建对应的信息索引类型与映射(可以理解成类似 mysql 表里的字段但是一个索引只能有一个类型也就是表)。
- 成功删除整个索引(这里也可以选择对应插入数据时候的 id 进行单个删除)。
7. ES-Client 使用及封装使用接口
ES 接口
1. search - 搜索文档
cpr::Response search(const std::string &indexName,
const std::string &docType,
const std::string &body,
const std::string &routing
作用:在指定索引中执行搜索查询(类似 SQL 的 SELECT)。
例子:
auto response = search("users", "", R"({"query": {"match_all": {}}})");
2. get - 获取单个文档
cpr::Response get(const std::string &indexName,
const std::string &docType,
const std::string &id,
const std::string &routing
作用:根据 ID 获取索引中的特定文档(类似 SQL 的 SELECT * FROM table WHERE id=1)。
例子:
auto response = get("products", "", "100");
3. index - 创建/更新文档
cpr::Response index(const std::string &indexName,
const std::string &docType,
const std::string &id,
const std::string &body,
const std::string &routing
作用:向索引中写入或更新一个文档(ID 存在则更新,不存在则创建)。
例子:
auto response = index("orders", "", "5", R"({"item": "Laptop", "price": 999})");
4. remove - 删除文档
cpr::Response remove(const std::string &indexName,
const std::string &docType,
const std::string &id,
const std::string &routing
作用:根据 ID 删除索引中的文档(类似 SQL 的 DELETE FROM table WHERE id=3)。
例子:
auto response = remove("logs", "", "20240101");
类比 SQL 操作
| 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 库实现的))。
ES 客户端 API 二次封装
封装思想
- 为什么需要封装?
- 方便直接把对应固有的属性特征直接创建好,构建好对应 json 格式,为用户搞好对应单一添加接口方便操作(比如可以根据用户需要创建对应属性,根据用户需要插入对应数据集合,根据用户选择何种模式进行 search 完成 json 序列化与发送及获取应答等。)
封装了四种主要操作:索引创建、数据新增、数据查询、数据删除。
其实就是按照之前 kibana 演示的发送的格式进行 json 对象构建,然后用户来调用添加最后进行统一序列化发送 + 应答接收等。
- 这里每次给这几个类传入的是 client 对象(构建好的);而不是初始化的时候构建这样为了利用资源充分减少消耗。
- 创建索引发送请求 + 构建输入进行插入发送请求 + 分两种情况(分片与不分片)进行匹配查询发送请求 + 删除指定 id 的数据进行发送请求的四个类。
封装源码
测试效果
- 这里可以发现对应创建索引/增加数据/修改数据/按需查询数据/删除数据都是正常的(删除的话根据插入的数据 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);
auto client = std::make_shared<elasticlient::Client>(host);
bool ret = EsInsertData(client,"test_user").append("nickname","张三").append("phone","15566667777").insert("00001");
if(ret ==false){
LOG_ERROR("数据插入失败!");
return-1;
}else{
LOG_INFO("数据新增成功!");
}
if(ret ==false){
LOG_ERROR("数据更新失败!");
return-1;
}else{
LOG_INFO("数据更新成功!");
}
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());
}
return0;
}
二、本篇小结
本文以实操为导向,从 ES/Kibana 部署起步,解析其核心组件(索引、文档、映射等),并通过 C++ 封装示例,展示如何通过二次开发简化 ES 操作来为后续项目简化操作。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online