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

3、Elasticsearch功能使用

第4章 功能使用
4.1 Java API 操作
随着 Elasticsearch 8.x 新版本的到来,Type 的概念被废除,为了适应这种数据结构的改
变,Elasticsearch 官方从 7.15 版本开始建议使用新的 Elasticsearch Java Client。
4.1.1 增加依赖关系

<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><elastic.version>8.1.0</elastic.version>
</properties>
<dependencies><dependency><groupId>org.elasticsearch.plugin</groupId><artifactId>x-pack-sql-jdbc</artifactId><version>8.1.0</version></dependency><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>${elastic.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version></dependency>
</dependencies>

4.1.2 获取客户端对象
就像连接 MySQL 数据库一样,Java 通过客户端操作 Elasticsearch 也要获取到连接后才
可以。咱们现在使用的基于 https 安全的 Elasticsearch 服务,所以首先我们需要将之前的证
书进行一个转换
openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys -out java-ca.crt
在这里插入图片描述
配置证书后,我们就可以采用 https 方式获取连接对象了。

# 导入的类
import co.elastic.clients.elasticsearch.*;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.*;
import org.apache.http.client.*;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.*;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.ssl.*;
import org.elasticsearch.client.*;
import javax.net.ssl.SSLContext;
import java.io.InputStream;
import java.nio.file.*;
import java.security.KeyStore;
import java.security.cert.*;
# 获取客户端对象
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("elastic", "O3x0hfu7i=ZbQvlktCnd"));
Path caCertificatePath = Paths.get("ca.crt");
CertificateFactory factory =CertificateFactory.getInstance("X.509");
Certificate trustedCa;
try (InputStream is = Files.newInputStream(caCertificatePath)) {trustedCa = factory.generateCertificate(is);
}
KeyStore trustStore = KeyStore.getInstance("pkcs12");
trustStore.load(null, null);
trustStore.setCertificateEntry("ca", trustedCa);
SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial(trustStore, null);
final SSLContext sslContext = sslContextBuilder.build();
RestClientBuilder builder = RestClient.builder(new HttpHost("linux1", 9200, "https")).setHttpClientConfigCallback(new 
RestClientBuilder.HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {return httpClientBuilder.setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setDefaultCredentialsProvider(credentialsProvider);}});
RestClient restClient = builder.build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
ElasticsearchAsyncClient asyncClient = new ElasticsearchAsyncClient(transport);
...
transport.close();

4.1.3 操作数据(普通操作)
4.1.3.1 索引操作

// 创建索引
CreateIndexRequest request = new 
CreateIndexRequest.Builder().index("myindex").build();
final CreateIndexResponse createIndexResponse = 
client.indices().create(request);
System.out.println("创建索引成功:" + createIndexResponse.acknowledged());
// 查询索引
GetIndexRequest getIndexRequest = new 
GetIndexRequest.Builder().index("myindex").build();
final GetIndexResponse getIndexResponse = 
client.indices().get(getIndexRequest);
System.out.println("索引查询成功:" + getIndexResponse.result());
// 删除索引
DeleteIndexRequest deleteIndexRequest = new 
DeleteIndexRequest.Builder().index("myindex").build();
final DeleteIndexResponse delete = client.indices().delete(deleteIndexRequest);
final boolean acknowledged = delete.acknowledged();
System.out.println("删除索引成功:" + acknowledged)

4.1.3.2 文档操作

// 创建文档
IndexRequest indexRequest = new IndexRequest.Builder().index("myindex").id(user.getId().toString()).document(user).build();
final IndexResponse index = client.index(indexRequest);
System.out.println("文档操作结果:" + index.result());
// 批量创建文档
final List<BulkOperation> operations = new ArrayList<BulkOperation>();
for ( int i= 1;i <= 5; i++ ) {final CreateOperation.Builder builder = new CreateOperation.Builder();builder.index("myindex");builder.id("200" + i);builder.document(new User(2000 + i, 30 + i * 10, "zhangsan" + i, "beijing", 
1000 + i*1000));final CreateOperation<Object> objectCreateOperation = builder.build();final BulkOperation bulk = new 
BulkOperation.Builder().create(objectCreateOperation).build();operations.add(bulk);
}
BulkRequest bulkRequest = new 
BulkRequest.Builder().operations(operations).build();
final BulkResponse bulkResponse = client.bulk(bulkRequest);
System.out.println("数据操作成功:" + bulkResponse);
// 删除文档
DeleteRequest deleteRequest = new 
DeleteRequest.Builder().index("myindex").id("1001").build();
client.delete(deleteRequest);

