ElasticSearch学习笔记二:使用Java客户端

一、前言

在上一篇文章中,我们对ES有了最基本的认识,本着实用为主的原则,我们先不学很深的东西,今天打算先学习一下ES的Java客户端如何使用。

二、创建项目

1、普通Maven项目

1、创建一个Maven项目

2、Pom文件

<dependencies><!--ES客户端--><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.25</version></dependency><!--JSON序列化--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version></dependency><!--lombok:用于生成GET/SET 简化开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency></dependencies>

3、Coding

(1)创建ES客户端

 /*** 获取ES客户端* @return es Java客户端*/private static ElasticsearchClient getEsClient() {//Rest客户端,可以理解为是一个Http客户端,用于发送http请求RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();//ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}

(2)判断索引Product是否存在,如果不存在则创建索引。(当然通常情况下创建索引的操作是手动操作的,就类似创建数据表)

 /*** 校验并创建索引,如果存在直接返回true* 如果不存在则创建索引,同时返回是否创建成功的结果*/private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {//构建索引是否存在的请求参数ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();final BooleanResponse exists = indices.exists(existsRequest);if (exists.value()) {System.out.println("索引已经存在,不用再创建了");return true;}//Java17的新特性(这样写字符串真的很方便)Reader createIndexJson = new StringReader("""{"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text","analyzer":"ik_max_word"},"price":{"type": "double"}}}}""");//创建索引CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名.includeTypeName(false) //是否包含包名.settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build()).withJson(createIndexJson).build();final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());return createIndexResponse.acknowledged();}

(3)批量写入数据

    /*** 批量写入数据*/private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {final List<Product> products = generalProduct(100);//批量写入BulkRequest.Builder br = new BulkRequest.Builder();for (Product product : products) {br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));}BulkResponse bulkResponse = esClient.bulk(br.build());System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());return !bulkResponse.errors();}//product的代码@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {private Long id;private String name;private Double price;
}

(4)查询数据

//根据ID查询
GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);
if (response.found()) {System.out.println("根据ID查询到对应的数据 " + response.source());
} else {System.out.println("根据ID查询未对应的数据");
}//根据条件查询:例如搜索名称为商品20的数据
SearchResponse<Product> queryResponse = esClient.search(s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);
TotalHits total = queryResponse.hits().total();
assert total != null;
boolean isExactResult = total.relation() == TotalHitsRelation.Eq;if (isExactResult) {System.out.println("命中的文档数量为:" + total.value());
} else {System.out.println("没有命中任务数据");
}List<Hit<Product>> hits = queryResponse.hits().hits();
for (Hit<Product> hit : hits) {Product product = hit.source();System.out.println("命中的数据:" + product);
}

(5)完整代码

package com.cmxy.esdemo;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.elasticsearch.core.BulkResponse;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient;
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.elasticsearch.indices.IndexSettings;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.cmxy.entity.Product;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;public class ESTest {public static void main(String[] args) throws IOException, InterruptedException {try (ElasticsearchClient esClient = getEsClient()) {//获取es客户端//判断索引是否存在final ElasticsearchIndicesClient indices = esClient.indices();//判断索引是否存在,如果不存在则创建boolean createIndexSuccess = checkAndCreateIndex(indices);//往索引里写入数据boolean writeSuccess = false;if (createIndexSuccess) {writeSuccess = bulkWriteDoc(esClient);}//写入成功后,查询if (writeSuccess) {queryData(esClient);}}}private static void queryData(final ElasticsearchClient esClient) throws InterruptedException, IOException {//阻塞一下,否则刚写入直接查询会查不到数据Thread.sleep(2000L);//根据ID查询GetResponse<Product> response = esClient.get(g -> g.index("product").id("1"), Product.class);if (response.found()) {System.out.println("根据ID查询到对应的数据 " + response.source());} else {System.out.println("根据ID查询未对应的数据");}//根据条件查询:例如搜索名称为商品20的数据SearchResponse<Product> queryResponse = esClient.search(s -> s.index("product").query(q -> q.match(t -> t.field("name").query("商品20"))), Product.class);TotalHits total = queryResponse.hits().total();assert total != null;boolean isExactResult = total.relation() == TotalHitsRelation.Eq;if (isExactResult) {System.out.println("命中的文档数量为:" + total.value());} else {System.out.println("没有命中任务数据");}List<Hit<Product>> hits = queryResponse.hits().hits();for (Hit<Product> hit : hits) {Product product = hit.source();System.out.println("命中的数据:" + product);}}/*** 批量写入数据*/private static boolean bulkWriteDoc(final ElasticsearchClient esClient) throws IOException {final List<Product> products = generalProduct(100);//批量写入BulkRequest.Builder br = new BulkRequest.Builder();for (Product product : products) {br.operations(op -> op.index(idx -> idx.index("product").id(product.getId().toString()).document(product)));}BulkResponse bulkResponse = esClient.bulk(br.build());System.out.println("批量写入结果是否成功:" + !bulkResponse.errors());return !bulkResponse.errors();}/*** 校验并创建索引,如果存在直接返回true* 如果不存在则创建索引,同时返回是否创建成功的结果*/private static boolean checkAndCreateIndex(final ElasticsearchIndicesClient indices) throws IOException {//构建索引是否存在的请求参数ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();final BooleanResponse exists = indices.exists(existsRequest);if (exists.value()) {System.out.println("索引已经存在,不用再创建了");return true;}//Java17的新特性(这样写字符串真的很方便)Reader createIndexJson = new StringReader("""{"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text","analyzer":"ik_max_word"},"price":{"type": "double"}}}}""");//创建索引CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product") //索引名.includeTypeName(false) //是否包含包名.settings(new IndexSettings.Builder().numberOfShards("1").numberOfReplicas("1").build()).withJson(createIndexJson).build();final CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);System.out.println("创建索引是否成功:" + createIndexResponse.acknowledged());return createIndexResponse.acknowledged();}private static List<Product> generalProduct(int count) {List<Product> products = new ArrayList<>();for (int i = 1; i <= count; i++) {products.add(new Product((long) i, "商品" + i,BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));}return products;}/*** 获取ES客户端** @return es Java客户端*/private static ElasticsearchClient getEsClient() {//Rest客户端,可以理解为是一个Http客户端,用于发送http请求RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();//ElasticsearchTransport用于和ES集群通信,封装了各种方法,第二个参数则是设置序列化方式ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}
}

(6)运行结果

这里可能有的朋友会有点疑惑包括笔者一开始也是,为什么我搜索的是“商品20”,能命中的文档数居然是100,按理说不应该只有一条吗?还有为什么命中了100条只返回了10条呢?

其实是这样的,因为我们当前的product索引,他的name是一个text类型,是会被分词的,我们可以看下他分词后是涨什么样子的

在kibana中执行如下命令POST /product/_analyze
{"field": "name","text": "商品20"
}结果:
{"tokens" : [{"token" : "商品","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "20","start_offset" : 2,"end_offset" : 4,"type" : "ARABIC","position" : 1}]
}

我们可以看到对于name的分词,分为“商品”和“20”两个词,且match时默认是用or,换成我们熟悉的Mysql,那就是类似于 select * from product where namelike ‘%商品%’ or name like ‘%20%’,所以所有的的数据就查到了。

例如我插入了一个产品,名称为测试20,我再执行查询语句:

GET /product/_search
{"size": 200, "sort": [{"id": {"order": "desc"}}], "query": {"match": {"name": {"query": "商品20","analyzer": "ik_max_word"}}}
}

结果如下图

2、Springboot整合ESClient
2.1、使用ES原生客户端

(1)Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cmxy</groupId><artifactId>springboot-es</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-es</name><description>springboot-es</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jakarta.json>2.0.1</jakarta.json></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.25</version></dependency><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.25</version></dependency><!-- 覆盖springboot维护的版本 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.17.25</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><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

(2)将EsClient注入Spring容器

@Component
public class EsConfig {@Beanpublic ElasticsearchClient esClient() {// Create the low-level clientRestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();// Create the transport with a Jackson mapperElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());// And create the API clientreturn new ElasticsearchClient(transport);}
}

(3)在要用的地方引入

@RestController
@RequestMapping("/es")
public class EsController {@Resourceprivate ElasticsearchClient elasticsearchClient;@GetMapping("/testEs")public boolean testEs() throws IOException {ExistsRequest request = new ExistsRequest.Builder().index("product").build();BooleanResponse exists = elasticsearchClient.indices().exists(request);return exists.value();}
2.2、使用springData

(1)添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.cmxy</groupId><artifactId>springboot-es</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-es</name><description>springboot-es</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jakarta.json>2.0.1</jakarta.json></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
<dependencyManagement>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency>
</dependencies>
</dependencyManagement><build>
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.cmxy.springbootes.SpringbootEsApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin>
</plugins>
</build></project>

(2)添加配置文件

spring:elasticsearch:uris: localhost:9200

(3)编写Repository

package com.cmxy.springbootes.demos.repository;import com.cmxy.springbootes.demos.entity.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductEsRepository extends ElasticsearchRepository<Product,Long> {
}

(4)Controller

package com.cmxy.springbootes.demos.service;import com.cmxy.springbootes.demos.entity.Product;
import com.cmxy.springbootes.demos.repository.ProductEsRepository;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.SearchOperations;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;@RestController
@RequestMapping("/es")
public class EsController {@Resourceprivate ElasticsearchOperations elasticsearchOperations;@Resourceprivate SearchOperations searchOperations;@Resourceprivate ProductEsRepository productEsRepository;/*** 校验索引是否存在** @return*/@GetMapping("/checkIndex")public boolean checkIndexExists() {return elasticsearchOperations.indexOps(Product.class).exists();}/*** 创建索引*/@PostMapping("/createIndex")public boolean createIndex() {return elasticsearchOperations.indexOps(Product.class).create();}/*** 批量写入文档*/@PostMapping("/batchCreateDocument")public boolean batchCreateDocument() {List<Product> products = new ArrayList<>();for (int i = 1; i <= 100; i++) {products.add(new Product((long) i, "商品" + i, BigDecimal.valueOf(Math.random() * 1000).setScale(2, RoundingMode.HALF_UP).doubleValue()));}productEsRepository.saveAll(products);return true;}/*** 根据ID查询** @param id* @return*/@GetMapping("/getById")public Product getById(Long id) {//当然也可以这几使用searchOperations操作,类似 repository和mapper的关系Product product = productEsRepository.findById(id).orElse(null);System.out.println(product);return product;}@GetMapping("/query")public List<Product> query() {Criteria criteria = new Criteria("name").is("商品20");Query query = new CriteriaQuery(criteria);SearchHits<Product> searchHits = searchOperations.search(query, Product.class);if (searchHits.hasSearchHits()) {List<SearchHit<Product>> hits = searchHits.getSearchHits();return hits.stream().map(SearchHit::getContent).collect(Collectors.toList());}return null;}}

三、结束语

至此我们已经使用原生ES客户端、整合Springboot、使用SpringData操作了ES,当然目前只是简单的操作,更多的API我们还是要参考官方文档。后面计划学习ES的数据类型,希望对你有所帮助。

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

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

相关文章

MySQL8 安装教程

一、从官网下载mysql-8.0.18-winx64.zip安装文件&#xff08; 从 https://dev.mysql.com/downloads/file/?id484900 下载zip版本安装包 mysql-8.0.18-winx64.zip 解压到本地磁盘中&#xff0c;例如解压到&#xff1a;D盘根目录&#xff0c;并改名为MySQL mysql-8.0.34-winx6…

如何将LiDAR坐标系下的3D点投影到相机2D图像上

将激光雷达点云投影到相机图像上做数据层的前融合&#xff0c;或者把激光雷达坐标系下标注的物体点云的3d bbox投影到相机图像上画出来&#xff0c;都需要做点云3D点坐标到图像像素坐标的转换计算&#xff0c;也就是LiDAR 3D坐标转像素坐标。 看了网上一些文章都存在有错误或者…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

(一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号&#xff1a; Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小&#xff1a; 7.5Gi 356Mi 4.6Gi 1.0Mi 2.6Gi 6.8Gi Swap: 4.0Gi 0B 4.0Gi 显卡型号&#xff1a;NVIDIA P104-100 注意&#xff1a…

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程&#xff1a;高性能Web框架的全面解析 引言 在现代Web开发中&#xff0c;选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用&#xff0c;比如聊天应用、实时数据处理和WebSocket服务…

ubuntu20.04安装anaconda

在anaconda的官网&#xff08;Anaconda | The Operating System for AI&#xff09;或者清华镜像源网站&#xff08;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;中下载对应的anaconda版本 可以在网页直接下载或者通过命…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…

【设计模式】行为型模式(四):备忘录模式、中介者模式

行为型模式&#xff08;四&#xff09;&#xff1a;备忘录模式、中介者模式 7.备忘录模式&#xff08;Memento&#xff09;7.1 通俗易懂的解释7.2 具体步骤7.3 代码示例7.3.1 定义发起人7.3.2 定义备忘录7.3.3 定义管理者7.3.4 客户端7.3.5 输出 7.4 总结 8.中介者模式&#xf…

Thinkpad E15 在linux下升级 bios

安装xubuntu 24.04后&#xff0c;发现键盘的Fn按键全都无法使用&#xff0c;在Windows环境下是正常的&#xff0c;按说是驱动的问题&#xff0c;网上也有说可以通过升级BIOS解决&#xff0c;所以打算升级看看&#xff0c;升级有风险。 参考&#xff1a; https://blog.stigok.c…

Java学习Day61:薄纱王灵官!(Nginx review)

1.Nginx是什么 Nginx是一款轻量级、高性能&#xff0c;并发性好的HTTP和反向代理服务器 2.功能 2.1反向代理 正向代理是指客户端向代理服务器发送请求&#xff0c;代理服务器代表客户端去访问目标服务器。简单来说&#xff0c;正向代理是客户端的代理&#xff0c;客户端通过…

MATLAB用到的矩阵基础知识(矩阵的乘和矩阵的逆)

1. 矩阵乘法 方法: 设第一个矩阵为 A A A,第二个矩阵为 B B B,则 A A A的第一行乘 B B B的第一列,先想乘再相加,作为目标矩阵的一个元素。 前提条件: 所以我们可以看到矩阵相乘的前提条件:第一个矩阵的列数等于第二个矩阵的行数。否则,我们就无法进行行和列的相乘。 最…

Oracle OCP认证考试考点详解082系列22

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 105. 第105题&#xff1a; 题目 解析及答案&#xff1a; 题目翻译&#xff1a; 关于Oracle数据库中的事务请选择两个正确的陈述&#xf…

【ict基础软件赛道】真题-50%openGauss

题目取自赛前测试链接 OpenGauss安装前使用哪个工具检查环境是否符合安装哪个功能不是gs_guc工具提供的opengauss数据库逻辑复制的特点描述正确的是opengauss的全密态数据库等值查询能力描述正确的是哪个不属于ssh客户端工具opengauss三权分立说法正确的是opengauss wdr snapsh…

MDK5(Keil5)工具设置及技巧

设置&#xff1a; 1点击扳手&#xff08;设置&#xff09; 2文字设置为GB2312简体 3勾选显示空格 4按一下TAB键移动4个空格 修改keil中数字大小及颜色&#xff08;增加对比&#xff09; 勾选全部 1提示结构体 2提示函数参数 3打上几个英文符号后开始提示 4TAB作为填充字符 5打开…

4G模组Air780E对json数据处理的基本方法~

4G模组Air780E在数据传输和处理中扮演着越来越重要的角色。在实际应用中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络数据传输和存储。本文将详细介绍4G模组Air780E对JSON数据处理的基本方法&#xff0c;以帮助开发者更好地利用这一模组进行数据…

学习使用LVGL,依赖官方网址

LVGL Basics — LVGL documentation LVGL基础知识 LVGL是一个开源的图形库&#xff0c;提供创建嵌入式GUI的一切 LVGL数据流 您为每个物理显示面板 创建一个显示器 (lv_display) &#xff0c;在其上创建屏幕小部件&#xff0c;将小部件添加到这些屏幕上。要处理触摸、鼠标、…

【数据库】组合索引生效规则及索引失效

文章目录 索引演示示例组合索引索引失效 索引演示示例 # 创建表结构 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,FirstName VARCHAR(50),LastName VARCHAR(50),DepartmentID INT,Salary DECIMAL(10, 2),HireDate DATE );# 插入示例数据 INSERT INTO Employees (Empl…

力扣 LeetCode 145. 二叉树的后序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;左右中&#xff09; class Solution {List<Integer> res new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode ro…