Elasticsearch基础篇(八):常用查询以及使用Java Api Client进行检索

ES常用查询以及使用Java Api Client进行检索

1. 检索需求

参照豆瓣阅读的列表页面

需求:

  • 检索词需要在数据库中的题名、作者和摘要字段进行检索并进行高亮标红
  • 返回的检索结果需要根据综合、热度最高、最近更新、销量最高、好评最多进行排序
  • 分页数量为10,并且返回检索到的总数量

image-20231220150501858

2. 建立测试环境

2.1 根据需求建立es字段

mapping.json

 {"mappings": {"properties": {"title": {"analyzer": "standard","type": "text"},"author": {"analyzer": "standard","type": "text","fields": {"keyword": {"type": "keyword"}}},"contentDesc": {"analyzer": "standard","type": "text"},"wordCount": {"type": "double"},"price": {"type": "double"},"cover": {"type": "keyword"},"heatCount": {"type": "integer"},"updateTime": {"type": "date"}}}
}

映射字段说明:

  1. id(长整型): 表示唯一标识的字段,类型为long
  2. title(文本类型): 用于存储文档标题的字段,类型为text。指定默认的标准分析器(analyzer)为standard
  3. author(文本类型): 存储文档作者的字段,同样是text类型。除了使用标准分析器外,还定义额外的关键字(keyword)字段,该关键字字段通常用于==精确匹配和聚合==操作。
  4. contentDesc(文本类型): 存储文档内容描述的字段,同样是text类型,使用标准分析器。
  5. wordCount(双精度浮点型): 存储文档字数的字段,类型为double。通常用于存储浮点数值。
  6. price(双精度浮点型): 存储文档价格的字段,同样是double类型。用于存储浮点数值,例如书籍的价格。
  7. cover(关键字类型): 存储文档封面的字段,类型为keyword。关键字字段通常用于精确匹配。
  8. heatCount(整型): 存储热度计数的字段,类型为integer。通常用于热度排序
  9. updateTime(日期类型): 存储文档更新时间的字段,类型为date。用于最近更新排序

2.2 创建索引和映射

image-20231220154508492

2.3 增加测试数据

 POST /douban/_doc/1001{"title":"诗云","author":"刘慈欣","contentDesc":"伊依一行三人乘坐一艘游艇在南太平洋上做吟诗航行,平时难得一见的美洲大陆清晰地显示在天空中,在东半球构成的覆盖世界的巨大穹顶上,大陆好像是墙皮脱落的区域…","wordCount":18707,"price":6.99,"cover":"https://pic.arkread.com/cover/ebook/f/19534800.1653698501.jpg!cover_default.jpg","heatCount":201,"updateTime":"2023-12-20"}POST /douban/_doc/1002{"title":"三体2·黑暗森林","author":"刘慈欣","contentDesc":"征服世界的中国科幻神作!包揽九项世界顶级科幻大奖!《三体》获得第73届“雨果奖”最佳长篇奖!","wordCount":318901,"price":32.00,"cover":"https://pic.arkread.com/cover/ebook/f/110344476.1653700299.jpg!cover_default.jpg","heatCount":545,"updateTime":"2023-12-25"}POST /douban/_doc/1003{"title":"三体前传:球状闪电","author":"刘慈欣","contentDesc":"征服世界的中国科幻神作!包揽九项世界顶级科幻大奖!《三体》获得第73届“雨果奖”最佳长篇奖!","wordCount":181119,"price":35.00,"cover":"https://pic.arkread.com/cover/ebook/f/116984494.1653699856.jpg!cover_default.jpg","heatCount":765,"updateTime":"2022-11-12"}POST /douban/_doc/1004{"title":"全频带阻塞干扰","author":"刘慈欣","contentDesc":"这是一个场面浩大而惨烈的故事。21世纪的某年,以美国为首的北约发起了对俄罗斯的全面攻击。在残酷的保卫战中,俄国的电子战设备无力抵挡美国的进攻","wordCount":28382,"price":6.99,"cover":"https://pic.arkread.com/cover/ebook/f/19532617.1653698557.jpg!cover_default.jpg","heatCount":153,"updateTime":"2021-03-23"}