4.1.3.3 文档查询

final SearchRequest.Builder searchRequestBuilder = new 
SearchRequest.Builder().index("myindex1");
MatchQuery matchQuery = new 
MatchQuery.Builder().field("city").query(FieldValue.of("beijing")).build();
Query query = new Query.Builder().match(matchQuery).build();
searchRequestBuilder.query(query);
SearchRequest searchRequest = searchRequestBuilder.build();
final SearchResponse<Object> search = client.search(searchRequest, 
Object.class);
System.out.println(search);

4.1.4 操作数据(函数操作)
4.1.4.1 索引操作


// 创建索引
final Boolean acknowledged = client.indices().create(p -> 
p.index("")).acknowledged();
System.out.println("创建索引成功");
// 获取索引
System.out.println(client.indices().get(req -> req.index("myindex1")
).result());
// 删除索引
client.indices().delete(reqbuilder -> reqbuilder.index("myindex")
).acknowledged();

4.1.4.2 文档操作

// 创建文档
System.out.println(client.index(req ->req.index("myindex").id(user.getId().toString()).document(user)).result()
);
// 批量创建文档
client.bulk(req -> {users.forEach(u -> {req.operations(b -> {b.create(d -> 
d.id(u.getId().toString()).index("myindex").document(u));return b;});});return req;}
);
// 删除文档
client.delete(req -> req.index("myindex").id("1001")
);

4.1.4.3 文档查询

client.search(req -> {req.query(q ->q.match(m -> m.field("city").query("beijing")));return req;}, Object.class
);

4.1.5 客户端异步操作
ES Java API 提供了同步和异步的两种客户端处理。之前演示的都是同步处理,异步客
户端的处理和同步客户端处理的 API 基本原理相同,不同的是需要异步对返回结果进行相
应的处理

// 创建索引
asyncClient.indices().create(req -> {req.index("newindex");return req;}
).whenComplete((resp, error) -> {System.out.println("回调函数");if ( resp != null ) {System.out.println(resp.acknowledged());} else {error.printStackTrace();}}
);
System.out.println("主线程操作...");
asyncClient.indices().create(req -> {req.index("newindex");return req;}
)
.thenApply(resp -> {return resp.acknowledged();}
)
.whenComplete((resp, error) -> {System.out.println("回调函数");if ( !resp ) {System.out.println();} else {error.printStackTrace();}}
);

4.2 EQL 操作
EQL 的全名是 Event Query Language (EQL)。事件查询语言(EQL)是一种用于基于事
件的时间序列数据(例如日志,指标和跟踪)的查询语言。在 Elastic Security 平台上,当
输入有效的 EQL 时,查询会在数据节点上编译,执行查询并返回结果。这一切都快速、并
行地发生,让用户立即看到结果。
EQL 的优点:
➢ EQL 使你可以表达事件之间的关系
许多查询语言允许您匹配单个事件。EQL 使你可以匹配不同事件类别和时间跨度的一
系列事件。
➢ EQL 的学习曲线很低
EQL 语法看起来像其他常见查询语言,例如 SQL。 EQL 使你可以直观地编写和读取查
询,从而可以进行快速,迭代的搜索。
➢ EQL 设计用于安全用例
尽管你可以将其用于任何基于事件的数据,但我们创建了 EQL 来进行威胁搜寻。 EQL
不仅支持危害指标(IOC)搜索,而且可以描述超出 IOC 范围的活动。
在这里插入图片描述
4.2.1 基础语法
4.2.1.1 数据准备
要运行 EQL 搜索,搜索到的数据流或索引必须包含时间戳和事件类别字段。 默认情况下,
EQL 使用 Elastic 通用模式(ECS)中的 @timestamp 和 event.category 字段。
@timestamp 表示时间戳,event.category 表示事件分类。
咱们准备一些简单的数据,用于表示电商网站页面跳转

