SpringBoot2.2.0.RELEASE整合Elasticsearch6.8.3

news2024/11/15 19:48:19

SpringBoot2.2.0.RELEASE整合Elasticsearch6.8.3

SpringBoot是2.2.0.RELEASE,elasticsearch是6.8.3

使用依赖spring-boot-starter-data-elasticsearch

使用ElasticSearchRepository操作

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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-boot-elasticsearch5</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-elasticsearch5</name>
    <description>spring-boot-elasticsearch5</description>
    <properties>
        <java.version>1.8</java.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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、配置文件

spring:
  elasticsearch:
    rest:
      uris: http://192.168.94.186:9200

3、创建索引的实体类

package com.example.search.entity;

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Map;

/**
 * 1.创建索引
 * 2.创建类型
 * 3.创建文档
 * 4.字段的映射(是否分词,是否索引,是否存储,数据类型是什么,分词器是什么)
 * indexName 指定创建的索引的名称
 * type :指定索引中的类型
 */

@Getter
@Setter
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "shop_info", type = "docs")
public class ShopInfo implements Serializable {

    @Id
    @Field(type = FieldType.Text)
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String name;

    @Field(type = FieldType.Double)
    private Double price;

    @Field(type = FieldType.Keyword)
    private String categoryName;

    @Field(type = FieldType.Keyword)
    private String brandName;

    @Field(type = FieldType.Keyword)
    private String spec;

    // -ES能够自动存储未提交创建字段信息的数据
    // 目的:未指定时ES为了可以更好的支持聚合和查询功能,所以默认创建了两种
    // 对于未提前指定类型的字段,使用以下默认规则
    //  [字段](text)   		  #分词不聚合
    //  [字段].keyword(keyword) #聚合不分词
    private Map<String, Object> specMap;

}
package com.example.search.entity;

import lombok.*;

import java.util.Map;

/**
 * 查询数据的封装
 */
@Getter
@Setter
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShopVO {

    private Long id;

    private String name;

    private Double price;

    private String categoryName;

    private String brandName;

    private String spec;

    private Map<String, Object> specMap;
}

4、ShopEsMapper

package com.example.search.dao;

import com.example.search.entity.ShopInfo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

@Component
public interface ShopEsMapper extends ElasticsearchRepository<ShopInfo, Long> {
}

5、Service

package com.example.search.service;

import java.util.Map;

public interface ShopSearchService {

    /**
     * 1.查询符合条件的shop的数据
     * 2.调用spring data elasticsearch的API导入到ES中
     */
    void importEs();

    /**
     * 进行查询
     *
     * @param searchMap
     * @return
     */
    Map search(Map<String, String> searchMap);

    /**
     * 创建索引
     */
    boolean createIndex();

    /**
     * 删除索引
     */
    boolean deleteIndex();

}
package com.example.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.example.search.dao.ShopEsMapper;
import com.example.search.entity.ShopInfo;
import com.example.search.entity.ShopVO;
import com.example.search.service.ShopSearchService;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;

@Service
public class ShopSearchServiceImpl implements ShopSearchService {

    @Autowired
    private ShopEsMapper shopEsMapper;

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public void importEs() {
        // 1.查询符合条件的shop的数据
        // 这里正常是从数据库中查询数据
        // 现在只是测试,只添加两条数据
        List<ShopVO> shopVOList = new ArrayList<>();
        Map<String, Object> specMap = new HashMap<>();
        specMap.put("颜色", "白色");
        specMap.put("内存", "64G");
        specMap.put("硬盘", "1T");
        specMap.put("待机", "8h");
        shopVOList.add(new ShopVO(1L, "华为手机", 2000.0, "手机", "华为", "{\"内存\":\"64G\",\"颜色\":\"白色\"}", specMap));
        shopVOList.add(new ShopVO(2L, "小米电脑", 3000.0, "电脑", "小米", "{\"硬盘\":\"1T\",\"颜色\":\"金色\"}", specMap));
        // 将shopVO的列表转换成es中的ShopInfo的列表
        List<ShopInfo> shopInfoList = JSON.parseArray(JSON.toJSONString(shopVOList), ShopInfo.class);
        // 2.调用spring data elasticsearch的API导入到ES中
        shopEsMapper.saveAll(shopInfoList);
    }