3. 执行查询

3.1 主键查询

# 此种方式已过时,不推荐
GET /douban/_doc/1001# 推荐此种方式
POST /douban/_search
{"query": {"match": {"_id": 1001}}
}

3.2 全量查询

POST /douban/_search
{"query": {"match_all": { }}
}

3.3 分页查询

POST /douban/_search
{"query": {"match_all": { }},"from":1,"size":2
}

3.4 排序查询

POST /douban/_search
{"query": {"match_all": {}},"sort": [{"price": { "order": "desc" }}]
}

3.5 全文检索

POST /douban/_search
{"query": {"match": {"title":"三体球闪"}}
}

检索结果:

image-20231220170628892

3.6 高亮检索

POST /douban/_search
{"query": {"match": {"title": "三体球闪"}},"highlight": {"fields": {"title": {"pre_tags": ["<font style='red'>"],"post_tags": ["</font>"]}}}
}

image-20231220172424036

3.7 bool查询

题名进行全文检索包含‘三体球闪’,并且价格为‘35’的数据

POST /douban/_search
{"query": {"bool": {"must": [{"match": {"title": "三体球闪"}},{"term": {"price": 35}}]}}
}

3.7 多字段全文检索

对题名、作者、摘要进行全文匹配,同时根据三个字段进行高亮标红

POST /douban/_search
{"query": {"multi_match": {"query": "三体球闪","fields": ["title","author","contentDesc"]}},"highlight": {"fields": {"title": {},"author": {},"contentDesc": {}}}
}

image-20231220173414933

3.8 综合检索

对题名、作者、摘要进行全文匹配,同时根据三个字段进行高亮标红

增加分页条件查询、增加更新日期降序排序、同时返回需要的必备字段

POST /douban/_search
{"query": {"multi_match": {"query": "三体球闪","fields": ["title","author","contentDesc"]}},"from": 0,"size": 2,"_source": ["title","author","price","wordCount"],"sort": [{"updateTime": {"order": "desc"}}],"highlight": {"fields": {"title": {},"author": {},"contentDesc": {}}}
}

image-20231221092538555

4. Spring项目集成elasticsearch

参考文档:[Installation | Elasticsearch Java API Client 7.17] | Elastic

4.1 创建Spring项目并引入es依赖

image-20231222145917463 image-20231222150055190

如果希望使用java8,就打开pom.xml修改parent版本和java.version的值,然后点击刷新maven

image-20231222152132304

在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的Java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。

Api名称介绍
TransportClient-废弃,8.x删除基于TCP方式访问,只支持JAVA,7.x开始弃用,8.x删除.
Rest Lower Level Rest Client低等级RestApi,最小依赖。
Rest High Level Rest Client废弃,未说明删除时间高等级的RestApi,基于低等级Api,7.15开始弃用,但没有说明会删除。用低等级Api替换。
RestClient基于Http的Api形式,跨语言,推荐使用,底层基于低等级Api,7.15才开始提供
<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.11</version>
</dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency><!-- 此依赖的作用是解决:lassNotFoundException: jakarta.json.spi.JsonProvider参考:https://github.com/elastic/elasticsearch-java/issues/311 -->
<dependency><groupId>jakarta.json</groupId><artifactId>jakarta.json-api</artifactId><version>2.0.1</version>
</dependency>

完整依赖如下:注意 properties中一定要加 <elasticsearch.version>7.17.11</elasticsearch.version>,否则会导致无法覆盖父引用中依赖

