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

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search (ES)Java 入门实操(1)下载安装、概念-CSDN博客

Elastic Search(ES)Java 入门实操(3)数据同步-CSDN博客

这篇主要演示 Java 整合 ES进行数据搜索。

ES 实现搜索接口

首先根据 MySQL 字段,在 ES 创建索引。

create table mydb
(id          int auto_increment comment '序号'primary key,title       varchar(20)                        not null comment '标题',content     text                               not null comment '内容',cretateTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',updateTime  datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',isDelete    tinyint  default 0                 not null comment '是否删除'
)comment '文章' collate = utf8mb4_unicode_ci;
PUT article_1
{"aliases": {  #别名"article": {}},"mappings": {"properties": {"title": {"type": "text", #字段类型"analyzer": "ik_max_word",#插入时分词方式"search_analyzer": "ik_smart", #查询时分词方式"fields": { #字段配置,子字段"keyword": { "type": "keyword", #精确匹配"ignore_above": 256 #超过 256 字符就忽略查询}}},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"createTime": {"type": "date"},"updateTime": {"type": "date"},"isDelete": {"type": "keyword"}}}
}

引入 spring-data-elasticsearch 依赖

需要注意版本号一定要兼容

Spring Data Elasticsearch - Reference Documentation

这里使用的是 7.17版本,所以选择相近的 4.4.x版本的 依赖,同样的 springboot 的版本也得严格对应。Maven Repository: org.springframework.data » spring-data-elasticsearch » 4.4.7 (mvnrepository.com)

 下面的报错就是版本不对,需要把springboot 改为 2.7+,

java.lang.NoSuchFieldError: INDEX_CONTENT_TYPE
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch -->
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>4.4.7</version>
</dependency>

启动 springboot,有调用的日志

给 ES 索引创建实体类 

/*** ES 实体类* document 注解是将Java 对象映射到 Elasticsearch 索引和类型中*/
@Document(indexName = "article")
@Data
public class ArticleEsDto implements Serializable {private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";/*** id* 需要打上 id 注解,指定 ES 中存储的 id 是唯一字段* 如果新增是不传入,则 ES 会自动生成*/@Idprivate long id;/*** 标题*/private String title;/*** 内容*/private String content;/*** 创建时间*/@Field(index = false, store = true,type = FieldType.Date,format = {},pattern = DATE_TIME_PATTERN)private Date createTime;/*** 更新时间* Field:这是一个MyBatis-Plus注解,用于标注该字段在数据库表中的对应关系。* 其中,index = false表示该字段不在数据库表的索引中,* store = true表示该字段在数据库表的存储中,* type = FieldType.Date表示该字段的类型为Date,* format = {}表示该字段的格式为空,* pattern = DATE_TIME_PATTERN表示该字段的日期时间格式为DATE_TIME_PATTERN。*/@Field(index = false, store = true,type = FieldType.Date,format = {},pattern = DATE_TIME_PATTERN)private Date updateTime;/*** 是否删除*/private Integer isDelete;private static final long serialVersionUID = 1L;
}

第一种方式

elasticsearch Respository,新建类继承该类,默认提供了简单的增删改查方法,多用于可以预期的,相对不复杂的查询

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);<S extends T> Iterable<S> saveAll(Iterable<S> entities);Optional<T> findById(ID id);boolean existsById(ID id);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> ids);long count();void deleteById(ID id);void delete(T entity);void deleteAllById(Iterable<? extends ID> ids);void deleteAll(Iterable<? extends T> entities);void deleteAll();
}
/*** ES 的控制层* 继承 ElasticsearchRepository 即可*/
public interface ArticleEsDao extends ElasticsearchRepository<ArticleEsDto, Long> {// 这里可以扩展一些自定义方法// 例如:根据标题模糊查询List<ArticleEsDto> findByTitle(String title);}

新增测试

//注入接口@Resourceprivate ArticleEsDao articleEsDao;//测试新增@Testvoid EsTest1(){//创建实体对象并添加属性ArticleEsDto articleEsDto = new ArticleEsDto();articleEsDto.setId(1L);articleEsDto.setTitle("青花瓷");articleEsDto.setContent("天青色等烟雨而我在等你");articleEsDto.setCreateTime(new Date());articleEsDto.setUpdateTime(new Date());articleEsDto.setIsDelete(0);//调用方法保存articleEsDao.save(articleEsDto);System.out.println(articleEsDto.getId());}

dev tools 查看

GET article/_search/

自定义方法测试

我们在上面创建接口的时候创建了一个根据标题查询的方法

