当前位置: 首页 > news >正文

ES C++客户端安装及使用

介绍

Elasticsearch , 简称 ES ,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。 es 也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 是面向文档 (document oriented) 的,这意味着它可以存储整个对象或文档 。然而它不仅仅是存储,还会索引 (index) 每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

安装

安装 Elasticsearch

# 添加仓库秘钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - 
# 上边的添加方式会导致一个 apt-key 的警告,但是不影响# 添加镜像源仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elasticsearch.list
# 更新软件包列表
sudo apt update
# 安装 es
sudo apt-get install elasticsearch=7.17.21
# 启动 es
sudo systemctl start elasticsearch
# 安装 ik 分词器插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.21

重新启动 elasticsearch,查看其是否正常运行

sudo systemctl start elasticsearch
sudo systemctl status elasticsearch.service
设置外网访问:如果新配置完成的话,默认只能在本机进行访问。
sudo vim /etc/elasticsearch/elasticsearch.yml
新增配置
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
浏览器访问 http://自己主机的ip:9200/

安装 Kibana

Kibana 是 Elasticsearch 的官方数据可视化和管理工具,通常与 Elasticsearch 配合使用。以下是关于它的核心解释和常见使用场景:

Kibana 的核心作用

  1. 数据可视化:通过图表、仪表盘(Dashboards)展示 Elasticsearch 中的索引数据,支持柱状图、折线图、地图、词云等多种可视化形式。

  2. 数据探索:使用 Discover 功能直接搜索和过滤 Elasticsearch 中的数据,支持全文搜索、字段过滤、时间范围筛选等。

  3. 索引管理:在 Management 中管理 Elasticsearch 的索引、设置索引生命周期(ILM)、定义字段映射(Mapping)等。

  4. 监控与告警:监控 Elasticsearch 集群的健康状态(如节点状态、分片分布),配置告警规则(Alerting),例如磁盘空间不足时触发通知。

  5. 开发工具:内置 Dev Tools,可直接编写和执行 Elasticsearch 的 REST API 请求(如 GET /_cat/indices)。

使用 apt 命令安装 Kibana
sudo apt install kibana
配置 Kibana (可选):

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

sudo vim /etc/kibana/kibana.yml
#添加以下配置
elasticsearch.host: "http://localhost:9200"
server.port: 5601
server.host: "0.0.0.0"
重新启动 Kibana
sudo systemctl restart kibana
sudo systemctl enable kibana
sudo systemctl status kibana
访问 Kibana
在浏览器中访问 Kibana ,通常是 http://<your-ip>:5601

ES 客户端的安装

代码: https://github.com/seznam/elasticlient
官网: https://seznam.github.io/elasticlient/index.html
ES C++ 的客户端选择并不多, 我们这里使用 elasticlient , 下面进行安装。
# 克隆代码
git clone https://github.com/seznam/elasticlient
# 切换目录
cd elasticlient
# 更新子模块
git submodule update --init --recursive
# 编译代码
mkdir build
cd build
# 需要安装 MicroHTTPD 库
sudo apt-get install libmicrohttpd-dev
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
# 安装
make install

ES 核心概念