    /**
     * @param searchMap
     */
    @Override
    public Map search(Map<String, String> searchMap) {
        // 1.获取到关键字
        String keywords = searchMap.get("keywords");
        // 2.判断是否为空,如果为空给一个默认值:华为
        // 查询所有
        // SELECT * FROM shop WHERE name LIKE '%手机%';
        if (StringUtils.isEmpty(keywords)) {
            keywords = "华为";
        }
        // 3.创建查询构建对象
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        // 4.设置查询的条件
        // SELECT categoryName FROM shop WHERE name LIKE '%手机%' GROUP BY categoryName;
        // 4.1商品分类的列表展示: 按照商品分类的名称来分组
        // terms:指定分组的一个别名
        // field:指定要分组的字段名
        // size:指定查询结果的数量,默认是10个
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopCategoryGroup").field("categoryName.keyword").size(50));
        // 4.2商品的品牌的列表展示,按照商品品牌来进行分组
        // SELECT brandName FROM shop WHERE name LIKE '%手机%' GROUP BY brandName;
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopBrandGroup").field("brandName.keyword").size(100));
        // 4.3商品的规格的列表展示,按照商品的规格的字段spec进行分组
        // SELECT spec FROM shop WHERE name LIKE '%手机%' GROUP BY spec;
        // 规则要求字段是一个keyword类型的,spec.keyword
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("shopSpecGroup").field("spec.keyword").size(500));
        // 4.4设置高亮的字段,设置前缀和后缀
        // 设置高亮的字段,针对商品的名称进行高亮
        nativeSearchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("name"));
        // 设置前缀和后缀
        nativeSearchQueryBuilder.withHighlightBuilder(new HighlightBuilder().preTags("<em style=\"color:red\">").postTags("</em>"));
        // 匹配查询:先分词,再查询,主条件查询
        // 参数1:指定要搜索的字段
        // 参数2:要搜索的值(先分词,再搜索)
        // 从单个字段搜索数据
        // nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", keywords));
        // 从多个字段中搜索数据,参数1为关键字,后面的参数为所有的字段
        nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(keywords, "name", "categoryName", "brandName"));
        //========================过滤查询开始=====================================
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        // 4.4 过滤查询的条件设置
        // 商品分类的条件
        String category = searchMap.get("category");
        if (!StringUtils.isEmpty(category)) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("categoryName", category));
        }
        // 4.5 过滤查询的条件设置
        // 商品品牌的条件
        String brand = searchMap.get("brand");
        if (!StringUtils.isEmpty(brand)) {
            boolQueryBuilder.filter(QueryBuilders.termQuery("brandName", brand));
        }
        //4.6 过滤查询的条件设置
        // 规格条件
        if (searchMap != null) {
            //{ spec_网络:"电信4G",spec_顔色:"黑色"}
            for (String key : searchMap.keySet()) {
                if (key.startsWith("spec_")) {
                    //截取规格的名称
                    boolQueryBuilder.filter(QueryBuilders.termQuery("specMap." + key.substring(5) + ".keyword", searchMap.get(key)));
                }
            }
        }
        // 4.7 过滤查询的条件设置
        // 价格区间的过滤查询
        // 0-500  3000-*
        String price = searchMap.get("price");
        if (!StringUtils.isEmpty(price)) {
            //获取值 按照- 切割
            String[] split = price.split("-");
            //过滤范围查询
            //0<=price<=500
            if (!split[1].equals("*")) {
                boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").from(split[0], true).to(split[1], true));
            } else {
                boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(split[0]));
            }
        }
        //过滤查询
        nativeSearchQueryBuilder.withFilter(boolQueryBuilder);
        //========================过滤查询结束=====================================
        // 分页查询
        // 第一个参数:指定当前的页码  注意: 如果是第一页 数值为0
        // 第二个参数:指定当前的页的显示的行
        String pageNum1 = searchMap.get("pageNum");
        Integer pageNum = Integer.valueOf(pageNum1);
        String pageSize1 = searchMap.get("pageSize");
        Integer pageSize = Integer.valueOf(pageSize1);
        nativeSearchQueryBuilder.withPageable(PageRequest.of(pageNum - 1, pageSize));
        // 排序操作
        // 获取排序的字段 和要排序的规则
        // price
        String sortField = searchMap.get("sortField");
        // DESC ASC
        String sortRule = searchMap.get("sortRule");
        if (!StringUtils.isEmpty(sortField) && !StringUtils.isEmpty(sortRule)) {
            // 执行排序
            nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField).order(sortRule.equalsIgnoreCase("ASC") ? SortOrder.ASC : SortOrder.DESC));
            // nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField).order(SortOrder.valueOf(sortRule)));
        }
        // 5.构建查询对象(封装了查询的语法)
        NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
        //6.执行查询
        AggregatedPage<ShopInfo> shopInfos = elasticsearchRestTemplate.queryForPage(nativeSearchQuery, ShopInfo.class, new SearchResultMapperImpl());
        // 6.2 获取聚合分组结果  获取商品分类的列表数据
        Terms stringTermsCategory = (Terms) shopInfos.getAggregation("shopCategoryGroup");
        List<String> categoryList = getStringsCategoryList(stringTermsCategory);
        //6.3 获取 品牌分组结果 列表数据
        Terms stringTermsBrand = (Terms) shopInfos.getAggregation("shopBrandGroup");
        List<String> brandList = getStringsBrandList(stringTermsBrand);
        //6.4 获取 规格的分组结果 列表数据map
        Terms stringTermsSpec = (Terms) shopInfos.getAggregation("shopSpecGroup");
        Map<String, Set<String>> specMap = getStringSetMap(stringTermsSpec);
        //7.获取结果
        // 返回map
        //当前的页的集合
        List<ShopInfo> content = shopInfos.getContent();
        //总页数
        int totalPages = shopInfos.getTotalPages();
        //总记录数
        long totalElements = shopInfos.getTotalElements();
        Map<String, Object> resultMap = new HashMap<>();
        //商品分类的列表数据
        resultMap.put("categoryList", categoryList);
        //商品品牌的列表数据
        resultMap.put("brandList", brandList);
        //商品规格的列表数据展示
        resultMap.put("specMap", specMap);
        resultMap.put("rows", content);
        resultMap.put("total", totalElements);
        resultMap.put("totalPages", totalPages);
        resultMap.put("pageNum", pageNum);
        resultMap.put("pageSize", pageSize);
        return resultMap;
    }

    @Override
    public boolean createIndex() {
        // 创建索引,会根据ShopInfo类的@Document注解信息来创建
        Boolean aBoolean = elasticsearchRestTemplate.createIndex(ShopInfo.class);
        // 配置映射,会根据ShopInfo类中的id、Field等字段来自动完成映射
        Boolean aBoolean1 = elasticsearchRestTemplate.putMapping(ShopInfo.class);
        System.out.println("创建索引是否成功:" + (aBoolean && aBoolean1));
        return aBoolean && aBoolean1;
    }

    @Override
    public boolean deleteIndex() {
        Boolean aBoolean = elasticsearchRestTemplate.deleteIndex(ShopInfo.class);
        System.out.println("删除索引是否成功:" + aBoolean);
        return aBoolean;
    }

    private Map<String, Set<String>> getStringSetMap(Terms stringTermsSpec) {
        // key :规格的名称
        // value :规格名称对应的选项的多个值集合set
        Map<String, Set<String>> specMap = new HashMap<String, Set<String>>();
        Set<String> specValues = new HashSet<String>();
        if (stringTermsSpec != null) {
            // 1. 获取分组的结果集
            for (Terms.Bucket bucket : stringTermsSpec.getBuckets()) {
                //2.去除结果集的每一行数据()
                // {"手机屏幕尺寸":"5.5寸","网络":"电信4G","颜色":"白","测试":"s11","机身内存":"128G","存储":"16G","像素":"300万像素"}
                String keyAsString = bucket.getKeyAsString();
                System.out.println("keyAsString:" + keyAsString);
                //3.转成JSON 对象  map  key :规格的名称  value:规格名对应的选项的单个值
                Map<String, String> map = JSON.parseObject(keyAsString, Map.class);
                for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
                    //规格名称:手机屏幕尺寸
                    String key = stringStringEntry.getKey();
                    //规格的名称对应的单个选项值 5.5寸
                    String value = stringStringEntry.getValue();
                    //先从原来的specMap中 获取 某一个规格名称 对应的规格的选项值集合
                    specValues = specMap.get(key);
                    if (specValues == null) {
                        specValues = new HashSet<>();
                    }
                    specValues.add(value);
                    //4.提取map中的值放入到返回的map中
                    specMap.put(key, specValues);
                }
            }
        }
        return specMap;
    }

    private List<String> getStringsBrandList(Terms stringTermsBrand) {
        List<String> brandList = new ArrayList<>();
        if (stringTermsBrand != null) {
            for (Terms.Bucket bucket : stringTermsBrand.getBuckets()) {
                //品牌的名称 huawei
                String keyAsString = bucket.getKeyAsString();
                brandList.add(keyAsString);
            }
        }
        return brandList;
    }

    /**
     * 获取分组结果   商品分类的分组结果
     *
     * @param stringTermsCategory
     * @return
     */
    private List<String> getStringsCategoryList(Terms stringTermsCategory) {
        List<String> categoryList = new ArrayList<>();
        if (stringTermsCategory != null) {
            for (Terms.Bucket bucket : stringTermsCategory.getBuckets()) {
                String keyAsString = bucket.getKeyAsString();
                //就是商品分类的数据
                categoryList.add(keyAsString);
            }
        }
        return categoryList;
    }

}
package com.example.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.example.search.entity.ShopInfo;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 自定义结果集映射 ()
 * 目的: 获取高亮的数据
 */

