Day28:ElasticSearch入门、Spring整合ES、开发社区搜索功能

ElasticSearch入门

Elasticsearch简介

  • 一个分布式的、Restful风格的搜索引擎。
  • 支持对各种类型的数据的检索(非结构化的也可以)。
  • 搜索速度快,可以提供实时的搜索服务。
  • 便于水平扩展(集群式部署),每秒可以处理PB级海量数据。

Elasticsearch术语

  • 索引(数据库,6.0后对应表)、类型(表)、文档(行)、字段(列)。
  • 集群、节点、分片、副本。

安装es服务器

docker部署见https://git.lug.ustc.edu.cn/Iris666/elastic-kg/-/tree/main?ref_type=heads

先用docker部署,不行再直接安装

为了简单,还是直接安装了ES,就是解压压缩包,

打开config/elasticsearch.yml文件改配置:

cluster.name: nowcoder
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
#node.name: node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /Users/iris/items/elasticsearch-8.13.2/data
#
# Path to log files:
#
path.logs: /Users/iris/items/elasticsearch-8.13.2/logs

然后把二进制程序添加到环境变量

vim ~/.bash_profile
export PATH=$PATH:/path/to/elasticsearch/bin
source ~/.bash_profile

再mac上直接运行es会报错,说jdk来路不明,方法是暂时关闭检查,用下面的命令:

sudo spctl --master-disable

为了安全用完后再打开:

sudo spctl --master-enable

安装中文分词插件

bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.13.2

(docker版本exec进container里面装插件)

版本要和es的版本严格对应。不然报错,之后会将插件存储在es/plugins路径下

使用postman发送HTTP请求

https://web.postman.co/workspace/My-Workspace~d9b1f35d-f6ed-4467-8496-6d08f79c506f/request/create?requestId=f3e969ea-9f37-4428-b3fa-6f0a40ec2837

注册账号模拟发送HTTP请求

通过命令行访问es

在命令行中键入:

curl -X GET "http://localhost:9200/_cluster/settings?pretty"

查看状态,但是报错empty,原因是es默认SSL开的,所以http过不去,解决方法是在config中将:

xpack.security.enabled: false

运行结果如下:

