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 {
    @Id
    private 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 {
    @Autowired
    private DiscussPostMapper discussMapper;

    @Autowired
    private DiscussPostRepository discussRepository;

    @Autowired
    private ElasticsearchTemplate elasticTemplate;

    @Test
    public void testInsert() {
        discussRepository.save(discussMapper.selectDiscussPostById(241));
        discussRepository.save(discussMapper.selectDiscussPostById(242));
        discussRepository.save(discussMapper.selectDiscussPostById(243));
    }
}

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

image

批量入多个到es中:
 @Test
    public 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));
    }
修改帖子:

    @Test
    public void testUpdate(){//修改先取出来再存进去
        DiscussPost post = discussMapper.selectDiscussPostById(231);
        post.setContent("我是新人gmz,使劲灌水");
        discussRepository.save(post);
    }

image

image

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

image

(全删是deleteAll)

搜索帖子(这里版本问题混乱,先跳过)
@Test
    public 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,进行遍历得到content
        List<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 {
    @Autowired
    private DiscussPostRepository discussPostRepository;

    @Autowired
    private 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,进行遍历得到content
        ArrayList<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());
    //存入es
    elasticsearchService.saveDiscussPost(post);
    
}

控制层查询数据

@Controller
public class SearchController implements CommunityConstant {
    @Autowired
    private ElasticsearchService elasticsearchService;

    @Autowired
    private UserService userService;