public class SearchResultMapperImpl implements SearchResultMapper {

    @Override
    public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {

        //1.创建一个当前页的记录集合对象
        List<T> content = new ArrayList<>();

        if (response.getHits() == null || response.getHits().getTotalHits() <= 0) {
            return new AggregatedPageImpl<T>(content);
        }

        //搜索到的结果集
        for (SearchHit searchHit : response.getHits()) {
            //每一个行的数据 json的 数据
            String sourceAsString = searchHit.getSourceAsString();
            ShopInfo skuInfo = JSON.parseObject(sourceAsString, ShopInfo.class);
            //key :高亮的字段名  value 就是该字段的高亮的数据集合
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            HighlightField highlightField = highlightFields.get("name");
            //有高亮的数据
            if (highlightField != null) {
                //有高亮的数据
                StringBuffer buffer = new StringBuffer();
                //取高亮的数据
                for (Text text : highlightField.getFragments()) {
                    //高亮的数据  华为 胀奸  5寸  联通2G  白  <em style='color=red>'显示</em>  32G  16G  300万像素
                    String string = text.string();
                    buffer.append(string);
                }
                //有高亮的数据
                skuInfo.setName(buffer.toString());
            }
            content.add((T) skuInfo);

        }
        //2.创建分页的对象 已有
        //3.获取总个记录数
        long totalHits = response.getHits().getTotalHits();
        //4.获取所有聚合函数的结果
        Aggregations aggregations = response.getAggregations();
        //5.深度分页的ID
        String scrollId = response.getScrollId();
        return new AggregatedPageImpl<T>(content, pageable, totalHits, aggregations, scrollId);
    }