{"error" : {"root_cause" : [{"type" : "security_exception","reason" : "missing authentication credentials for REST request [/_cluster/settings?pretty]","header" : {"WWW-Authenticate" : ["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}}],"type" : "security_exception","reason" : "missing authentication credentials for REST request [/_cluster/settings?pretty]","header" : {"WWW-Authenticate" : ["Basic realm=\"security\" charset=\"UTF-8\"","ApiKey"]}},"status" : 401
}

接着报错,原因是curl的时候要-u传入用户名和密码,但是之前的已经忘了,重新创建个用户:

./elasticsearch-users useradd your_username -p your_password -r superuser
curl -u ***:password -X GET "http://localhost:9200/_cluster/settings?pretty"  
health status index                             uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   average_annual_wage               kqix1Pp7SiaUDtwWYNnELQ   1   1        785            0     56.8kb         56.8kb
green  open   .monitoring-es-7-2024.03.26       JtNGXpQYSvqBsClZtT8jdw   1   0      61371            0     24.7mb         24.7mb
green  open   .monitoring-es-7-2024.03.25       bHqBijFKQPy-S8aIXz_NQw   1   0      39185            0     16.2mb         16.2mb
green  open   .monitoring-kibana-7-2024.03.26   3vMGC8z5TJibwdTi1s0yOA   1   0       8178            0      1.7mb          1.7mb
yellow open   jobsearch                         9ekhjB0bQ4m3KKai8WmpFw   2   1      10661            0    161.4mb        161.4mb
green  open   .monitoring-kibana-7-2024.03.25   uY_wWKlGR1KgWdbUgSjHfw   1   0       6698            0      1.5mb          1.5mb
green  open   .monitoring-logstash-7-2024.03.25 VUJRgqRlSx-pDUr84z-QkA   1   0      39399            0        2mb            2mb
green  open   .monitoring-kibana-7-2024.03.27   sbMuIju9STCrPVuYLiQHzQ   1   0        230            0    126.4kb        126.4kb
green  open   .monitoring-kibana-7-2024.04.28   VPE9IIJLQrGHcjRt1GYvxA   1   0        338            0    254.6kb        254.6kb
yellow open   logstash-test_log-index           5dKT09aNRM-8GxjycBsH1Q   1   1         37            0     66.7kb         66.7kb
green  open   .monitoring-logstash-7-2024.03.27 GRmZTJ2XToyn5LDO6d8Xow   1   0       1380            0    200.5kb        200.5kb
green  open   .monitoring-logstash-7-2024.04.28 xvBwhA2pRkmKZYEpEacV3g   1   0       1583            0    317.9kb        317.9kb
green  open   .monitoring-logstash-7-2024.03.26 XhRvHVWdTu2klG5Gi78TLQ   1   0      48972            0      2.2mb          2.2mb
green  open   .monitoring-es-7-2024.03.27       l3k6wMcUToeToGVI5X1FkA   1   0       2155         3335      1.9mb          1.9mb
green  open   .monitoring-es-7-2024.04.28       DVXGvGDQSlaLB4CQYMbNkg   1   0        887           64    711.3kb        711.3kb

(发现之前弄的都是yellow,不知道为什么)

使用PostMan发请求

image

创建索引test PUT:

image

删除索引 DELETE:

image

提交数据(文档)PUT

image

查数据GET

image

删除文档 DELETE

image

搜索_search GET

image

image

多个字段逐层匹配:复合json查询

image

{"query":{"multi_match":{"query":"互联网","fields":["title", "content"]}}
}

Spring整合ES

引入依赖

  • spring-boot-starter-data-elasticsearch

配置Elasticsearch

  • cluster-name、cluster-nodes

Spring Data Elasticsearch API

  • ElasticsearchTemplate
  • ElasticsearchRepository

引入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置es

# Elasticsearch Properties
spring.elasticsearch.rest.uris=http://localhost:9200
#spring.data.elasticsearch.cluster-nodes=localhost:9300

解决netty冲突

在CommunityApplication.java中添加:在项目构建前运行。

@PostConstruct
public void init() {// 解决netty启动冲突问题// see Netty4Utils.setAvailableProcessors()System.setProperty("es.set.netty.runtime.available.processors", "false");
}

实现搜索功能

配置表和es索引的关系

在要搜索的实体类disscussPost中添加如下注解:

@Document(indexName = "discusspost")
public class DiscussPost {@Idprivate int id;@Field(type = FieldType.Integer)private int userId;//analyzer:存储时的分词器,searchAnalyzer:搜索时的分词器@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private String title;@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private String content;@Field(type = FieldType.Integer)private int type;@Field(type = FieldType.Integer)private int status;@Field(type = FieldType.Date)private java.util.Date createTime;@Field(type = FieldType.Integer)private int commentCount;@Field(type = FieldType.Double)private double score;...
}

配置Elasticsearch Reposity

在dao下创建子包elasticsearch,并添加接口DiscussPostRepository:

package com.newcoder.community.dao.elasticsearch;import com.newcoder.community.entity.DiscussPost;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface DiscussPostRepository  extends ElasticsearchRepository<DiscussPost, Integer> {;
}
  • Repository是Spring提供的用于数据访问层的注解;
  • 只需继承ElasticsearchRepository即可;
  • 需要范形。DiscussPost目标实体类型,Integer主键类型

测试

插入帖子
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class ElasticsearchTests {@Autowiredprivate DiscussPostMapper discussMapper;@Autowiredprivate DiscussPostRepository discussRepository;@Autowiredprivate ElasticsearchTemplate elasticTemplate;@Testpublic void testInsert() {discussRepository.save(discussMapper.selectDiscussPostById(241));discussRepository.save(discussMapper.selectDiscussPostById(242));discussRepository.save(discussMapper.selectDiscussPostById(243));}
}

这样从mysql中传入3条数据到es,通过postman发请求看到插入数据成功:

image

批量入多个到es中:
 @Testpublic void testInsertList(){discussRepository.saveAll(discussMapper.selectDiscussPosts(101,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(102,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(103,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(111,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(112,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(131,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(132,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(133,0,100));discussRepository.saveAll(discussMapper.selectDiscussPosts(134,0,100));}
修改帖子:
@Testpublic void testUpdate(){//修改先取出来再存进去DiscussPost post = discussMapper.selectDiscussPostById(231);post.setContent("我是新人gmz,使劲灌水");discussRepository.save(post);}

image

image

删除帖子
    @Testpublic void testDelete(){discussRepository.deleteById(231);}

image

(全删是deleteAll)

搜索帖子(这里版本问题混乱,先跳过)
@Testpublic void matchQuery(){Query query = NativeQuery.builder().withQuery(q -> q.match(m -> m.field("title")//字段.field("content").query("互联网寒冬") //值)).withPageable(Pageable.ofSize(10).withPage(0)).withSort(Sort.by("type").descending()).withSort(Sort.by("score").descending()).withSort(Sort.by("createTime").descending()).build();SearchHits<DiscussPost> searchHits = restTemplate.search(query, DiscussPost.class);// 获得searchHits,进行遍历得到contentList<DiscussPost> posts = new ArrayList<>();
//        System.out.println("总计:" + searchHits.getTotalHits());searchHits.forEach(hit -> {posts.add(hit.getContent());});
//        System.out.println(posts);
//        System.out.println("实际:" + posts.size());}

开发社区搜索功能

搜索服务

  • 将帖子保存至Elasticsearch服务器。 - 从Elasticsearch服务器删除帖子。
  • 从Elasticsearch服务器搜索帖子。

发布事件(表现层)

  • 发布帖子时,将帖子异步的提交到Elasticsearch服务器。
  • 增加评论时,将帖子异步的提交到Elasticsearch服务器(相当于修改帖子 )。
  • 在消费组件中增加一个方法,消费帖子发布事件。

显示结果(动态模版)#

  • 在控制器中处理搜索请求,在HTML上显示搜索结果。

搜索服务

首先解决一个问题,在DiscussPostMapper中insert方法添加KeyPropety:

 <insert id="insertDiscussPost" parameterType="DiscussPost" keyProperty="id">insert into discuss_post (<include refid="insertFields"></include>)values (#{userId}, #{title}, #{content}, #{type}, #{status}, #{createTime}, #{commentCount}, #{score})</insert>

(不然主键无法映射到实体类)

然后编写service类:

@Service
public class ElasticsearchService {@Autowiredprivate DiscussPostRepository discussPostRepository;@Autowiredprivate ElasticsearchTemplate restTemplate;public void saveDiscussPost(DiscussPost post) {discussPostRepository.save(post);}public void deleteDiscussPost(int id) {discussPostRepository.deleteById(id);}public ArrayList<DiscussPost> searchDiscussPost(String keyword, int current, int limit) {Query query = NativeQuery.builder().withQuery(q -> q.match(m -> m.field("title")//字段.field("content").query(keyword) //值)).withPageable(Pageable.ofSize(limit).withPage(current)).withSort(Sort.by("type").descending()).withSort(Sort.by("score").descending()).withSort(Sort.by("createTime").descending()).build();SearchHits<DiscussPost> searchHits = restTemplate.search(query, DiscussPost.class);// 获得searchHits,进行遍历得到contentArrayList<DiscussPost> posts = new ArrayList<>();
//        System.out.println("总计:" + searchHits.getTotalHits());searchHits.forEach(hit -> {posts.add(hit.getContent());});
//        System.out.println(posts);
//        System.out.println("实际:" + posts.size());return posts;}}

表现层:发布事件

发帖触发

DiscussPostController->addDiscussPost:

discussPostService.addDiscussPost(post);//发帖子之后,触发发帖事件,将帖子存入es服务器Event event = new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(post.getId());eventProducer.fireEvent(event);// 报错的情况,将来统一处理.
///

评论触发

CommentController→ addComment

 //触发发帖时间,存到es服务器if(comment.getEntityType() == ENTITY_TYPE_POST) {event = new Event().setTopic(TOPIC_PUBLISH).setUserId(comment.getUserId()).setEntityType(ENTITY_TYPE_POST).setEntityId(discussPostId);eventProducer.fireEvent(event);}

消费事件

EventConsumer:

//消费发帖事件
@KafkaListener(topics = {TOPIC_PUBLISH})
public void handlePublishMessage(ConsumerRecord record){if(record == null || record.value() == null){logger.error("消息的内容为空");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if(event == null){logger.error("消息格式错误");return;}//查询帖子DiscussPost post = discussPostService.findDiscussPostById(event.getEntityId());//存入eselasticsearchService.saveDiscussPost(post);}

控制层查询数据

@Controller
public class SearchController implements CommunityConstant {@Autowiredprivate ElasticsearchService elasticsearchService;@Autowiredprivate UserService userService;@Autowiredprivate LikeService likeService;//search?keyword=xxx@RequestMapping(path = "/search", method = RequestMethod.GET)public String search(String keyword, Page page, Model model) {//搜索帖子ArrayList<DiscussPost> searchResult = elasticsearchService.searchDiscussPost(keyword, page.getCurrent() - 1, page.getLimit());//处理数据聚合数据List<Map<String,Object>> discussPosts = new ArrayList<>();if(searchResult != null){for(DiscussPost post : searchResult){Map<String,Object> map = new HashMap<>();//帖子map.put("post",post);//作者map.put("user",userService.findUserById(post.getUserId()));//点赞数量map.put("likeCount",likeService.findEntityLikeCount(ENTITY_TYPE_POST,post.getId()));discussPosts.add(map);}}//传入模版model.addAttribute("discussPosts",discussPosts);model.addAttribute("keyword",keyword);//分页信息page.setPath("/search?keyword=" + keyword);page.setRows(searchResult == null ? 0 : searchResult.size());return "/site/search";}}

修改模版

修改index.html的header

<!-- 搜索 -->
<form class="form-inline my-2 my-lg-0" method="get" th:action="@{/search}"><input class="form-control mr-sm-2" type="search" aria-label="Search" name="keyword" th:value="${keyword}"/><button class="btn btn-outline-light my-2 my-sm-0" type="submit">搜索</button>
</form>

修改search.html

<li class="media pb-3 pt-3 mb-3 border-bottom" th:each="map:${discussPosts}"><img th:src="${map.user.headerUrl}" class="mr-4 rounded-circle" alt="用户头像"><div class="media-body"><h6 class="mt-0 mb-3"><a th:href="@{|/discuss/detail/${map.post.id}|}" th:utext="${map.post.title}">备战<em>春招</em>,面试刷题跟他复习,一个月全搞定!</a></h6><div class="mb-3" th:utext="${map.post.content}">金三银四的金三已经到了,你还沉浸在过年的喜悦中吗? 如果是,那我要让你清醒一下了:目前大部分公司已经开启了内推,正式网申也将在3月份陆续开始,金三银四,<em>春招</em>的求职黄金时期已经来啦!!! 再不准备,作为19应届生的你可能就找不到工作了。。。作为20届实习生的你可能就找不到实习了。。。 现阶段时间紧,任务重,能做到短时间内快速提升的也就只有算法了, 那么算法要怎么复习?重点在哪里?常见笔试面试算法题型和解题思路以及最优代码是怎样的? 跟左程云老师学算法,不仅能解决以上所有问题,还能在短时间内得到最大程度的提升!!!</div><div class="text-muted font-size-12"><u class="mr-3" th:utext="${map.user.username}">寒江雪</u>发布于 <b th:text="${#dates.format(map.post.createTime,'yyyy-MM-dd HH:mm:ss')}">2019-04-15 15:32:18</b><ul class="d-inline float-right"><li class="d-inline ml-2"><i th:text = "${map.likeCount}"></i></li><li class="d-inline ml-2">|</li><li class="d-inline ml-2">回复 <i th:text = "${map.post.commentCount}"></i></li></ul></div></div>
</li>

测试效果

image

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

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

相关文章

一文读懂计算机视觉4大任务:分类任务、检测任务、目标分割任务、关键点检测任务

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

算法系列--多源BFS问题

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如&#xff1a;忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中&#xff0c;你可以通过以下步骤来修改文件夹的svn:ignore属性&#xff1a; 打开Windows资源管理器&#xff0c;导航到你的工作副本中的Assets\Stre…

VMware虚拟机问题解决方案

1、运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2、卸载VMware的步骤 1&#xff09;卸载已经安装的VMware 从控制面…

8G防火墙,WAF防火墙,可抵御各种恶意请求、恶意机器人、攻击防御

8G防火墙&#xff0c;WAF防火墙&#xff0c;可抵御各种恶意请求、恶意机器人、攻击防御 经过一年多的 beta 测试&#xff0c;8G 防火墙已准备好在生产现场使用。因此&#xff0c;您可以受益于 nG 防火墙&#xff08;又名 nG 黑名单&#xff09;的最新发展提供的强大保护。8G 防…

源代码防泄露可以通过哪些方法实现?七种有效方法分享

在当今数字化时代&#xff0c;访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境&#xff0c;层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时&#xff0c;更需要一种综合的…

iOS审核被拒 无法添加以供审核 要开始审核流程,必须提供以下项目

iOS审核被拒 最近有小伙伴反馈上架被拒&#xff0c;提示如下&#xff1a; 无法添加以供审核 要开始审核流程&#xff0c;必须提供以下项目 提交以供审核时遇到意外错误。如果问题仍然存在&#xff0c;请联系我们 后来小伙伴解决方案是&#xff1a;把备案号大写改为小写。 竟…

Ansible自动化工具模块调用与playbook编写

目录 一、Ansible工作机制与特点 &#xff08;一&#xff09;Ansible工作机制 1. 初始化与配置 2. 编写Playbook 3. 调用模块 4. 加密敏感数据 5. 执行Playbook 6. 收集执行结果 7. 错误处理与回滚 8. 反馈与报告 &#xff08;二&#xff09;Ansible 的主要特点包括…

Java并发编程: Synchronized锁升级

文章目录 一、jdk8 markword实现表二、使用工具来查看锁升级 一、jdk8 markword实现表 new -> 偏向锁 -> 轻量级锁&#xff08;自旋锁、自适应自旋锁&#xff09;-> 重量级锁&#xff1a; 偏向锁和轻量级锁都是用户空间完成的。重量级锁是需要向内核申请的。 synchr…

深度学习之基于Matlab神经网络的活体人脸和视频人脸识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 人脸识别技术作为生物识别技术的一种&#xff0c;近年来得到了广泛的关注和应用。与传统的身份认证方…

高素质高学历婚恋相亲交友平台有哪些?分享我的网上找对象成功脱单经历!

尽管觉得在社交软件上找到真爱的可能性很小&#xff0c;但我却时常看到别人成功的案例&#xff0c;这也让我跃跃欲试了。没想到&#xff0c;我真的成功了&#xff01;以下是我亲身使用过的一些方法&#xff0c;在此与大家分享&#xff0c;仅供参考哦&#xff01; &#x1f449;…

新手做抖音小店多久能出单?新手抖音小店出单秘籍!出单教程必看

大家好&#xff0c;我是电商花花。 现阶段还是有很多朋友加入到抖音电商行业&#xff0c;因为抖音小店上还隐藏很多的红利和市场&#xff0c;很多新手开店后第一个问题就是&#xff0c;店铺开通后&#xff0c;一般多久能出单&#xff1f; 多久能出单&#xff0c;其实更看重的…

深入学习和理解Django视图层:处理请求与响应

title: 深入学习和理解Django视图层&#xff1a;处理请求与响应 date: 2024/5/4 17:47:55 updated: 2024/5/4 17:47:55 categories: 后端开发 tags: Django请求处理响应生成模板渲染表单处理中间件异常处理 第一章&#xff1a;Django框架概述 1.1 什么是Django&#xff1f;…

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)1.13 梯度检验&#…

IT 项目管理介绍和资料汇总

IT项目管理到底是什么&#xff1f;是对组织承担的任何信息技术项目的成功监督。IT项目经理负责规划、预算、执行、领导、故障排除和维护这些项目。IT项目经理可能会做的事情包括&#xff1a; 1、硬件安装 2、软件、网站和应用程序开发 3、网络和云计算解决方案的升级和/或推出…

非平衡数据处理-Tomek link算法介绍,代码和实战测评

作者Toby&#xff0c;来源公众号&#xff1a;Python风控模型&#xff0c;非平衡数据处理-Tomek link算法 概述 非平衡数据在金融风控领域、反欺诈客户识别、广告智能推荐和生物医疗中普遍存在。一般而言&#xff0c;不平衡数据正负样本的比例差异极大&#xff0c;如在Kaggle竞…

20240503安装HEVC解码器播放H265格式的8K视频

20240503安装HEVC解码器播放H265格式的8K视频 2024/5/3 9:55 缘起&#xff1a;由于youtube支持8K视频了&#xff0c;想尝尝鲜&#xff01; 主摄像头当然是选择SONY的【夜摄/弱光场景】&#xff0c;根据优选&#xff0c;小米&#xff08;MI&#xff09;13Ultra 最佳了。 在开始播…

jenkins目录下的vue3项目——pnpm install后运行报错——奇葩问题解决

昨天到今天&#xff0c;同事那边遇到一个问题&#xff0c;就是关于vue3vite的项目&#xff0c;在执行了自动打包后&#xff0c;运行代码会提示报错的问题。 报错信息如下&#xff1a; 具体错误信息如下&#xff1a; ERROR 11:28:14 [vite] Pre-transform error: Cannot find …

深入探究TCP/IP协议

一、引言 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。本文将深入探讨TCP/IP协议的概念、特点、组成、相关协…