# 创建索引
PUT /gmall
# 批量增加数据
PUT _bulk
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:00:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "","page_id" : 
"login","user_id" : ""}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:01:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "login","page_id" : 
"good_list","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:05:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "good_list","page_id" : 
"good_detail","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:07:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : 
"good_detail","page_id" : "order","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "order","page_id" : 
"payment","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125102","last_page_id" : "","page_id" : 
"login","user_id" : "2"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125102","last_page_id" : "login","page_id" : 
"payment","user_id" : "2"}}

4.2.1.2 数据窗口搜索
在事件响应过程中,有很多时候,了解特定时间发生的所有事件是很有用的。使用一种名为
any 的特殊事件类型,针对所有事件进行匹配,如果想要匹配特定事件,就需要指明事件分
类名称

# 
GET /gmall/_eql/search
{"query" : """any where page.user_id == "1""""
}

4.2.1.3 统计符合条件的事件

# 
GET /gmall/_eql/search
{"query" : """any where true""","filter": {"range": {"@timestamp": {"gte": "1654056000000","lt": "1654056005000"}}}
}

4.2.1.4 事件序列

# 页面先访问 login,后面又访问了 good_detail 的页面
GET /gmall/_eql/search
{"query" : """sequence by page.session_id[page where page.page_id=="login"][page where page.page_id=="good_detail"]"""
}

4.2.2 安全检测
EQL 在 Elastic Securit 中被广泛使用。实际应用时,我们可以使用 EQL 语言来进行检
测安全威胁和其他可疑行为。
4.2.2.1 数据准备
regsvr32.exe 是一个内置的命令行实用程序,用于在 Windows 中注册.dll 库。作为本机
工具,regsvr32.exe 具有受信任的状态,从而使它可以绕过大多数允许列表软件和脚本阻止
程序。 有权访问用户命令行的攻击者可以使用 regsvr32.exe 通过.dll 库运行恶意脚本,即使
在其他情况下也不允许这些脚本运行。
regsvr32 滥用的一种常见变体是 Squfullydoo 攻击。在 Squfullydoo 攻击中,regsvr32.exe
命令使用 scrobj.dll 库注册并运行远程脚本。
测试数据来自 Atomic Red Team 的测试数据集,其中包括模仿 Squibledoo 攻击的事件。
数据已映射到 Elastic 通用架构(ECS)字段:normalized-T1117-AtomicRed-regsvr32.json
将文件内容导入到 ES 软件中:

# 创建索引
PUT my-eql-index
# 导入数据
POST my-eql-index/_bulk?pretty&refresh

在这里插入图片描述
查看数据导入情况

# 导入数据
GET /_cat/indices/my-eql-index?v=true&h=health,status,index,docs.count

在这里插入图片描述
4.2.2 获取 regsvr32 事件的计数
获取与 regsvr32.exe 进程关联的事件数

# 查询数据
# ?filter_path=-hits.events 从响应中排除 hits.events 属性。 此搜索仅用于获取事件计数,
而不是匹配事件的列表
# query : 匹配任何进程名称为 regsvr32.exe 的事件
# size : 最多返回 200 个匹配事件的匹配,实际查询结果为 143GET my-eql-index/_eql/search?filter_path=-hits.events
{"query": """any where process.name == "regsvr32.exe" ""","size": 200 
}

在这里插入图片描述
4.2.3 检查命令行参数
regsvr32.exe 进程与 143 个事件相关联。 但是如何首先调用 regsvr32.exe?谁调用的?
regsvr32.exe 是一个命令行实用程序。将结果缩小到使用命令行的进程

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{"query": """process where process.name == "regsvr32.exe" and 
process.command_line.keyword != null """}