    @Override
    public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
        return null;
    }
}

6、启动类

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.example.search.dao")
public class SpringBootElasticsearch5Application {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootElasticsearch5Application.class, args);
    }

}

7、测试

package com.example;

import com.example.search.entity.ShopInfo;
import com.example.search.service.ShopSearchService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@SpringBootTest
class SpringBootElasticsearch5ApplicationTests {

    @Autowired
    private ShopSearchService shopSearchService;

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Test
    void createIndex() {
        shopSearchService.createIndex();
    }

    @Test
    void deleteIndex() {
        shopSearchService.deleteIndex();
    }

    @Test
    void saveData() {
        // 如果没有索引在执行的时候自动会创建索引
        shopSearchService.importEs();
    }

    /**
     * 参数有:
     * keywords
     * category
     * brand
     * spec_
     * price
     * pageNum
     * pageSize
     * sortField
     * sortRule
     */
    @Test
    void search() {
        Map<String, String> map = new HashMap<>();
        map.put("pageNum", "1");
        map.put("pageSize", "1");
        Map resultMap = shopSearchService.search(map);
        log.info(resultMap.toString());
    }

}

7.1 插入数据测试

插入数据前不需要先建立索引,在执行插入的时候会自动建立。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.2 搜索测试

在这里插入图片描述