    @Autowired
    private 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享三维地理模型制作实践

前言 地理信息系统&#xff08;GIS&#xff09;是一种用于捕获、存储、检查和显示与地球表面位置相关的数据的计算机系统。GIS可以在一张地图上显示许多不同类型的数据&#xff0c;如街道、建筑物和植被。这使人们能够更容易地看到、分析和理解模式和关系。 实践 从地理空间…

正在载入qrc文件 指定的qrc文件无法找到。您想更新这个文件的位置么?

打开Qt的ui文件&#xff0c;弹出提示框 如果需要用到qrc文件&#xff0c;选择Yes&#xff0c;再选择qrc文件所在的位置&#xff1b;如果不需要qrc文件&#xff0c;可以选择No&#xff0c;然后用普通文本编辑器打开&#xff0c;将“ <resources> <include location&q…

经典面试题---环形链表

1. 环形链表1. - 力扣&#xff08;LeetCode&#xff09; 要解决这道题&#xff0c;我们首先要挖掘出带环的链表与不带环的链表之间的差别。 以此&#xff0c;才能设计出算法来体现这种差别并判断。 二者最突出的不同&#xff0c;就是不带环的链表有尾结点&#xff0c;也就是说…

Golang | Leetcode Golang题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后&#xff0c;就通过启动一个用户级程序init的方式&#xff0c;完成引导进程。 启动的代码init.c中的main函数执行过程&#xff1a;system\core\init.c中&#xff1a; 主要下面两个重要的过程&#xff1a; 1…

泰克示波器如何存储CSV文件?

泰克示波器可以用于各种信号的测量和分析。在实际测试中&#xff0c;我们经常需要将示波器采集到的波形数据保存下来&#xff0c;以便后续的处理和分析。泰克示波器提供了多种方法来存储波形数据&#xff0c;其中一种常用的方式是将数据保存为CSV文件。下面将介绍泰克示波器如何…

VINS预积分与误差模型

文章目录 IMU的测量值误差模型IMU预积分真实模型IMU预积分估计模型误差模型普通增量积分中值积分法 参考文献 IMU的测量值误差模型 IMU的测量值误差模型&#xff1a; a ^ t a t R w t g w b a t n a t ω ^ t ω t b ω t n ω t \begin{array}{} {{{\hat a}_t} {a_t…

成功案例(IF=7.3)| 转录组+蛋白质组+代谢组联合分析分析揭示胰腺癌中TAM2相关的糖酵解和丙酮酸代谢重构

研究背景 肿瘤的进展和发展需要癌细胞的代谢重编程&#xff0c;癌细胞能量代谢模式的改变可以满足快速增殖和适应肿瘤微环境的需要。肿瘤微环境&#xff08;TME&#xff09;中的代谢状态受到多种因素的影响&#xff0c;包括血管生成、与其他细胞的相互作用和系统代谢。代谢异质…

Python中批量提取[]括号内第一个元素的四种方法

目录 一、引言 二、方法介绍 使用正则表达式&#xff08;Regular Expression&#xff09; 使用字符串分割&#xff08;String Split&#xff09; 使用ast模块解析字符串为列表 使用JSON模块解析字符串 三、方法比较与选择 四、总结 一、引言 在Python数据处理过程中&a…

探索1688、淘宝、京东搜索商品聚合API接口:一站式电商搜索解决方案

随着电商行业的不断发展&#xff0c;电商平台的数量和商品种类都在快速增长。商家和开发者在运营过程中&#xff0c;需要经常进行跨平台的商品搜索和数据分析。然而&#xff0c;由于各个电商平台的数据接口存在差异&#xff0c;直接对接多个平台不仅效率低下&#xff0c;而且维…

仓库管理员如何入门?仓库管理六大步骤教会你!

新手菜鸟入行&#xff0c;如何做好一个仓库管理员&#xff1f;仓库运营对于许多行业至关重要&#xff0c;例如制造、零售和物流。它们涉及高效、安全地接收、仓储、拣选、包装和运输货物。 跟着这6个步骤做&#xff0c;最慢一个月&#xff0c;最快一周&#xff0c;就能轻松做好…

42.乐理基础-拍号-看懂拍号的意义

到这必然是已经知道 X、Y的意思了&#xff1a; 然后带入数字&#xff1a; 然后念拍号的时候&#xff0c;在国内&#xff0c;百分之九十的地方是从下往上念&#xff0c;念作四二拍&#xff0c;还有百分之十的地方是和国外一样&#xff0c;从上往下念&#xff0c;念作二四拍&…

GPS与精致农业 无人机应用 农业遥感 农业类

全球定位系统是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。GPS系统最基本的特点是以“多星、高轨、高频、测量-测距”为体制&#xff0c;以高精度的原子钟为核心。GPS作为新一代卫星导航与定位系统&#xff0c;不仅具有全球性、全…

大模型外推能力

一、目录 定义如何提高模型的外推能力&#xff1f;分类测评方法各技术点&#xff0c;以及应用模型&#xff0c;优缺点支持模型长上下文的方案「NTK-aware interpolation」的思路是什么&#xff1f;LLM长度外推方案NTK-by-parts的思路是什么&#xff1f;LLM长度外推方案YaRN是怎…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式&#xff1a; 局部注册&#xff1a;只能在注册的组件内使用。使用方法&#xff1a;创建.vue文件&#xff0c;在使用的组件内导入并注册。…

编程语言QT、C++、C#、Matlab、SQL Server开发日志总结

目录 引言 正文 1、Qt连接SQL server数据库 2、C#使用chart绘制实时折线图&#xff0c;波形 3、ORACLEXE数据库 4、QT通过ODBC驱动连接Oracle数据库 5、Microsoft SQL Server 2014 安装图解 6、SQL Server 2014应用 7、C/C​​​​​​​ 8、QT…

vue2后台管理项目

一:项目准备 1)拉取模板代码 远程仓库复制到本地仓库. 2)安装后的项目 路径 code 文件夹 会打开vscode的文件夹. 3)安装vetur和eslint插件可以保存时自动修改不规范的地方. 4)App内有一级路由,路由组件导入如果是layout架子,会导入的是文件夹下的index.js没有则导入index.v…

深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构

大家好,我是微学AI,今天给大家介绍一下深度学习实战76-基于目标检测YOLOv5模型的迁移学习使用方法,YOLOv5的原理与结构。YOLOv5(You Only Look Once version 5)是一种先进的目标检测算法,基于深度学习的单阶段目标检测模型。它的主要原理是通过一次前向传播就同时预测图像…

【Python】字典题

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

6、随机森林(Random forests)

Random forests started a revolution in machine learning 20 years ago. For the first time, there was a fast and reliable algorithm which made almost no assumptions about the form of the data, and required almost no preprocessing. In today’s lesson, you’ll…