在这里插入图片描述
该查询将一个事件与创建的 event.type 相匹配,指示 regsvr32.exe 进程的开始。根据事件的
process.command_line 值,regsvr32.exe 使用 scrobj.dll 注册了脚本 RegSvr32.sct.这符合
Squibledoo 攻击的行为
4.2.4 检查恶意脚本加载
检查 regsvr32.exe 以后是否加载 scrobj.dll 库

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{"query": """library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll" """ 
}

在这里插入图片描述
4.2.5 检查攻击成功可能性
在许多情况下,攻击者使用恶意脚本连接到远程服务器或下载其他文件。使用 EQL 序
列查询来检查以下一系列事件:
➢ regsvr32.exe 进程
➢ 通过相同的进程加载 scrobj.dll 库
➢ 同一过程中的任何网络事件
根据上一个响应中看到的命令行值,你可以期望找到一个匹配项。但是,此查询并非针
对该特定命令而设计。取而代之的是,它寻找一种可疑行为的模式,这种模式足以检测出相
似的威胁

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{"query": """sequence by process.pid[process where process.name == "regsvr32.exe"][library where dll.name == "scrobj.dll"][network where true] """ 
}

4.3 SQL 操作

一般使用 Elasticsearch 的时候,会使用 Query DSL 来查询数据,从 Elasticsearch6.3 版本
以后,Elasticsearch 已经支持 SQL 查询了。
Elasticsearch SQL 是一个 X-Pack 组件,它允许针对 Elasticsearch 实时执行类似 SQL 的
查询。无论使用 REST 接口,命令行还是 JDBC,任何客户端都可以使用 SQL 对 Elasticsearch
中的数据进行原生搜索和聚合数据。可以将 Elasticsearch SQL 看作是一种翻译器,它可以将
SQL 翻译成 Query DSL。
Elasticsearch SQL 具有如下特性:
➢ 原生支持:Elasticsearch SQL 是专门为 Elasticsearch 打造的。
➢ 没有额外的零件:无需其他硬件,处理器,运行环境或依赖库即可查询 Elasticsearch,
Elasticsearch SQL 直接在 Elasticsearch 内部运行。
➢ 轻巧高效:Elasticsearch SQL 并未抽象化其搜索功能,相反的它拥抱并接受了 SQL 来
实现全文搜索,以简洁的方式实时运行全文搜索。
4.3.1 SQL 和 Elasticsearch 的对应关系
虽然 SQL 和 Elasticsearch 对数据的组织方式(以及不同的语义)有不同的术语,但它们的
目的本质上是相同的

在这里插入图片描述
然概念之间的映射并不完全是一对一的,语义也有所不同,但共同点多于差异。事实上,
SQL 的许多概念可以在 Elasticsearch 中找到对应关系,并且这两者的术语也很类似
4.3.2 数据准备

# 创建索引并增加数据,等同于创建表和数据
PUT my-sql-index/_bulk?refresh
{"index":{"_id": "JAVA"}}
{"name": "JAVA", "author": "zhangsan", "release_date": "2022-05-01", 
"page_count": 561}
{"index":{"_id": "BIGDATA"}}
{"name": "BIGDATA", "author": "lisi", "release_date": "2022-05-02", "page_count": 
482}
{"index":{"_id": "SCALA"}}
{"name": "SCALA", "author": "wangwu", "release_date": "2022-05-03", "page_count": 
604}

在这里插入图片描述

4.3.3 第一个 SQL 查询
现在可以使用 SQL 对数据进行查询了。
# SQL
# 这里的表就是索引
# 可以通过 format 参数控制返回结果的格式,默认为 json 格式
# txt:表示文本格式,看起来更直观点.
# csv:使用逗号隔开的数据
# json:JSON 格式数据
# tsv: 使用 tab 键隔开数据
# yaml:属性配置格式
POST _sql?format=txt
{"query": """SELECT * FROM "my-sql-index""""
}
# 条件查询
POST _sql?format=txt
{"query": """SELECT * FROM "my-sql-index" where page_count > 500"""
}