2022-06-24 15:06:07.992  INFO 15828 --- [           main] SpringBootElasticsearch5ApplicationTests : {total=1, categoryList=[手机], totalPages=1, specMap={颜色=[白色], 内存=[64G]}, pageSize=1, brandList=[华为], rows=[ShopInfo(id=1, name=<em style="color:red"></em><em style="color:red"></em>手机, price=2000.0, categoryName=手机, brandName=华为, spec={"内存":"64G","颜色":"白色"}, specMap={硬盘=1T, 颜色=白色, 内存=64G, 待机=8h})], pageNum=1}

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

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

相关文章

24考研数据结构-数组和特殊矩阵

目录 数据结构&#xff1a;数组与特殊矩阵数组数组的特点数组的用途 特殊矩阵对角矩阵上三角矩阵和下三角矩阵稀疏矩阵特殊矩阵的用途 结论 3.4 数组和特殊矩阵3.4.1数组的存储结构3.4.2普通矩阵的存储3.4.3特殊矩阵的存储1. 对称矩阵(方阵)2. 三角矩阵(方阵)3. 三对角矩阵(方阵…

Meta-Transformer 多模态学习的统一框架

Meta-Transformer是一个用于多模态学习的新框架&#xff0c;用来处理和关联来自多种模态的信息&#xff0c;如自然语言、图像、点云、音频、视频、时间序列和表格数据&#xff0c;虽然各种数据之间存在固有的差距&#xff0c;但是Meta-Transformer利用冻结编码器从共享标记空间…

【嵌入式学习笔记】嵌入式基础11——STM32常用轮子(SYSTEM)

1.deley文件夹介绍 1.1.delay文件夹介绍 函数名函数功能OSdelay_osschedlockus级延时时,关闭任务调度(防止打断us级延迟)OSdelay_osschedunlockus级延时时,恢复任务调度OSdelay_ostimedlyus级延时时,恢复任务调度OSSysTick_Handlersystick中断服务函数OSdelay_init初始化延迟…

MySQL服务无法启动,服务没有报告任何错误

MySQL服务无法启动&#xff0c;服务没有报告任何错误 昨天mysql服务还好好的&#xff0c;今天怎么都打不开。my.ini配置和端口都没有问题&#xff0c;只能备份一下data的数据&#xff0c;删除data文件夹&#xff0c;初始化mysqld。 一定要备份data数据&#xff01;&#xff01;…

【算法和数据结构】257、LeetCode二叉树的所有路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先看这道题的输出结果&#xff0c;是前序遍历。然后需要找到从根节点到叶子节点的所有路径&#xff…

苍穹外卖-day06

苍穹外卖-day06 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

什么是 HTTP 长轮询?

什么是 HTTP 长轮询&#xff1f; Web 应用程序最初是围绕客户端/服务器模型开发的&#xff0c;其中 Web 客户端始终是事务的发起者&#xff0c;向服务器请求数据。因此&#xff0c;没有任何机制可以让服务器在没有客户端先发出请求的情况下独立地向客户端发送或推送数据。 为…

【java的类型数据】——八大类型数据