<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.15</version><relativePath/></parent><groupId>com.zhouquan</groupId><artifactId>client</artifactId><version>0.0.1-SNAPSHOT</version><name>client</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version><lombok.version>1.18.22</lombok.version><elasticsearch.version>7.17.11</elasticsearch.version><jakarta.version>2.0.1</jakarta.version></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>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.11</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency><!-- 此依赖的作用是解决:lassNotFoundException: jakarta.json.spi.JsonProvider参考:https://github.com/elastic/elasticsearch-java/issues/311 --><dependency><groupId>org.glassfish</groupId><artifactId>jakarta.json</artifactId><version>${jakarta.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- Apache Commons IO --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

4.2 增加es客户端配置类

交给spring进行管理,使用时通过@Resource private ElasticsearchClient client; 注入即可使用

@Configuration
@Slf4j
public class EsClient {@Resourceprivate EsConfig esConfig;/*** Bean 定义,用于创建 ElasticsearchClient 实例。** @return 配置有 RestClient 和传输设置的 ElasticsearchClient 实例。*/@Beanpublic ElasticsearchClient elasticsearchClient() {// 使用 Elasticsearch 集群的主机和端口配置 RestClientList<String> clusterNodes = esConfig.getClusterNodes();HttpHost[] httpHosts = clusterNodes.stream().map(HttpHost::create).toArray(HttpHost[]::new);// Create the low-level clientRestClient restClient = RestClient.builder(httpHosts).build();// JSON 序列化ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 打印连接信息log.info("Elasticsearch Client 连接节点信息:{}", Arrays.toString(httpHosts));return client;}}

4.3 使用 Java API Client 创建索引

参考链接:Using the Java API Client

image-20240109152629604

/*** 创建索引*/
@Test
void createIndex() throws IOException {ClassLoader classLoader = ResourceLoader.class.getClassLoader();InputStream input = classLoader.getResourceAsStream("mapping/douban.json");CreateIndexRequest req = CreateIndexRequest.of(b -> b.index("douban_v1").withJson(input));boolean created = client.indices().create(req).acknowledged();log.info("是否创建成功:" + created);
}

4.4 保存文档

实体类 DouBan.java

package com.zhouquan.client.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @author ZhouQuan* @description todo* @date 2024-01-09 15:54**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DouBan {private String id;private String title;private String author;private String contentDesc;private Integer wordCount;private Double price;private String cover;private Integer heatCount;private Date updateTime;
}

4.4.1 索引单个文档

public String indexSingleDoc() {IndexResponse indexResponse;DouBan douBan = new DouBan("1211", "河边的错误", "余华", "内容简介", 50000, 52.5, "封面1", 74, new Date());try {// 使用流式dsl保存indexResponse = client.index(i -> i.index(indexName).id(douBan.getId()).document(douBan));// 使用 Java API Client的静态of()方法IndexRequest<DouBan> objectIndexRequest = IndexRequest.of(i -> i.index(indexName).id(douBan.getId()).document(douBan));IndexResponse ofIndexResponse = client.index(objectIndexRequest);// 使用经典版本IndexRequest.Builder<DouBan> objectBuilder = new IndexRequest.Builder<>();objectBuilder.index(indexName);objectBuilder.id(douBan.getId());objectBuilder.document(douBan);IndexResponse classicIndexResponse = client.index(objectBuilder.build());// 异步保存asyncClient.index(i -> i.index("douban").id(douBan.getId()).document(douBan)).whenComplete((response, exception) -> {if (exception != null) {log.error("Failed to index", exception);} else {log.info("Indexed with version " + response.version());}});// 索引原始json数据IndexResponse response = null;try {String jsonData = " {\"id\":\"1741\",\"title\":\"三体\",\"author\":\"刘慈欣\",\"contentDesc\":\"内容简介\",\"wordCount\":50000,\"price\":52.5}";Reader input = new StringReader(jsonData);IndexRequest<JsonData> request = IndexRequest.of(i -> i.index("douban_v1").withJson(input));response = client.index(request);log.info("Indexed with version " + response.version());} catch (IOException e) {throw new RuntimeException(e);}} catch (IOException e) {throw new RuntimeException(e);}return Result.Created.equals(indexResponse.result()) + "";}

4.4.2 批量索引文档

/*** 批量保存** @throws IOException*/
@Test
void bulkSave() throws IOException {DouBan douBan1 = new DouBan("1002", "题名1", "余华", "内容简介", 50000, 52.5, "封面1", 74, new Date());DouBan douBan2 = new DouBan("1003", "题名2", "余华", "内容简介", 50000, 52.5, "封面1", 74, new Date());DouBan douBan3 = new DouBan("1004", "题名3", "余华", "内容简介", 50000, 52.5, "封面1", 74, new Date());List<DouBan> douBanList = new ArrayList<>();douBanList.add(douBan1);douBanList.add(douBan2);douBanList.add(douBan3);BulkRequest.Builder br = new BulkRequest.Builder();for (DouBan douBan : douBanList) {br.operations(op -> op.index(idx -> idx.index("products").id(douBan.getId()).document(douBan)));}BulkResponse result = client.bulk(br.build());if (result.errors()) {log.error("Bulk had errors");for (BulkResponseItem item : result.items()) {if (item.error() != null) {log.error(item.error().reason());}}}
}

4.4.3 原始数据批量索引文档

/*** 原始json数据批量保存** @throws IOException*/
@Test
void rawDataBulkSave() throws IOException {File logDir = new File("D:\\IdeaProjects\\client\\src\\main\\resources\\data");File[] logFiles = logDir.listFiles(file -> file.getName().matches("bulk*.*\\.json"));BulkRequest.Builder br = new BulkRequest.Builder();for (File file : logFiles) {FileInputStream input = new FileInputStream(file);BinaryData data = BinaryData.of(IOUtils.toByteArray(input), ContentType.APPLICATION_JSON);br.operations(op -> op.index(idx -> idx.index("douban_v1").document(data)));}BulkResponse result = client.bulk(br.build());if (result.errors()) {List<BulkResponseItem> items = result.items();items.forEach(x -> System.out.println(x.error()));}log.info("是否成功批量保存:" + !result.errors());
}

4.5 获取单个文档

// 根据id获取数据并装载为java对象
GetRequest getRequest = GetRequest.of(x -> x.index("douban_v1").id("1002"));
GetResponse<DouBan> douBanGetResponse = client.get(getRequest, DouBan.class);
DouBan source = douBanGetResponse.source();GetResponse<DouBan> response = client.get(g -> g.index(indexName).id(id),DouBan.class
);if (!response.found()) {throw new BusinessException("未获取到指定id的数据");
}DouBan douBan = response.source();
log.info("资料title: " + douBan.getTitle());
return douBan;
// 根据id获取原始JSON数据
GetResponse<ObjectNode> response1 = client.get(g -> g.index(indexName).id(id),ObjectNode.class
);if (response1.found()) {ObjectNode json = response1.source();String name = json.get("title").asText();log.info(" title " + name);
} else {log.info("data not found");
}
return null;

4.6 文档检索

4.6.1 普通的搜索查询

public List<DouBan> search(String searchText) {SearchResponse<DouBan> response = null;try {response = client.search(s -> s.index(indexName).query(q -> q.match(t -> t.field("title").query(searchText))),DouBan.class);} catch (IOException e) {throw new RuntimeException(e);}TotalHits total = response.hits().total();boolean isExactResult = total.relation() == TotalHitsRelation.Eq;if (isExactResult) {log.info("There are " + total.value() + " results");} else {log.info("There are more than " + total.value() + " results");}List<Hit<DouBan>> hits = response.hits().hits();List<DouBan> list = new ArrayList<>();for (Hit<DouBan> hit : hits) {DouBan DouBan = hit.source();list.add(DouBan);log.info("Found DouBan " + DouBan.getTitle() + ", score " + hit.score());}return list;
}

4.6.2 嵌套搜索查询

public List<DouBan> search2(String searchText, Double price) {Query titleQuery = MatchQuery.of(m -> m.field("title").query(searchText))._toQuery();Query rangeQuery = RangeQuery.of(r -> r.field("price").gte(JsonData.of(price)))._toQuery();try {SearchResponse<DouBan> search = client.search(s -> s.index(indexName).query(q -> q.bool(b -> b.must(titleQuery).must(rangeQuery))),DouBan.class);// 解析检索结果List<DouBan> douBanList = new ArrayList<>();List<Hit<DouBan>> hits = search.hits().hits();for (Hit<DouBan> hit : hits) {DouBan douBan = hit.source();douBanList.add(douBan);}return douBanList;} catch (Exception e) {throw new RuntimeException(e);}
}

4.6.3 模板搜索

// 创建模板,返回搜索请求正文的存储脚本
client.putScript(r -> r.id("query-script").script(s -> s.lang("mustache").source("{\"query\":{\"match\":{\"{{field}}\":\"{{value}}\"}}}")));// 执行请求
SearchTemplateResponse<DouBan> response = client.searchTemplate(r -> r.index("douban_v1").id("query-script").params("field", JsonData.of("title")).params("value", JsonData.of("题名")),DouBan.class
);// 结果解析
List<Hit<DouBan>> hits = response.hits().hits();
for (Hit<DouBan> hit: hits) {DouBan DouBan = hit.source();log.info("Found DouBan " + DouBan.getTitle() + ", score " + hit.score());
}

4.7 文档聚合

Query query = MatchQuery.of(t -> t.field("title").query(searchText))._toQuery();Aggregation authorAgg = AggregationBuilders.terms().field("author").build()._toAggregation();SearchResponse<DouBan> response = null;response = client.search(s -> s.index(indexName).query(query).aggregations("author", authorAgg),DouBan.class
);

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

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

相关文章

flutter设置windows是否显示标题栏和状态栏和全屏显示

想要让桌面软件实现全屏和不显示状态栏或者自定义状态栏&#xff0c;就可以使用window_manager这个依赖库&#xff0c;使用起来还是非常方便的&#xff0c;可以自定义显示窗口大小和位置&#xff0c;还有设置标题栏是否展示等内容&#xff0c;也可以设置可拖动区域。官方仓库地…

OpenHarmony当前进展和未来趋势

操作系统自20世纪50年代诞生&#xff0c;经历了从专用操作系统到通用操作系统的转变。整体可以将操作系统的发展历史分为3个阶段&#xff1a;PC时代、移动互联网时代、万物互联时代。 PC时代主要以计算机为主&#xff0c;用户规模从1970年的10亿增长到1990年的30亿。这一时代诞…

鸿蒙原生应用/元服务实战-DevEco Studio 模拟器资源经常不足

DevEco Studio 模拟器资源经常不足&#xff0c;模拟器是最方便和最广泛的开发者可以快速体验应用元服务效果的途径&#xff0c;还是要加强。 除了Wearable,其他都用不了。 只能用预览器看效果&#xff0c;或者使用远程真机或者本地真机了。 在API9&#xff0c;比如分享等&…

leetcode第 381 场周赛最后一题 差分,对称的处理

第 381 场周赛 - 力扣&#xff08;LeetCode&#xff09;最后一题3017. 按距离统计房屋对数目 II - 力扣&#xff08;LeetCode&#xff09; dijkstra超时了&#xff0c;看了灵神的解题方法力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff0c;其…

二.用户与权限管理(二)

用户与权限管理 5.角色管理5.1角色的理解5.2创建角色5.3给角色赋予权限5.4查看角色的权限5.5回收角色的权限5.6删除角色5.7给用户赋予角色5.8激活角色5.9撤销用户角色5.10设置强制角色(mandatory role) 6.配置文件的使用6.1配置文件格式6.2 启动命令与选项组6.3 特定MySQL版本的…

java数组ArrayList(存对象)

1、dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {…

推荐IDEA一个小插件,实用性很高!!

插件&#xff1a; Convert YAML and Properties File 由于每个人的开发习惯不同&#xff0c;在开发过程中会遇到各种小细节的问题。今天给大家介绍一个小插件&#xff0c;作用不大&#xff0c;细节很足。 就是properties类型文件和yml文件互相自由转换 解决&#xff1a;…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

简单但全面了解一下webSocket

文章目录 webSocket是一种协议&#xff0c;设计用于提供低延迟、双全工和长期运行的连接什么是实时通信&#xff1f; webSocket之前的世界webSocket的优势为什么需要心跳机制&#xff1f;webSocket的限制 webSocket是一种协议&#xff0c;设计用于提供低延迟、双全工和长期运行…

CRM系统的痛点,如何解决?

在当今竞争激烈的商业世界中&#xff0c;客户关系管理&#xff08;CRM&#xff09;数字化转型已经成为大企业成功的重要秘诀。大型跨国公司如亚马逊、苹果和微软等已经在CRM数字化方面走在了前列&#xff0c;实现了高度个性化的客户体验&#xff0c;加强了客户忠诚度。 然而&a…

Conda python管理环境environments 四 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

【Linux】解决能访问github但克隆不了的问题

文章目录 1.查看你的代理的地址&#xff1a;2.git设置3.尝试clone 1.查看你的代理的地址&#xff1a; 2.git设置 先看看当前的git设置 $ git config --list然后git中要设置好对应的地址 git config --global http.proxy 127.0.0.1:78903.尝试clone $ git clone https://git…

服务器感染了.wis[[Rast@airmail.cc]].wis勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; 在当今数字化的时代&#xff0c;恶意软件攻击已经变得越来越复杂和狡猾&#xff0c;[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis[[Rastairmail.cc]].wis勒索病毒是其中的一种新威胁。本文91数据恢复将深入介绍[[MyFilewaifu.club]].wis [[backupwaif…

机器学习实验报告-集成学习

目录 一、集成学习介绍 1.1集成学习的引入 1.2集成学习发展史 1.3集成学习的学习组织方式 1.3.1并联组织关系 1.3.2串联组织关系 1.4集成学习及其实现方法概述 二、集成学习实现方法 2.1Boosting 2.1.1基本过程 2.1.2注意点 2.2bagging 2.2.1基本过程 2.2.2注意点…

QT实现USB通讯

一.概述 QT实现USB通讯这里主要介绍两种方法&#xff0c;一种是通过libusb库来实现usb通讯&#xff0c;一种是通过hidapi库实现通信。 1.介绍libusb库 libusb 是一个 C 库&#xff0c;提供对 USB 设备的通用访问。 可移植的&#xff1a;使用单个跨平台API&#xff0c;它可以…

一、防御保护---信息安全概述

一、网络安全防御---信息安全概述 1.信息安全现状及挑战1.1 网络空间安全市场在中国&#xff0c;潜力无穷1.2 数字化时代威胁升级1.3 传统安全防护逐步失效1.4 安全风险能见度不足1.5 缺乏自动化防御手段1.6 网络安全监管标准愈发严苛 2.信息安全概述2.1 简介2.2 常见的网络安全…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式&#xff08;Proxy Pattern&#xff09; 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁&#xff0c;但不推荐) 2.基于CGLIB实现 spring中应用 …

uniapp使用自定义组件

tt.vue中使用video-player组件 用到的目录如下&#xff1a; pages.json {"path": "pages/Tabbar/tt/tt","style": {"navigationBarTitleText": "","enablePullDownRefresh": false,// 使用自定义组件"using…