在这里插入图片描述
在这里插入图片描述
实际上会发现,和 JDBC 操作时的 SQL 语法是基本是一样的。

4.3.3 SQL 转换为 DSL 使用
当我们需要使用 Query DSL 时,也可以先使用 SQL 来查询,然后通过 Translate API 转换即
可,查询的结果为 DSL 方式的结果

# 转换 SQLDSL 进行操作
POST _sql/translate
{"query": """SELECT * FROM "my-sql-index" where page_count > 500"""
}

在这里插入图片描述
4.3.4 SQL 和 DSL 混合使用
我们如果在优化 SQL 语句之后还不满足查询需求,可以拿 SQL 和 DSL 混用,ES 会先根据
SQL 进行查询,然后根据 DSL 语句对 SQL 的执行结果进行二次查询

# SQLDSL 混合使用
# 由于索引中含有横线,所以作为表名时需要采用双引号,且外层需要三个引号包含
POST _sql?format=txt
{"query": """SELECT * FROM "my-sql-index" ""","filter" : {"range": {"page_count": {"gte": 400,"lte": 600}}},"fetch_size": 2
}

在这里插入图片描述

相关文章:

3、Elasticsearch功能使用

第4章 功能使用 4.1 Java API 操作 随着 Elasticsearch 8.x 新版本的到来&#xff0c;Type 的概念被废除&#xff0c;为了适应这种数据结构的改 变&#xff0c;Elasticsearch 官方从 7.15 版本开始建议使用新的 Elasticsearch Java Client。 4.1.1 增加依赖关系 <propertie…...

数据链路层协议

文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…...

java版网页代码生成器系统myeclipse定制开发mysql数据库网页模式java编程jdbc生成无框架java web网页

一、源码特点 java版网页代码生成器系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&#xff0c;使…...

ElementUI实现登录注册啊,axios全局配置,CORS跨域

一&#xff0c;项目搭建 认识ElementUI ElementUI是一个基于Vue.js 2.0的桌面端组件库&#xff0c;它提供了一套丰富的UI组件&#xff0c;包括表格、表单、弹框、按钮、菜单等常用组件&#xff0c;具备易用、美观、高效、灵活等优势&#xff0c;能够极大的提高Web应用的开发效…...

面经分享 | 某康安全开发工程师

本文由掌控安全学院 - sbhglqy 投稿 一、反射型XSS跟DOM型XSS的最大区别 DOM型xss和别的xss最大的区别就是它不经过服务器&#xff0c;仅仅是通过网页本身的JavaScript进行渲染触发的。 二、Oracle数据库了解多吗 平常用的多的是MySQL数据库&#xff0c;像Oracle数据库也有…...

leetcode - 389. Find the Difference

Description You are given two strings s and t. String t is generated by random shuffling string s and then add one more letter at a random position. Return the letter that was added to t. Example 1: Input: s “abcd”, t “abcde” Output: “e” Expla…...

asp.net企业生产管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 企业生产管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 二、功能介绍 (1)用户管理&…...

vue中或者react中的excel导入和导出

excel导入和导出是后台管理系统常见的功能。 当我们把信息化系统给用户使用时&#xff0c;用户经常需要把以前在excel里录入的数据导入的信息化系统里&#xff0c;这样为用户提供了很大的方便。 在用户使用信息化系统时&#xff0c;也需要把网页表格里的数据导出到excel里&…...

如何在Ubuntu的根目录下创建删除目录

首先进入根目录 cd /创建目录 sudo mkdir xxx然后可以用ls命令查看是否创建成功 我们创建了一个666的目录&#xff0c;接下来我们应该怎么删除呢&#xff1f; 删除 如果我们用普通删除的话&#xff0c;例如 rm 666 你会发现根本删除不掉&#xff1b;这时我们还是得用超级权…...

lv5 嵌入式开发-6 线程的取消和互斥