    @Testvoid EsTest2(){List<ArticleEsDto> articleEsDtos = articleEsDao.findByTitle("青花瓷");System.out.println(articleEsDtos);}

 第二种方式

spring 默认提供了操作 ES 的客户端对象 ElasticSearchRestTemplate,同样提供了增删改查,更加灵活,适用于更加复杂的操作,返回结果更加完整,但是需要自己解析。

    @Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;

提示,在编写查询条件以及处理数据时,可以先在 Dev Tools 中执行一下查询,没问题之后再进行代码层面的条件编写。

查询 DSL

官方文档:Query and filter context | Elasticsearch Guide [8.14] | Elastic

查询模式:Boolean query | Elasticsearch Guide [8.14] | Elastic

GET /_search
{"query": {  "bool": {  //组合条件"must": [ //必须匹配{ "match":  // 模糊匹配{ "title":   "Search"        }},{ "match": { "content": "Elasticsearch" }}],"filter": [ //{ "term": //精确匹配 { "status": "published" }},{ "range": //范围匹配 { "publish_date": { "gte": "2015-01-01" }}}]}}
}

除了 must ,filter,还有 must_not,必须不存在才能匹配,should,至少有多少个条件相符才匹配,同时还有一个参数 minimum_should_match 满足最小的条件数,比如 1,至少满足一个条件才能查询到,比如标题和描述存在一个就可以返回结果。

POST _search
{"query": {"bool" : {"must" : {"term" : { "user.id" : "kimchy" }},"filter": {"term" : { "tags" : "production" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tags" : "env1" } },{ "term" : { "tags" : "deployed" } }],"minimum_should_match" : 1,"boost" : 1.0}}
}

需要注意的是,通过模糊查询之后,查询结果中有一个参数是 max_score,表示这条数据和搜索条件的最高匹配度。

在 Java 中编写查询条件以及处理查询的数据。

主要使用到的 API

//查询条件构造器
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//排序条件构造器
SortBuilder<?> sortBuilder = SortBuilders.scoreSort();//分页
PageRequest pageRequest = PageRequest.of((int) current, (int) pageSize);//组合查询条件
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).withSorts(sortBuilder).build();
//调用 elasticsearchRestTemplate 查询
SearchHits<PostEsDTO> searchHits = elasticsearchRestTemplate.search(searchQuery, PostEsDTO.class);

完整代码

/*** 从 es 查询数据*/
@Service
public class ArticleEsManager {@Resourceprivate ArticleMapper articleMapper;@Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;public Page<Article> searchByEs(ArticleQueryRequest articleQueryRequest) {//提取查询参数Long id = articleQueryRequest.getId();String searchText = articleQueryRequest.getSearchText();String content = articleQueryRequest.getContent();String title = articleQueryRequest.getTitle();//设置分页参数,起始页为 0int current = articleQueryRequest.getCurrent() -1 ;int pageSize = articleQueryRequest.getPageSize();String sortField = articleQueryRequest.getSortField();String sortOrder = articleQueryRequest.getSortOrder();//构建布尔查询,创建 boolqueryBuilder,用于后续查询条件构建BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//过滤查询条件//过滤掉被逻辑删除的 term 是精确匹配boolQueryBuilder.filter(QueryBuilders.termQuery("isDelete",0));//id必须精确匹配if(id!=null){boolQueryBuilder.filter(QueryBuilders.termQuery("id",id));}//模糊查询,按照查询词(关键词)检索if(StringUtils.isNotEmpty(searchText)){boolQueryBuilder.should(QueryBuilders.matchQuery("title",searchText));boolQueryBuilder.should(QueryBuilders.matchQuery("content",searchText));//设置至少多少匹配才进行查询boolQueryBuilder.minimumShouldMatch(1);}//根据标题检索if(StringUtils.isNotEmpty(title)){boolQueryBuilder.should(QueryBuilders.matchQuery("title",title));boolQueryBuilder.minimumShouldMatch(1);}//根据内容检索if(StringUtils.isNotEmpty(content)){boolQueryBuilder.should(QueryBuilders.matchQuery("content",searchText));//设置至少多少匹配才进行查询boolQueryBuilder.minimumShouldMatch(1);}//进行排序//对查询结果的分数进行排序SortBuilder<?> sortBuilder = SortBuilders.scoreSort();if (StringUtils.isNotEmpty(sortField) && StringUtils.isNotEmpty(sortOrder)){sortBuilder = SortBuilders.fieldSort(sortField);sortBuilder.order(CommonConstant.SORT_ORDER_ASC.equals(sortOrder) ? SortOrder.ASC:SortOrder.DESC);}//分页PageRequest pageRequest = PageRequest.of(current, pageSize);//构造查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).withSorts(sortBuilder).build();//调用 elasticsearchRestTemplate 执行查询SearchHits<ArticleEsDto> searchHits = elasticsearchRestTemplate.search(searchQuery, ArticleEsDto.class);System.out.println(searchHits);Page<Article> page = new Page<>();page.setTotal(searchHits.getTotalHits());//新建集合存储文章List<Article> resourceList = new ArrayList<>();//处理结果,判断是否有搜索结果if(searchHits.hasSearchHits()){//获取结果列表List<SearchHit<ArticleEsDto>> searchHits1 = searchHits.getSearchHits();System.out.println(searchHits1);//获取结果的id,使用id在数据库中查询List<Long> ids = searchHits1.stream().map(searchHit -> searchHit.getContent().getId()).collect(Collectors.toList());List<Article> articles = articleMapper.selectBatchIds(ids);//将查询结果与数据库查询结果进行匹配if (CollectionUtils.isNotEmpty(articles)) {//将查询结果与数据库查询结果进行匹配Map<Long, List<Article>> collect = articles.stream().collect(Collectors.groupingBy(Article::getId));//遍历文章idarticles.forEach(articleId -> {if(collect.containsKey(articleId)){resourceList.add(collect.get(articleId).get(0));}else{// 从 es 清空 db 已物理删除的数据String delete = elasticsearchRestTemplate.delete(String.valueOf(articleId), ArticleEsDto.class);}});}}page.setRecords(resourceList);return page;}
}

成功查询到数据 

完整代码

/*** 从 es 查询数据*/
@Service
public class ArticleEsManager {@Resourceprivate ArticleMapper articleMapper;@Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;public Page<Article> searchByEs(ArticleQueryRequest articleQueryRequest) {//提取查询参数Long id = articleQueryRequest.getId();String searchText = articleQueryRequest.getSearchText();String content = articleQueryRequest.getContent();String title = articleQueryRequest.getTitle();//设置分页参数,起始页为 0int current = articleQueryRequest.getCurrent() -1 ;int pageSize = articleQueryRequest.getPageSize();String sortField = articleQueryRequest.getSortField();String sortOrder = articleQueryRequest.getSortOrder();//构建布尔查询,创建 boolqueryBuilder,用于后续查询条件构建BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//过滤查询条件//过滤掉被逻辑删除的 term 是精确匹配boolQueryBuilder.filter(QueryBuilders.termQuery("isDelete",0));//id必须精确匹配if(id!=null){boolQueryBuilder.filter(QueryBuilders.termQuery("id",id));}//模糊查询,按照查询词(关键词)检索if(StringUtils.isNotEmpty(searchText)){boolQueryBuilder.should(QueryBuilders.matchQuery("title",searchText));boolQueryBuilder.should(QueryBuilders.matchQuery("content",searchText));//设置至少多少匹配才进行查询boolQueryBuilder.minimumShouldMatch(1);}//根据标题检索if(StringUtils.isNotEmpty(title)){boolQueryBuilder.should(QueryBuilders.matchQuery("title",title));boolQueryBuilder.minimumShouldMatch(1);}//根据内容检索if(StringUtils.isNotEmpty(content)){boolQueryBuilder.should(QueryBuilders.matchQuery("content",searchText));//设置至少多少匹配才进行查询boolQueryBuilder.minimumShouldMatch(1);}//进行排序//对查询结果的分数进行排序SortBuilder<?> sortBuilder = SortBuilders.scoreSort();if (StringUtils.isNotEmpty(sortField) && StringUtils.isNotEmpty(sortOrder)){sortBuilder = SortBuilders.fieldSort(sortField);sortBuilder.order(CommonConstant.SORT_ORDER_ASC.equals(sortOrder) ? SortOrder.ASC:SortOrder.DESC);}//分页PageRequest pageRequest = PageRequest.of(current, pageSize);//构造查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).withSorts(sortBuilder).build();//调用 elasticsearchRestTemplate 执行查询SearchHits<ArticleEsDto> searchHits = elasticsearchRestTemplate.search(searchQuery, ArticleEsDto.class);System.out.println(searchHits);Page<Article> page = new Page<>();page.setTotal(searchHits.getTotalHits());//新建集合存储文章List<Article> resourceList = new ArrayList<>();//处理结果,判断是否有搜索结果if(searchHits.hasSearchHits()){//获取结果列表List<SearchHit<ArticleEsDto>> searchHits1 = searchHits.getSearchHits();System.out.println(searchHits1);//获取结果的id,使用id在数据库中查询List<Long> ids = searchHits1.stream().map(searchHit -> searchHit.getContent().getId()).collect(Collectors.toList());List<Article> articleList = articleMapper.selectBatchIds(ids);//将查询结果与数据库查询结果进行匹配if (CollectionUtils.isNotEmpty(articleList)) {//将查询结果与数据库查询结果进行匹配Map<Long, List<Article>> collect = articleList.stream().collect(Collectors.groupingBy(Article::getId));//遍历文章idids.forEach(articleId -> {if(collect.containsKey(articleId)){resourceList.add(collect.get(articleId).get(0));}else{// 从 es 清空 db 已物理删除的数据String delete = elasticsearchRestTemplate.delete(String.valueOf(articleId), ArticleEsDto.class);}});}}//设置到分页里page.setRecords(resourceList);return page;}

相关文章:

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search &#xff08;ES&#xff09;Java 入门实操&#xff08;1&#xff09;下载安装、概念-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;3&#xff09;数据同步-CSDN博客 这篇主要演示 Java 整合…...

Hudi Spark Sql Procedures 回滚 Hudi 表数据

前言 因为有 Hudi Rollback 的需求,所以单独总结 Hudi Spark Sql Procedures Rollback。 版本 Hudi 0.13.0(发现有bug)、(然后升级)0.14.1Spark 3.2.3Procedures 官方文档:https://hudi.apache.org/docs/procedures 相关阅读:Hudi Spark SQL Call Procedures学习总结…...

【重学C语言】十九、SDL2 图形化编程的使用

【重学C语言】十九、SDL2 图形化编程的使用 SDL2 的第一个程序渲染器纹理渲染1. 纹理的概念2. 加载纹理3. 渲染纹理4. 纹理设置和查询5. 纹理渲染流程6. 注意事项SDL2_imageSDL2 的第一个程序 #define SDL_MAIN_HANDLED #include <SDL.h>int main(int argc, char* argv[…...

什么是电风扇行情?

“电风扇行情” 是一个金融术语&#xff0c;用于描述证券市场中价格上下波动频繁、幅度较大&#xff0c;但总体趋势不明显的市场状况。   其名称来源于电风扇的扇叶在旋转时&#xff0c;风向不断变化的特征&#xff0c;形象地比喻了市场价格频繁变动但没有明确方向的情景。 …...

pytho入门教程

文章目录 随机数据生成的方式list操作方式数据操作方式处理缺失数据数据框操作方式画图的方式 随机数据生成的方式 # 随机生成数据的方式 # 1. 随机生成10-20之间的浮点数 holdForce random.uniform(10,20) # print(holdForce)# 2.for循环输出50个数据的方式 # for i in rang…...

Elasticsearch:ES|QL 查询 TypeScript 类型(二)

在我之前的文章 “Elasticsearch&#xff1a;ES|QL 查询 TypeScript 类型&#xff08;一&#xff09;”&#xff0c;我们讲述了如何在 Nodejs 里对 ES|QL 进行查询。在今天的文章中&#xff0c;我们来使用一个完整的例子来进行详细描述。更多有关如何使用 Nodejs 来访问 Elasti…...

元音 (音标) 和元音字母的区别

元音 [音标] 和元音字母的区别 1. 音位 (phoneme)1.1. Correspondence between letters and phonemes 2. 元音 (vowel)3. 辅音 (consonant)3.1. Consonant sounds and consonant letters 4. 元音字母 (vowel letter)References 1. 音位 (phoneme) https://en.wikipedia.org/wi…...

SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)

目录 SMS 环境调试 从阿里云云市场中购买第三方短信服务 调试短信验证码功能 实战开发 封装组件 对外接口 调用演示 SMS 环境调试 从阿里云云市场中购买第三方短信服务 a&#xff09;进入阿里云首页&#xff0c;然后从云市场中找到 “短信” &#xff08;一定要从 云…...

使用Python编写Ping监测程序

Ping是一种常用的网络诊断工具&#xff0c;它可以测试两台计算机之间的连通性&#xff1b; 如果您需要监测某个IP地址的连通情况&#xff0c;可以使用Python编写一个Ping监测程序&#xff1b; 本文将介绍如何使用Python编写Ping监测程序 首先&#xff0c;需要导入os、sys、t…...

iptables常用命令总结

1.iptables 是什么 在Linux中&#xff0c;iptables就是一款强大而灵活的防火墙工具&#xff0c;它为系统管理员提供了广泛的配置选项&#xff0c;可以有效地控制数据包的流动&#xff0c;实现网络访问的控制及安全性增强。 iptables 使用三个不同的链来允许或阻止流量&#x…...

spring 自定义注解实现

实现自定义注解&#xff0c;通常会结合AOP&#xff08;面向切面编程&#xff09;来创建一个自定义的行为。 下面创建一个名为MyCustomAnnotation的自定义注解&#xff0c;并使用AOP编写一个切面来处理这个注解。 1. 创建自定义注解&#xff1a; import java.lang.annotation…...

10.dockerfile自动构建镜像

dockerfile自动构建镜像 类似ansible剧本&#xff0c;大小几kb 手动做镜像&#xff1a;大小几百M 首先创建一个dockerfile的路径&#xff0c;便于在路径下存在多个路径每个路径下都是dockerfile命名的脚本 注释&#xff1a;文件必须为&#xff1a;dockerfile或者Dockerfile …...

python -- series和 DataFrame增删改数据

学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…...

window.clearInterval(timer) 清除定时器

window.clearInterval(timer)是用来清除定时器的方法。在JavaScript中&#xff0c;使用定时器可以在指定的时间间隔执行一段代码。通常&#xff0c;使用setTimeout()方法可以在一定时间后执行一次代码&#xff0c;而使用setInterval()方法可以在每个时间间隔执行一次代码。 使…...

Java项目如何外发告警日志到企业微信

前言 最近领导交代了一个需求,就是有些许客户不单单满足平台告警日志外发到邮箱、短信的形式,还要以消息聊天的形式外发给企业微信。 具体操作 1、注册企业微信。 2、登录企业微信,找到应用管理,创建应用。 3、创建完之后需要记录以下图片中两个值的信息。 4、然后记录下…...

NLP--关键词

在去停用词后的文本中进行词频统计和关键词统计以及词云图显示&#xff0c;来进行文本的关键词提取&#xff0c;让人一目了然。 1.词频统计 统计文本中多次出现的词语&#xff0c;来寻找文章中的关键词&#xff0c;因为多次出现很可能就是关键内容。调用统计数量的Counter库和…...

Qt5学习笔记

一、基础知识 1、基本控件类型 水平弹簧与垂直弹簧的父类都是QSpaceItem。关于PushButton相关的控件类型&#xff1a; QPushButton&#xff1a;最基础的按钮类型。QToolButton&#xff1a;可以控制图片、文字任意组合的显示方式的按钮类型。QRadioButton&#xff1a;就像rad…...

数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?

概述 已经学习了这么多章节了&#xff0c;你有没有发现&#xff0c;两种数据结构&#xff0c;散列表和链表&#xff0c;经常会被放在一起使用。你还记得&#xff0c;前面的章节中都有哪些地方讲到散列表和链表的组合使用吗&#xff1f; 在链表那一节&#xff0c;我讲到如何用…...

读AI未来进行式笔记06自动驾驶技术

1. 跃层冲击 1.1. 每个社会其实都处于不同的楼层&#xff0c;往往处于更低楼层的社会&#xff0c;要承受来自更高楼层的社会发展带来的更大冲击 2. 驾驶 2.1. 开车时最关键的不是车&#xff0c;而是路 2.2. 人是比机器更脆弱的生命&am…...

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…...

html+css示例

HTML HTML&#xff08;超文本标记语言&#xff09;和CSS&#xff08;层叠样式表&#xff09;是构建和设计网页的两种主要技术。HTML用于创建网页的结构和内容&#xff0c;而CSS用于控制其外观和布局。 HTML基础 HTML使用标签来标记网页中的不同部分。每个标签通常有一个开始…...

Day51 动态规划part10+Day52 动态规划part11

LC121买卖股票的最佳时机&#xff08;未掌握&#xff09; 暴力&#xff1a;双层循环寻找最优间距&#xff0c;每一次都确定一个起点&#xff0c;遍历剩余节点当作终点 贪心&#xff1a;取最左最小值&#xff0c;不断遍历那么得到的差值最最大值就是最大利润。 动态规划 dp数组…...

Wireshark自定义Lua插件

背景&#xff1a; 常见的抓包工具有tcpdump和wireshark&#xff0c;二者可基于网卡进行抓包&#xff1a;tcpdump用于Linux环境抓包&#xff0c;而wireshark用于windows环境。抓包后需借助包分析工具对数据进行解析&#xff0c;将不可读的二进制数转换为可读的数据结构。 wires…...

商城项目【尚品汇】07分布式锁-2 Redisson篇

文章目录 1 Redisson功能介绍2 Redisson在Springboot中快速入门&#xff08;代码&#xff09;2.1 导入依赖2.2 Redisson配置2.3 将自定义锁setnx换成Redisson实现&#xff08;可重入锁&#xff09; 3 可重入锁原理3.1 自定义分布式锁setnx为什么不可以重入3.2 redisson为什么可…...

Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形

Adobe Illustrator&#xff0c;它不仅仅是一个简单的图形编辑工具&#xff0c;更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中&#xff0c;用户可以通过各种精心设计的工具&#xff0c;轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…...

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:中国舰船研究院

中国舰船研究院又称中国船舶重工集团公司第七研究院&#xff0c;隶属于中国船舶重工集团公司&#xff0c;是专门从事舰船研究、设计、开发的科学技术研究机构&#xff0c;是中国船舶重工集团公司的军品技术研究中心、科技开发中心&#xff1b;主要从事舰船武器装备发展战略研究…...

双网卡配置IP和路由总结

1.在网络适配器属性IPv4中设置默认网关&#xff08;记网关地址为A&#xff09;&#xff0c;将会在本地路由表中新增一条记录&#xff1a; 网络号子网掩码网关地址0.0.0.00.0.0.0A 2.如果有两个网卡&#xff08;假设一个连接内网&#xff0c;一个连接互联网&#xff09;&#…...

【纯血鸿蒙】——自适应布局如何实现?

界面级一多能力有 2 类&#xff1a; 自适应布局: 略微调整界面结构 响应式布局&#xff1a;比较大的界面调整 本文章先主要讲解自适应布局&#xff0c;响应式布局再后面文章再细讲。话不多说&#xff0c;开始了。 自适应布局 针对常见的开发场景&#xff0c;方舟开发框架提…...

Qt5学习笔记(一):Qt Widgets Application项目初探

笔者长期使用MFC开发Windows GUI软件。随着软件向Linux平台迁移的趋势越发明朗&#xff0c;GUI程序的跨平台需求也越来越多。因此笔者计划重新抓一下Qt来实现跨平台GUI程序的实现。 0x01. 看看Qt Widgets Application项目结构 打开Qt5&#xff0c;点击“ New”按钮新建项目。…...

Linux网络编程:数据链路层协议

目录 前言&#xff1a; 1.以太网 1.1.以太网帧格式 1.2.MTU&#xff08;最大传输单元&#xff09; 1.2.1.IP协议和MTU 1.2.2.UDP协议和MTU 1.2.3.TCP协议和MTU 2.ARP协议&#xff08;地址解析协议&#xff09; 2.1.ARP在局域网通信的角色 2.2.ARP报文格式 2.3.ARP报文…...

做一网站/网上推销产品的软件

文章目录八、AR(p){\rm AR}(p)AR(p)序列与其自协方差函数1.AR(p){\rm AR}(p)AR(p)序列2.Yule-Walker方程3.自协方差函数的正定性回顾总结八、AR(p){\rm AR}(p)AR(p)序列与其自协方差函数 1.AR(p){\rm AR}(p)AR(p)序列 之前我们给出过AR(p){\rm AR}(p)AR(p)序列的定义&#xf…...

苏州招聘网站建设/杭州百度推广开户

题解在下已经写过一次了&#xff0c;所以就不再写了&#xff0c;下面只有代码 题解下载(1)&#xff1a;http://pan.baidu.com/s/1hsAUjMs 题解下载(2):http://pan.baidu.com/s/1mhC7EYk A 卿学姐与公主 代码 #include <iostream> #include <cstdio> #include <a…...

昆明有哪些帮忙做网站的公司/网站设计公司

介绍 操作符map&#xff0c;字面理解一下&#xff0c;就是映射&#xff0c;那么这个操作符如何使用呢&#xff1f; 举个栗子 1. 代码示例 Observable<Integer> observable Observable.create(new ObservableOnSubscribe<Integer>() {Overridepublic void subs…...

网站建设与规划/软文写作的十大技巧

文章目录参考资料1. 线性回归1.1 概述应用举例1.2 分析1.3 对数线性回归1.4 过拟合、欠拟合如何解决L2正则化(岭回归)L1正则化(Lasso回归)ElasticNet回归1.5 线性回归要求因变量服从正态分布&#xff1f;2. 对数几率回归(logistic 回归&#xff09;2.1 概述2.2 优点2.3 求解2.4…...

商城网站建设流程图/如何查询百度收录情况

语法 switch(n) { case 1:执行代码块 1break; case 2:执行代码块 2break; default:n 与 case 1 和 case 2 不同时执行的代码 }工作原理&#xff1a;首先设置表达式 n&#xff08;通常是一个变量&#xff09;。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配&am…...

网站开发培训要多少钱/搜索引擎营销sem

命令&#xff08;Command&#xff09;模式 命令&#xff08;Command&#xff09;模式属于对象的行为模式【GOF95】。命令模式又称为行动&#xff08;Action&#xff09;模式或交易&#xff08;Transaction&#xff09;模式。命令模式把一个请求或者操作封装到一个对象中。命令模…...