3、Elasticsearch功能使用

news2024/11/19 5:47:43

第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() {
 @Override
 public 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
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作【当van-tab不满足固定在顶部】

背景 需要H5实现一下滑动列表&#xff0c;顶部tab栏可以切换&#xff0c;当向下滑动列表的时候tab栏固定到顶部。果断的看了一下官方文档&#xff1a; 就是这个&#xff0c;我一看还有扩展属性&#xff0c;非常友好。向下滑动查看文档 使用sticky实现的。众所周知&#xff0…

Python 计算三角形面积

"""计算三角形面积介绍&#xff1a;已知三角形边长分别为x、y、z&#xff0c;可以计算三角形半周长q&#xff0c;然后根据海伦公式计算三角形面积S三角形半周长&#xff1a;q (x y z) / 2三角形面积&#xff1a;S (q * (q-x) * (q-y) * (q-z)) ** 0.5知识点…

独辟蹊径”之动态切换进程代理IP

前言 项目中遇到这样一个需求&#xff0c;需要动态切换指定进程Sockets5代理IP&#xff0c;目前了解到可通过编写驱动拦截或者劫持LSP实现&#xff0c;LSP劫持不太稳定&#xff0c;驱动无疑是相对较好的解决方案&#xff0c;奈何水平不足便有了这"蹊径"。 初步尝试…

Mybatis SQL构建器

上一篇我们介绍了在Mybatis映射器中使用SelectProvider、InsertProvider、UpdateProvider、DeleteProvider进行对数据的增删改查操作&#xff1b;本篇我们介绍如何使用SQL构建器在Provider中优雅的构建SQL语句。 如果您对在Mybatis映射器中使用SelectProvider、InsertProvider…

反编译之崩溃定位

反编译之崩溃定位 1.背景问题定位1.首先我们需要找崩溃所在的类和方法2.寻找崩溃的代码行数2.1借用反编译工具jadx查看反编译后的内容 1.背景 线上出了个崩溃(量挺大&#x1f62d;)&#xff0c;但是apk是被混淆过的&#xff0c;一时摸不着头脑。崩溃信息如下&#xff1a; 主要…

yum 快速安装zookeeper、Kafka集群部署 es安装 logstash安装 kibina 分词器 redis

Zookeeper安装 Kafka是基于Zookeeper来实现分布式协调的&#xff0c;所以在搭建Kafka节点之前需要先搭建好Zookeeper节点。而Zookeeper和Kafka都依赖于JDK&#xff0c;我这里先安装好了JDK&#xff1a; 安装jdk yum install java-1.8.0-openjdk* -y 1 [root192.168.99.4 ~]#…

OpenCascade模型解析-详细分解模型结构

OpenCascade提供了gp_trsf、BRepBuilderAPI_Transform&#xff0c;可以用来实现拓扑&#xff08;TopoDS_Shape&#xff09;的变换&#xff1a;平移&#xff0c;&#xff08;点&#xff0c;轴&#xff0c;面&#xff09;镜像&#xff0c;旋转&#xff0c;缩放&#xff0c;移位。…

21 mysql ref 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

爬虫 — Scrapy 框架(一)

目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…

微信小程序开发:新手必备套餐(一)项目环境的搭建

第一步&#xff1a;注册小程序账号 这个专栏的使用的app是微信&#xff0c;微信小程序则是当今社会web小程序开发中最为主流的app 1&#xff1a;进入网页完成账户的注册微信公众平台 点击立即注册 继续完成之后直接登录即可 登录成功之后 第二步&#xff1a;下载小程序开…

【机器学习】回归问题实例(李宏毅老师作业1)

文章目录 任务介绍完成和调参 任务介绍 问题描述 给出美国某一州过去3天的调查结果&#xff0c;然后预测第3天新检测阳性病例的百分比。 数据相关特征feature States&#xff08;34&#xff0c; encode to one-hot vectors&#xff09; 34个州COVID-like illness&#xff0…

使用patch-package保存node_modules包修改

遇到情况&#xff0c;第三方包存在bug或者缺少文件时候&#xff0c;我们手动修改了某个包时候&#xff0c;下次npm安装时候会导致原来的修改呗覆盖 安装 这时候可以用到npm工具包patch-package&#xff0c;项目更目录命令行安装 npm i -D patch-package修改文件 修改好nod…

3D虚拟情景实训系统在英语课堂教学中的应用

3D虚拟情景实训系统在英语课堂教学中的应用&#xff0c;为学生们提供了一个真实且生动的学习环境。 在课堂教学中&#xff0c;系统会模拟各种情景&#xff0c;如商务会议、旅行、饭店订房等&#xff0c;学生可以亲身参与体验学习&#xff0c;从而提高他们的英语口语和听力能力。…

【C++】vector中的常见函数和使用

前言 感觉vector在目前阶段很常用&#xff0c;就总结记录一些vector的用法 方便自己忘记的时候查找 因为是自用&#xff0c;所以我直接放代码了&#xff0c;只说明如何使用&#xff0c;以及一些小的注意点&#xff0c;对于函数具体实现过程&#xff0c;在这篇文章中&#xff…

Spring Boot自动装配原理超详细解析

目录 前言一、什么是SPI&#xff1f;1. JDK中的SPI2. Spring中的SPI2.1 加载配置2.2 实例化 二、Import注解和ImportSelector是什么&#xff1f;1. 代码示例2. 过程解析3. 源码分析 三、Spring Boot的自动装配1.源码分析2.代码示例3.Spring Boot自带的自动装配 四、总结 前言 …

LabVIEW报表生成工具包时出现错误-41106

LabVIEW报表生成工具包时出现错误-41106 使用LabVIEW报表生成工具包创建Excel报告或Word文档时&#xff0c;收到以下错误&#xff1a;Error -41106 occurred at NI_Excel.lvclass:new report subVI.vi ->NI_report.lvclass:New Report.vi -> Export Report With JKI.vi …

【Vue】模块基本语法「上篇」

【Vue】模块基本语法「上篇」 一、插值1.1 文本1.2 v-html1.3数据双向绑定(v-model) 二、指令2.1 v-if|v-else|v-else-if2.2 v-show2.3 v-for2.4 动态参数 三、过滤器3.1 局部过滤器3.2 全局过滤器 四、计算属性&监听属性4.1 计算属性4.2 监听属性 五、案例实操5.1 购物车案…

怒刷LeetCode的第6天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;哈希表 方法二&#xff1a;逐个判断字符 方法三&#xff1a;模拟减法 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;水平扫描法 方法二&#xff1a;垂直扫描法 方法三&#xff1a;分治法 方…

2023-09-22 LeetCode每日一题(将钱分给最多的儿童)

2023-09-22每日一题 一、题目编号 2591. 将钱分给最多的儿童二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你…

华为OD机试 - 事件推送(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…