索引(Index

一个索引就是一个拥有几分相似特征的文档的集合,类似数据库中的“库” 。比如说,你可以有一个客户数据的索引,一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

类型(Type

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定,类似数据库中的“表” 。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,为评论数据定义另一个类型。不过在  7.x 版本后已弃用。

字段(Field

字段相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
分类
类型
备注
字符串
text, keyword
text 会被分词生成索引,keyword 不会被分词生成索引,只能精确值搜索
整形
integer, long, short, byte
浮点
double float
逻辑
boolean
true false
日期
date, date_nanos“2018-01-13” 或 “2018-01-13 12:10:30”
或者时间戳,即 1970 到现在的秒数 / 毫秒数
二进制
binary
二进制通常只存储,不索引
范围
range

映射(mapping

映射是在处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其它就是处理 es 里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
名称
数值
备注
enabled
true(默认) | false
是否仅作存储,不做搜索和分析
index
true( 默认 ) | false
是否构建倒排索引(决定了是否分词,是否被索引)
index_option
dynamic
true(默认)| false
控制 mapping 的自动更新
doc_value
true(默认) | false
是否开启 doc_value ,用户聚合和排序分析,分词字段不能使用
fielddatafielddata: {"format": "disabled"}
是否为 text 类型启动 fielddata,实现排序和聚合分析。针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用 doc_value。
store
true | false(默认)是否单独设置此字段的存储而从 _source 字段中分离,只能搜索,不能获取值
coercetrue(默认) | false是否开启自动数据类型转换功能,比如:字符串转数字,浮点转整型
analyzer"analyzer": "ik"
指定分词器,默认分词器为 standard analyzer
boost
"boost": 1.23
字段级别的分数加权,默认值是 1.0
fields
"fields": {
        "raw": {
                "type":"text",
                "index":"not_analyzed"
                }
        }
对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
data_detection
true( 默认 ) | false
是否自动识别日期类型

文档 (document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档或者某个订单的一个文档。文档以 JSON Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。在一个 index/type 里面,你可以存储任意多的文档。一个文档必须被索引或者赋予一个索引的 type
Elasticsearch 与传统关系型数据库相比如下:

ES 客户端的使用示例

在浏览器中访问 Kibana,通常是 http://<your-ip>:5601,在工具页面进行编码,使用以下语句:

#创建索引并配置字段和映射
POST /user/_doc
{"settings" : {"analysis" : {"analyzer" : {"ik" : {"tokenizer" : "ik_max_word"}}}},"mappings":{"dynamic" : true,"properties":{"nickname" : {"type" : "text","analyzer" : "ik_max_word"},"user_id" : {"type" : "keyword","analyzer" : "standard"},"phone" : {"type" : "keyword","analyzer" : "standard"},"description" : {"type" : "text","enabled" : false},"avatar_id":{"type" : "keyword","enabled" : false}}}
}
#新增数据
POST /user/_doc/_bulk
{"index":{"_id":"1"}}
{"user_id" : "USER4b862aaa-2df8654a-7eb4bb65-e3507f66","nickname" : "昵称 1","phone" : "手机号 1","description" : "签名 1","avatar_id" : "头像 1"}
{"index":{"_id":"2"}}
{"user_id" : "USER14eeeaa5-442771b9-0262e455-e4663d1d","nickname" : "昵称 2","phone" : "手机号 2","description" : "签名 2","avatar_id" : "头像 2"}
{"index":{"_id":"3"}}
{"user_id" : "USER484a6734-03a124f0-996c169d-d05c1869","nickname" : "昵称 3","phone" : "手机号 3","description" : "签名 3","avatar_id" : "头像 3"}
{"index":{"_id":"4"}}
{"user_id" : "USER186ade83-4460d4a6-8c08068f-83127b5d","nickname" : "昵称 4","phone" : "手机号 4","description" : "签名 4","avatar_id" : "头像 4"}
{"index":{"_id":"5"}}
{"user_id" : "USER6f19d074-c33891cf-23bf5a83-57189a19","nickname" : "昵称 5","phone" : "手机号 5","description" : "签名 5","avatar_id" : "头像 5"}
{"index":{"_id":"6"}}
{"user_id" : "USER97605c64-9833ebb7-d0455353-35a59195","nickname" : "昵称 6","phone" : "手机号 6","description" : "签名 6","avatar_id" : "头像 6"}

main.cc

#include <elasticlient/client.h>
#include <cpr/cpr.h>
#include <iostream>
int main()
{// 1. 构建ES客户端elasticlient::Client client({"http://127.0.0.1:9200/"});// 2. 发起搜索请求try{auto rsp = client.search("user", "_doc", "{\"query\":{\"match_all\":{}}}");std::cout << rsp.status_code << std::endl;std::cout << rsp.text << std::endl;}catch (const std::exception &e){std::cerr << "请求失败:" << e.what() << '\n';return -1;}return 0;
}

makefile

main : main.ccg++ -o $@ $^ -std=c++17 -lcpr -lelasticlient

ES 客户端 API 二次封装

封装客户端 api 主要是因为,客户端只提供了基础的数据存储获取调用功能,无法根据我们的思想完成索引的构建,以及查询正文的构建,需要使用者自己组织好 json 进行序列化后才能作为正文进行接口的调用。而封装的目的就是简化用户的操作,将索引的 json 正文构造,以及查询搜索的正文构造操作给封装起来,使用者调用接口添加字段就行,不用关心具体的 json 数据格式。
封装内容:
  • 索引构造过程的封装:索引正文构造过程,大部分正文都是固定的,唯一不同的地方是各个字段不同的名称以及是否只存储不索引这些选项,因此重点关注以下几个点即可:
  1. 字段类型:type : text / keyword (目前只用到这两个类型)
  2. 是否索引:enable : true/false
  3. 索引的话分词器类型: analyzer : ik_max_word / standard
  • 新增文档构造过程的封装:新增文档其实在常规下都是单条新增,并非批量新增,因此直接添加字段和值就行
  • 文档搜索构造过程的封装:搜索正文构造过程,我们默认使用条件搜索,我们主要关注的两个点:
  1. 应该遵循的条件是什么:should 中有什么
  2. 条件的匹配方式是什么:match 还是 term/terms,还是 wildcard
  3. 过滤的条件字段是什么:must_not 中有什么
  4. 过滤的条件字段匹配方式是什么:match 还是 wildcard,还是 term/terms
整个封装的过程其实就是对 Json::Value 对象的一个组织的过程,并无太大的难点。
#pragma once
#include <elasticlient/client.h>
#include <json/json.h>
#include <iostream>
#include <memory>
#include <sstream>
#include <cpr/cpr.h>
#include "logger.hpp"bool Serialize(const Json::Value &val, std::string &dst)
{// 先定义Json::StreamWriter 工厂类 Json::StreamWriterBuilderJson::StreamWriterBuilder swb;swb.settings_["emitUTF8"] = true;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());// 通过Json::StreamWriter中的write接口进行序列化std::stringstream ss;int ret = sw->write(val, &ss);if (ret != 0){std::cout << "Json反序列化失败!\n";return false;}dst = ss.str();return true;
}
bool UnSerialize(const std::string &src, Json::Value &val)
{Json::CharReaderBuilder crb;crb.settings_["emitUTF8"] = true;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string error;bool ret = cr->parse(src.c_str(), src.c_str() + src.size(), &val, &error);if (ret == false){std::cout << "json反序列化失败: " << error << std::endl;return false;}return true;
}
class ESIndex
{
public:ESIndex(std::shared_ptr<elasticlient::Client> &client,const std::string &name, const std::string &type = "_doc") : _name(name), _type(type), _client(client){Json::Value analysis;Json::Value analyzer;Json::Value ik;Json::Value tokenizer;tokenizer["tokenizer"] = "ik_max_word";ik["ik"] = tokenizer;analyzer["analyzer"] = ik;analysis["analysis"] = analyzer;_index["settings"] = analysis;}ESIndex &append(const std::string &key, const std::string &type = "text",const std::string &analyzer = "ik_max_word", bool enabled = true){Json::Value fields;fields["type"] = type;fields["analyzer"] = analyzer;if (enabled == false)fields["enabled"] = false;_properties[key] = fields;return *this;}bool create(const std::string &index_id = "default_index_id"){Json::Value mappings;mappings["dynamic"] = true;mappings["properties"] = _properties;_index["mappings"] = mappings;std::string body;bool ret = Serialize(_index, body);if (ret == false){LOG_ERROR("索引序列化失败!");return false;}LOG_DEBUG("{}", body);try{auto rsp = _client->index(_name, _type, index_id, body);if (rsp.status_code < 200 || rsp.status_code >= 300){LOG_ERROR("创建ES索引{}失败,响应状态码异常:{}", _name, rsp.status_code);return false;}}catch (const std::exception &e){LOG_ERROR("创建ES索引{}失败:{}", _name, e.what());return false;}return true;}private:std::shared_ptr<elasticlient::Client> _client;std::string _name;std::string _type;Json::Value _index;Json::Value _properties;
};class ESInsert
{
public:ESInsert(std::shared_ptr<elasticlient::Client> &client,const std::string &name, const std::string &type = "_doc") : _name(name), _type(type), _client(client){}template <typename T>ESInsert &append(const std::string &key, const T &val){_item[key] = val;return *this;}bool insert(const std::string id = ""){std::string body;bool ret = Serialize(_item, body);if (ret == false){LOG_ERROR("索引序列化失败!");return false;}LOG_DEBUG("{}", body);try{auto rsp = _client->index(_name, _type, id, body);if (rsp.status_code < 200 || rsp.status_code >= 300){LOG_ERROR("新增数据{}失败,响应状态码异常:{}", body, rsp.status_code);return false;}}catch (const std::exception &e){LOG_ERROR("新增数据{}失败:{}", body, e.what());return false;}return true;}private:std::shared_ptr<elasticlient::Client> _client;std::string _name;std::string _type;Json::Value _item;
};class ESRemove
{
public:ESRemove(std::shared_ptr<elasticlient::Client> &client,const std::string &name, const std::string &type= "_doc"): _client(client), _name(name), _type(type){}bool remove(const std::string &id){try{auto rsp = _client->remove(_name, _type, id);if (rsp.status_code < 200 || rsp.status_code >= 300){LOG_ERROR("删除数据{}失败,响应状态码异常:{}", id, rsp.status_code);return false;}}catch (const std::exception &e){LOG_ERROR("删除数据{}失败:{}", id, e.what());return false;}return true;}private:std::shared_ptr<elasticlient::Client> _client;std::string _name;std::string _type;
};class ESSearch
{
public:ESSearch(std::shared_ptr<elasticlient::Client> &client,const std::string &name, const std::string &type= "_doc"): _client(client), _name(name), _type(type){}ESSearch &append_must_not_terms(const std::string &key, const std::vector<std::string> &vals){Json::Value fields;for (const auto &val : vals){fields[key].append(val);}Json::Value terms;terms["terms"] = fields;_must_not.append(terms);return *this;}ESSearch &append_must_term(const std::string &key, const std::string &val){Json::Value field;field[key] = val;Json::Value term;term["terms"] = field;_must.append(term);return *this;}ESSearch &append_must_match(const std::string &key, const std::string &val){Json::Value field;field[key] = val;Json::Value match;match["match"] = field;_must.append(match);return *this;}ESSearch &append_should_match(const std::string &key, const std::string &val){Json::Value field;field[key] = val;Json::Value match;match["match"] = field;_should.append(match);return *this;}Json::Value search(){Json::Value cond;if (_must_not.empty() == false)cond["must_not"] = _must_not;if (_must.empty() == false)cond["must"] = _must;if (_should.empty() == false)cond["should"] = _should;Json::Value query;query["bool"] = cond;Json::Value root;root["query"] = query;std::string body;bool ret = Serialize(root, body);if (ret == false){LOG_ERROR("索引序列化失败!");return Json::Value();}LOG_DEBUG("{}", body);cpr::Response rsp;try{rsp = _client->search(_name, _type, body);if (rsp.status_code < 200 || rsp.status_code >= 300){LOG_ERROR("检索数据{}失败,响应状态码异常:{}", body, rsp.status_code);return Json::Value();}}catch (const std::exception &e){LOG_ERROR("删除数据{}失败:{}", body, e.what());return Json::Value();}LOG_DEBUG("检索响应正文:{}", rsp.text);Json::Value json_rsp;ret = UnSerialize(rsp.text, json_rsp);if (ret == false){LOG_ERROR("检索数据 {} 结果反序列化失败", rsp.text);return Json::Value();}return json_rsp["hits"]["hits"];}private:std::shared_ptr<elasticlient::Client> _client;std::string _name;std::string _type;Json::Value _must_not;Json::Value _must;Json::Value _should;
};

makefile

main : main.cc g++ -std=c++17 $^ -o $@ -lcpr -lelasticlient -lspdlog -lfmt -lgflags -ljsoncpp

相关文章:

ES C++客户端安装及使用

介绍 Elasticsearch &#xff0c; 简称 ES &#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;restful 风格接口&#xff0c;多数据源&…...

C++学习之STL学习

在经过前面的简单的C入门语法的学习后&#xff0c;我们开始接触C最重要的组成部分之一&#xff1a;STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理&#xff08;了解&#xff09; UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发

文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包&#xff0c;旨在加速 Nvidia GPU 上的计算密…...

LangChain对话链:打造智能多轮对话机器人

LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0…...

MIT 6.S081 2020 Lab3 page tables 个人全流程

文章目录 零、写在前面1、关于页表2、RISC-V Rv39页表机制3、虚拟地址设计4、页表项设计5、访存流程6、xv6 的页表切换7、页表遍历 一、Print a page table1.1 说明1.2 实现 二、A kernel page table per process2.1 说明2.2 初始化 / 映射相关2.3 用户内核页表的创建和回收2.4…...

spring cloud loadbalancer实现机房感知的负载均衡

1 概述 在同城多机房情景下&#xff0c;各个机房各自部署一套微服务集群&#xff0c;正常情况下微服务调用在本机房闭环。在如下某些灾难情景&#xff0c;可以尝试拉远调用以最大程度维持业务连续性&#xff0c;这些情景例如&#xff1a; A机房多个服务器宕机。应用由于BUG发…...

vs2022配置opencv

一、下载opencv 1、进入https://opencv.org/官网下载 2、打开下载的exe开始安装&#xff0c;自己新建一个文件夹opencv作为安装路径 3、安装完成得到opencv文件内容 4、开始配置环境变量 4.1、复制下图的路径 4.2、添加到系统环境变量 5、配置VS项目环境 5.1、添加包含目录 …...

Appium-OppoA92S-真机记坑

问题现象 使用Appium操作真机时候&#xff0c;需要安装AppiumSettings软件&#xff0c;但是实际操作&#xff0c;一直提示安装失败&#xff0c;安装包异常 问题分析 [待定] 网上找到方式&#xff0c;都尝试过&#xff0c;无效 问题解决 取消开发者模式&#xff0c;USB连接手…...

ENSP-OSPF综合实验

AR4中通过ospf获取的其他区域路由信息&#xff0c;并且通过路由汇总后简化路由信息 实现全网通&#xff0c;以及单向重发布&#xff0c;以及通过缺省双向访问&#xff0c; 通过stub简化过滤四类五类lsa&#xff0c;简化ospf路由信息 通过nssa简化ospf信息 区域汇总简化R4路由信…...

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程&#xff0c;基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现&#xff1a; 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制&#xff08;LED&#xff09; 硬件组成&#xff1a; NodeMC…...

HTML12:文本框和单选框

表单元素格式 属性说明type指定元素的类型。text、password、 checkbox、 radio、submit、reset、file、hidden、image 和button&#xff0c;默认为textname指定表单元素的名称value元素的初始值。type为radio时必须指定一个值size指定表单元素的初始宽度。当type为text 或pas…...

JVM规范之运行时数据区域

JVM运行时数据区 前言为什么要阅读jvm规范&#xff1f;阅读本篇文章可以学习到啥&#xff1f; 正文概述JVM线程私有的运行时数据区pc(program counter) RegisterJVM StackNative Method Stack JVM线程共享的运行时数据区HeapMethod AreaRun-time constant pool 总结参考链接 前…...

LVGL(lv_btnmatrix矩阵按钮)

文章目录 &#x1f527; 1. 基本概念&#x1f4cc; lv\_btnmatrix 是什么&#xff1f; &#x1f9f1; 2. 基本结构和用法✅ 创建按钮矩阵✅ 设置按钮文字 &#x1f9f0; 3. 设置按钮行为&#x1f504; 4. 响应按钮点击&#x1f3a8; 5. 自定义样式&#x1f4cc; 6. 使用技巧&am…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…...

英语时态--中英文对“时间”的不同理解

文章目录 中英文时间上的差异我现在正在休息一般现在时1. 经常发生的动作2. 表客观事实3. 表示现在的状态一般将来时1. will2. be going to含义1:打算在将来某时做某事含义2:某事预计要发生而且不可避免中英文时间上的差异 我现在正在休息 “我现在正在休息。”用英文怎么说…...

Linux基础开发工具一(yum/apt ,vim)

前言 Linux下&#xff0c;如何进行软件安装&#xff0c;查找&#xff0c;卸载 1.源代码安装 2. rpm安装方式&#xff0c;安装包的本质&#xff0c;就是把源代码在Linux下编译好&#xff0c;然后打包&#xff08;别人把自己编译好的软件打包给你让你去安装&#xff09; 上面…...

Java 线程池原理

Java 线程池是一种管理和复用线程的机制&#xff0c;其原理如下&#xff1a; 核心概念 线程池的初始化 &#xff1a;在创建线程池时&#xff0c;需要设置一些关键参数&#xff0c;如核心线程数&#xff08;corePoolSize&#xff09;、最大线程数&#xff08;maximumPoolSize&am…...

AJAX 使用 和 HTTP

ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML&#xff1a; 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用&#xff1f;表示之后的参数…...

mem0跟Memgraph交互

目录 1. 安装和设置2. 配置连接3. 使用 mem0 进行交互4. 添加和查询数据5. 代码运行结果 1. 安装和设置 首先&#xff0c;确保你已经安装了 Memgraph 和 mem0 库。你可以使用 pip 来安装 mem0&#xff1a; uv pip install "mem0ai[graph]" uv pip install langchai…...

httpclient请求出现403

问题 httpclient请求对方服务器报403&#xff0c;用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因&#xff1a; 因为没有设置为浏览器形式&#…...

验证码与登录过程逻辑学习总结

目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo&#xff0c;需要自己做一个前端登录页面&#xff0c;不过api接口都是现成的&#xff0c;一开始以为过程会很easy&#xff0c;…...

openai接口参数max_tokens改名max-completion-tokens?

文章目录 关于max_tokens参数max_tokens改max-completion-tokens&#xff1f;控制 OpenAI 模型响应的长度 关于max_tokens参数 大模型 API&#xff08;比如 OpenAI、DeepSeek、Moonshot 等&#xff09;都是按照“Token 数量”来计费。 控制内容&#xff1a;控制一次请求返回的…...

【办公类-39-07】20250511批量生成通义万相图片(七)彩色背景蝴蝶-筛选无黑无白的图片

制作了教师裁剪的拼图块后&#xff0c;发现如果图案上有黑色&#xff0c;就没法看清出凹凸角&#xff0c;剪起来有误差 所以黑色也要剔除 通义万相下载的彩色蝴蝶有彩色背景的图片&#xff0c;放弃有白色和黑色图案的图片&#xff0c;保留彩色图案的蝴蝶 deepseek、阿夏 20250…...

容器技术 20 年:颠覆、重构与重塑软件世界的力量

目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合​ 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重&#xff0c;到操作系统虚拟…...

Docker 部署 - Crawl4AI 文档 (v0.5.x)

Docker 部署 - Crawl4AI 文档 (v0.5.x) 快速入门 &#x1f680; 拉取并运行基础版本&#xff1a; # 不带安全性的基本运行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行 docker run -p 11235:1123…...

在C++中,符号位是否参与位运算

在C中&#xff0c;符号位是否参与位运算取决于具体的运算符和数据类型。以下是详细解释&#xff1a; 1. 按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;、按位异或&#xff08;^&#xff09; 规则&#xff1a;这些运算符会处理包括符号位在内的所有二…...

【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;以太网、MAC地址、MTU与ARP协议 下篇文章&#xff1a;五种IO模型与阻…...

redis数据结构-08(SINTER、SUNION、SDIFF、SISMEMBER)

集合运算&#xff1a;SINTER、SUNION、SDIFF、SISMEMBER Redis 集合是一种功能强大的数据结构&#xff0c;可用于存储一组唯一元素。本课基于上一课对 Redis 集合的介绍&#xff0c;深入探讨了使 Redis 集合如此多功能的基本集合操作&#xff1a; SINTER 、 SUNION 、 SDIFF 和…...

大模型都有哪些超参数

大模型的超参数是影响其训练效果、性能和泛化能力的关键设置,可分为以下几大类别并结合实际应用进行详细说明: 一、训练过程相关超参数 学习率(Learning Rate) 作用:控制参数更新的步长,直接影响收敛速度和稳定性。过高会导致震荡或过拟合,过低则收敛缓慢。调整策略:初…...

【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计)

【更新至2023年】1999-2023年上市公司人工智能词频统计数据&#xff08;年报词频统计&#xff09; 1、时间&#xff1a;1999-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;股票代码、公司简称、年报标题、年份、行业名称、行业代码、全文-文本总长度、仅中英…...

通过 Azure DevOps 探索 Helm 和 Azure AKS

俗话说&#xff1a;“慷慨之人必昌盛&#xff1b;滋润他人者&#xff0c;必得滋润。” 如果您觉得这篇文章对您有有所帮助&#xff0c;请点赞&#xff0c;关注&#xff0c;转发&#xff01; 前言 在不断发展的云计算世界中&#xff0c;应用程序的无缝部署和管理至关重要。Azu…...

Go语言标识符

文章目录 标识符的组成规则Go语言关键字预定义标识符标识符命名惯例 特殊标识符标识符访问权限控制 在Go语言中&#xff0c;标识符(Identifier)是用来命名变量、函数、类型、常量等程序实体的名称。 标识符的组成规则 1、必须以字母或下划线(_)开头&#xff1a; 字母包括Unico…...

Spring Cloud : OpenFeign(远程调用)

RestTemplate虽然比直接用HTTPClient简单的多&#xff0c;但是还是存在着许多的问题&#xff0c;比如url拼接麻烦&#xff0c;容易出错&#xff0c;并且可读性很差 public OrderDetail selectOrderById(Integer orderId){OrderDetail orderDetail orderMapper.selectOrderById…...

JVM内存结构有哪些?HashMap和HashTable的区别?

JVM内存结构 JVM内存主要分为以下几个区域&#xff1a; 程序计数器(Program Counter Register) 线程私有&#xff0c;记录当前线程执行的字节码行号指示器 唯一一个不会出现OOM的内存区域 Java虚拟机栈(Java Virtual Machine Stacks) 线程私有&#xff0c;生命周期与线程相…...

三维空间中的组织行为映射:MATLAB 数据插值可视化技术

在组织行为学研究中,如何直观呈现多维变量之间的关系一直是个挑战。今天我们将深入解析一段 MATLAB 代码,看看如何通过数据插值和三维可视化技术,将抽象的组织行为数据转化为直观的三维曲面图,揭示组织自尊 (OBSE)、牺牲性领导 (SSL) 与责任感知 (FO) 之间的复杂关系。 �…...

ImportError: DLL load failed: 找不到指定的程序。

查看其他博客说是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下载放到博客说的目录下 没有用 解决不了一点 OpenSSL for Windows 64位 完整安装包 在这里 项目地址: https://gitcode.com/open-source-toolkit/eb627 注意事项 此安装包仅适用于64位Windows系…...

计算机的三个根本性基础

1. 计算机是执行输入、运算、输出的机器 从硬件上看&#xff0c;计算机是执行输入、运算、输出的机器&#xff0c;计算机的硬件由大量的IC&#xff08;Integrated Circuit&#xff0c;集成电路&#xff09;组成。 IC会在其中内部对外部输入的信息进行运算&#xff0c;并把运算…...

C++ Builder XE 使用DevMode设置打印机的自定义纸张,打印方向

代码功能介绍&#xff08;以备以后查询)&#xff1a;该代码片段展示了如何将TPanel控件的内容作为图像打印出来。首先&#xff0c;代码创建了一个与TPanel大小相同的位图&#xff0c;并通过BitBlt函数将TPanel的内容复制到位图中。接着&#xff0c;代码配置打印机&#xff0c;设…...

QOwnNotes:功能强大的跨平台笔记应用程序

QOwnNotes是一款功能强大的跨平台笔记应用程序&#xff0c;专为追求高效、灵活笔记管理的用户设计。它不仅支持Windows、macOS和Linux等多种操作系统&#xff0c;还提供了丰富的功能&#xff0c;帮助用户轻松管理笔记、任务和清单。无论是日常记录、学习笔记还是工作计划&#…...

深入理解反序列化攻击:原理、示例与利用工具实战

反序列化漏洞是现代 Web 安全中的一个高危攻击类型&#xff0c;常常导致远程代码执行&#xff08;RCE&#xff09;、文件读写、身份伪造等严重后果。本文将从基础原理讲起&#xff0c;结合实际代码和工具&#xff08;PHPGGC、ysoserial&#xff09;演示反序列化攻击的完整过程。…...

【今日三题】素数回文(模拟) / 活动安排(区间贪心) / 合唱团(动态规划)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 素数回文(模拟)活动安排(区间贪心)合唱团(动态规划) 素数回文(模拟) 素数回文 #include <iostream> #include <st…...

一文了解B+树的删除原理

1. B树的核心特性回顾 B树是一种广泛应用于数据库和文件系统的平衡多路搜索树&#xff0c;其核心特性包括&#xff1a; 阶数&#xff08;m&#xff09;&#xff1a;定义每个节点最多拥有的子节点数&#xff08;或键数&#xff09;节点容量规则&#xff1a; 根节点&#xff1a…...

Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)

下载地址&#xff1a; 前端&#xff1a;https://download.csdn.net/download/2401_83418369/90811402 后端&#xff1a;https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...

26考研——中央处理器_指令流水线_指令流水线的基本概念 流水线的基本实现(5)

408答疑 文章目录 六、指令流水线指令流水线的基本概念流水线的基本实现流水线设计的原则流水线的逻辑结构流水线的时空图表示 八、参考资料鲍鱼科技课件26王道考研书 六、指令流水线 前面介绍的指令都是在单周期处理机中采用串行方法执行的&#xff0c;同一时刻 CPU 中只有一…...

DAY 22 复习日kaggle泰坦里克号人员生还预测

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 输入&#xff1a; import pandas as pd from sklea…...

SpringCloud Gateway知识点整理和全局过滤器实现

predicate(断言)&#xff1a; 判断uri是否符合规则 • 最常用的的就是PathPredicate&#xff0c;以下列子就是只有url中有user前缀的才能被gateway识别&#xff0c;否则它不会进行路由转发 routes:- id: ***# uri: lb://starry-sky-upmsuri: http://localhost:9003/predicate…...

婴幼儿托育实训室师资协同培养模式

随着社会对婴幼儿托育服务需求的日益增长&#xff0c;培养适应市场需求的高素质托育人才成为当务之急。产教融合作为一种有效的人才培养模式&#xff0c;对于婴幼儿托育实训室建设具有重要意义&#xff0c;能够有效整合学校和企业的资源&#xff0c;为婴幼儿托育实训室人才培养…...

Gartner 《2025大数据管理规划指南》学习心得

概要 本研究旨在为数据和分析&#xff08;D&A&#xff09;技术专业人员提供2025年的数据管理规划指导&#xff0c;帮助他们应对最新数据管理趋势&#xff0c;以增强决策制定并实现卓越的业务成果。强调了持续适应数据管理实践的组织将更有能力做好人工智能&#xff08;AI&…...

理解反向Shell:隐藏在合法流量中的威胁

引言 在网络安全领域&#xff0c;​​反向Shell&#xff08;Reverse Shell&#xff09;​​ 是一种隐蔽且危险的攻击技术&#xff0c;常被渗透测试人员和攻击者用于绕过防火墙限制&#xff0c;获取对目标设备的远程控制权限。与传统的“正向Shell”&#xff08;攻击者主动连接…...

《AI大模型应知应会100篇》第55篇:大模型本地开发环境搭建

第55篇&#xff1a;大模型本地开发环境搭建 ——从零开始构建你的AI炼金炉 &#x1f4cc; 摘要 在人工智能尤其是大模型&#xff08;LLM&#xff09;领域&#xff0c;一个高效、稳定、可扩展的本地开发环境是每位开发者的第一块基石。本文将手把手带你完成从硬件选型到软件配…...