目录 1 线程通信 – 互斥 2 互斥锁初始化 – pthread_mutex_init 3 互斥锁销毁 pthread_mutex_destroy 4 申请锁 – pthread_mutex_lock 5 释放锁 – pthread_mutex_unlock 6 读写锁 7 死锁的避免 8 条件变量&#xff08;信号量&#xff09; 9 线程池概念和实现 9.1 …...

el-table实现穿梭功能

第一种 <template><el-row :gutter"20"><el-col :span"10"><!-- 搜索 --><div class"search-bg"><YcSearchInput title"手机号" v-model"search.phone" /><div class"search-s…...

Cron表达式_用于定时调度任务

一、Cron表达式简介 Cron表达式是一个用于设置计划任务的字符串&#xff0c;该字符串以5或6个空格分隔&#xff0c;分为6或7个域&#xff0c;每一个域代表任务在相应时间、日期或时间间隔执行的规则【Cron表达式最初是在类Unix操作中系统中使用的&#xff0c;但现在已经广泛应用…...

CeresPCL ICP精配准(点到面)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,当然这需要视评判的准则而…...

CentOS安装kafka单机部署

一&#xff1a;保证机器上已经运行的有Java环境 服务器&#xff1a;centos7 kafka版本&#xff1a;3.5.1 二&#xff1a;下载kafka压缩包 下载地址 1.解压kafka压缩包 tar -zxvf kafka_2.13-3.5.1.tgz 2.我得是上传到了 /home目录下&#xff0c;配置文件server.propertie…...

蓝牙核心规范(V5.4)11.2-LE Audio 笔记之LE Auido架构

专栏汇总网址&#xff1a;蓝牙篇之蓝牙核心规范学习笔记&#xff08;V5.4&#xff09;汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德&#xff0c;任何非CSDN看到的这篇文章都是盗版网站&#xff0c;你也看不全。认准原始网址。&#xff01;&#xff01;&#x…...

福建江夏学院蔡慧梅主任一行莅临拓世科技集团,共探AI+时代教育新未来

在科技的海洋中&#xff0c;产业是那航行的巨轮&#xff0c;而教育则是指引方向的灯塔。当巨轮与灯塔相互辉映&#xff0c;产教融合与校企合作便成为了推动国家科技创新和人才培养的金钥匙&#xff0c;为未来开启一扇扇充满希望的大门。 2023年9月24日&#xff0c;福建江夏学院…...

使用Visual Leak Detector排查内存泄漏问题

目录 1、VLD工具概述 2、下载、安装VLD 2.1、下载VLD 2.2、安装VLD 3、VLD安装目录及文件说明 3.1、安装目录及文件说明 3.2、关于32位和64位版本的详细说明 4、在工程中引入VLD 5、内存泄漏检测实例讲解 5.1、程序启动报错 5.2、启动调试&#xff0c;查看内存泄漏报…...

如何设计一个 JVM 语言下的 LLM 应用开发框架?以 Chocolate Factory 为例

本文将介绍 Chocolate Factory 框架背后的一系列想法和思路。在我们探索和设计框架的过程中&#xff0c;受到了&#xff1a;LangChain4j、LangChain、LlamaIndex、Spring AI、Semantic Kernel、PromptFlow 的大量启发。 欢迎一起来探索&#xff1a;https://github.com/unit-mes…...

基础排序算法

插入排序&#xff08;insertion sort&#xff09; 插入排序每次循环将一个元素放置在适当的位置。像抓牌一样。手里的排是有序的&#xff0c;新拿一张牌&#xff0c;与手里的牌进行比较将其放在合适的位置。 插入排序要将待排序的数据分成两部分&#xff0c;一部分有序&#…...

Nginx的反向代理、动静分离、负载均衡

反向代理 反向代理是一种常见的网络技术&#xff0c;它可以将客户端的请求转发到服务器群集中的一个或多个后端服务器上进行处理&#xff0c;并将响应结果返回给客户端。反向代理技术通常用于提高网站的可伸缩性和可用性&#xff0c;并且可以隐藏真实的后端服务器地址。 #user…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...