文章目录 前言字面常量字面常量的分类: 数据类型和变量变量的包装类和范围范围整型变量byteintshortlong 浮点型变量双精度浮点型double单精度浮点型float 字符型变量char布尔型变量 boolean 类型转换自动类型转换&#xff08;隐式&#xff09;强制类型转换&#xff08;显式&am…

tinkerCAD案例:20. Simple Button 简单按钮和骰子

文章目录 tinkerCAD案例&#xff1a;20. Simple Button 简单按钮Make a Trick Die tinkerCAD案例&#xff1a;20. Simple Button 简单按钮 Project Overview: 项目概况&#xff1a; This is a series of fun beginner level lessons to hone your awesome Tinkercad skills a…

8.docker仓库

文章目录 Docker仓库本地私有仓库Docker HarborDocker harbor部署访问页面创建用户下载私有仓库镜像harbor同步 Docker仓库 本地私有仓库 ##先下载 registry 镜像docker pull registry##修改配置文件&#xff0c;在 daemon.json 文件中添加私有镜像仓库地址vim /etc/dock…

第三节 C++ 运算符

文章目录 掌握知识点1. 运算符概述1.1 算术运算符1.1.1 加&#xff0c;减&#xff0c;乘&#xff0c;除1.1.2 自增&#xff0c;自减1.1.3 取模运算 % 1.2 赋值运算符1.3 比较运算符1.4 逻辑运算符 2. 编程题&#xff1a;运算符使用2.1 计算器2.2 位数分离2.3 鸡兔同笼问题 掌握…

重学C++系列之智能指针简单介绍

一、什么是智能指针 在使用堆内存时&#xff0c;就像使用栈内存空间一样&#xff0c;可以实现自释放的功能&#xff0c;智能指针在C库中也是类模板之一。 二、智能指针有几种 有四种。auto_ptr, unique_ptr, shared_ptr, weak_ptr 其中后三个是C11支持&#xff0c;第一个已经被…

递归:一个图教学会递归原理

递归的特点 实际上&#xff0c;递归有两个显著的特征,终止条件和自身调用: 自身调用&#xff1a;原问题可以分解为子问题&#xff0c;子问题和原问题的求解方法是一致的&#xff0c;即都是调用自身的同一个函数。终止条件&#xff1a;递归必须有一个终止的条件&#xff0c;即不…

软考A计划-系统集成项目管理工程师-项目人力资源管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

百度与AI:历史、投资和监管

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 百度的人工智能在中国具有先发优势 随着ChatGPT的爆火&#xff0c;人工智能重新引起了投资者的注意&#xff0c;然而人工智能并不是突然爆火的&#xff0c;而是全球众多公司在人工智能技术上进行数十年如一日的研发和积累&a…

Vite创建Vue+TS项目引入文件路径报错

使用vite搭建vue3脚手架的时候&#xff0c;发现main.ts中引入App.vue编辑器会报错&#xff0c;但是不影响代码运行。 报错信息&#xff1a;TS2307: Cannot find module ‘./App.vue’ or its corresponding type declarations. 翻译过来是找不到模块或者相关的声明类型&#…

发现问题:edge浏览器的效率模式会导致setTimeout/setInterval变慢

问题描述 当edge浏览器启用效率模式后&#xff0c;setTimeout/setInterval运行一段时间后&#xff0c;执行间隔会变慢。 开启后&#xff1a; 关闭效率模式&#xff1a;

pspice导入元件Orcad spice模型

想要使用英飞凌一款驱动芯片&#xff0c;型号&#xff1a;1EDN7550U&#xff0c;在贸泽等各大网站上都没有找到改元件的spice仿真模型&#xff0c;经过一番摸索&#xff0c;终于找到了。 1、首先去芯片官网上查找该元件&#xff1b;找到该元件的spice模型 2、下载下来&#xff…

第十一章:deque类

系列文章目录 文章目录 系列文章目录前言deque的介绍deque的使用deque的缺陷deque的应用总结 前言 deque是一种双开口的“连续空间”的容器。 deque的介绍 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可…

消息中间件RabbitMQ——学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…