SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮
目录
前言
1.框架集成-SpringData-整体介绍
1.1Spring Data Elasticsearch 介绍
2.框架集成Spring Data Elasticsearch
2.1版本说明
2.2.idea创建一个springboot项目
2.3.导入依懒
2.3.增加配置文件
2.4Spring Boot 主程序。
2.5.数据实体类
2.6.配置类
2.7.DAO 数据访问对象
3.框架集成-SpringData-集成测试-索引操作
4.框架集成-SpringData-集成测试-文档操作
5.框架集成-SpringData-集成测试-文档搜索
6.demo地址
前言
推荐首先查看spring boot对应elasticsearch版本,选择合适的版本整合,推荐以spring boot版本为主,因为项目中集成的框不止是es,根据spring boot去安装对应版本的es。
Spring Data Elasticsearch - 参考文档,这是官方文档,建议一定参照文档,这个文档真的很详细。
springboot操作elasticsearch有两种常用方式:
- Spring Data Elasticsearch
这是Spring官方最推荐的,就像JPA,Mybatisplus一样,在DAO层继承ElasticsearchRepository接口,就可以使用封装好的一些常见的操作了,用起来简单方便。
文档: Spring 数据弹性搜索 - 参考文档
- ElasticsearchRestTemplate
封装的就是High Level REST Client
,这是基于HTTP协议的客户端,是ES官方推荐使用的,也是可以使用的,但是要求对ES的DSL语句熟悉,方便自己做复杂的增删改查。
映射标注概述
使用元数据来驱动对象到文档的映射。 元数据取自可以注释的实体属性。
MappingElasticsearchConverter
以下注释可用:
@Document
:在类级别应用,以指示此类是映射到数据库的候选项。 最重要的属性是(查看 API 文档以获取完整的属性列表):
indexName
:要在其中存储此实体的索引的名称。 这可以包含一个 SpEL 模板表达式,例如"log-#{T(java.time.LocalDate).now().toString()}"
createIndex
:标记是否在存储库引导时创建索引。 默认值为 true。 请参阅使用相应映射自动创建索引
@Id
:在字段级别应用,以标记用于标识目的的字段。
@Transient
, , : 有关详细信息,请参阅以下控制写入和读取哪些属性一节。@ReadOnlyProperty
@WriteOnlyProperty
@PersistenceConstructor
:标记给定的构造函数 - 甚至是受包保护的构造函数 - 以便在从数据库中实例化对象时使用。 构造函数参数按名称映射到检索到的文档中的键值。
@Field
:应用于字段级别并定义字段的属性,大多数属性映射到相应的 Elasticsearch 映射定义(以下列表不完整,请查看注释 Javadoc 以获取完整参考):
name
:将在 Elasticsearch 文档中表示的字段名称,如果未设置,则使用 Java 字段名称。
type
:字段类型可以是文本、关键字、长整型、整数、短整型、字节、双精度、浮点型、Half_Float型、Scaled_Float、日期、Date_Nanos、布尔值、二进制、Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range、Ip_Range、对象、嵌套、IP、令牌计数、渗滤器、扁平化、Search_As_You_Type之一。 请参阅 Elasticsearch 映射类型。 如果未指定字段类型,则默认为 。 这意味着,不会为该属性写入映射条目,并且 Elasticsearch 将在存储此属性的第一个数据时动态添加映射条目(查看 Elasticsearch 文档以了解动态映射规则)。FieldType.Auto
format
:一种或多种内置日期格式,请参阅下一节日期格式映射。
pattern
:一种或多种自定义日期格式,请参阅下一节日期格式映射。
store
:标记原始字段值是否应存储在 Elasticsearch 中,默认值为 false。
analyzer
, , ,用于指定自定义分析器和规范化器。searchAnalyzer
normalizer
@GeoPoint
:将字段标记为geo_point数据类型。 如果字段是类的实例,则可以省略。GeoPoint
@ValueConverter
定义用于转换给定属性的类。 与注册的 Spring 不同,这只转换带注释的属性,而不是给定类型的每个属性。Converter
映射元数据基础设施在一个单独的 spring-data-commons 项目中定义,该项目与技术无关。
文档: Spring 数据弹性搜索 - 参考文档
1.框架集成-SpringData-整体介绍
Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务Spring Data可以极大的简化JPA(Elasticsearch)的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD 外,还包括如分页、排序等一些常用的功能。
Spring Data 的官网
Spring Data 常用的功能模块如下:
- Spring Data JDBC
- Spring Data JPA
- Spring Data LDAP
- Spring Data MongoDB
- Spring Data Redis
- Spring Data R2DBC
- Spring Data REST
- Spring Data for Apache Cassandra
- Spring Data for Apache Geode
- Spring Data for Apache Solr
- Spring Data for Pivotal GemFire
- Spring Data Couchbase
- Spring Data Elasticsearch
- Spring Data Envers
- Spring Data Neo4j
- Spring Data JDBC Extensions
- Spring for Apache Hadoop
1.1Spring Data Elasticsearch 介绍
Spring Data Elasticsearch基于Spring Data API简化 Elasticsearch 操作,将原始操作Elasticsearch 的客户端API进行封装。Spring Data为Elasticsearch 项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储索引库数据访问层。
Spring Data Elasticsearch 官网
注意点:
- ElasticsearchRestTemplate是spring-data-elasticsearch项目中的一个类,和其他spring项目中的 template类似。
- 在新版的spring-data-elasticsearch 中,ElasticsearchRestTemplate 代替了原来的ElasticsearchTemplate。
- 原因是ElasticsearchTemplate基于TransportClient,TransportClient即将在8.x 以后的版本中移除。所以,我们推荐使用ElasticsearchRestTemplate。ElasticsearchRestTemplate基于RestHighLevelClient客户端的。
- 需要自定义配置类,继承AbstractElasticsearchConfiguration,并实现elasticsearchClient()抽象方法,创建RestHighLevelClient对象。
2.框架集成Spring Data Elasticsearch
2.1版本说明
内容 | 版本 |
elasticsearch | elasticsearch-7.8.0 |
springboot | 2.3.6.RELEASE |
2.2.idea创建一个springboot项目
2.3.导入依懒
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></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-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency></dependencies>
2.3.增加配置文件
在 resources 目录中增加application.properties文件
# es 服务地址
elasticsearch.host=127.0.0.1
# es 服务端口
elasticsearch.port=9200
# 配置日志级别,开启 debug 日志
logging.level.com.es=debug
2.4Spring Boot 主程序。
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;/*** @author 24412*/
@SpringBootApplication
public class SpringBootElasticSearchApplication {public static void main(String[] args) {SpringApplication.run(SpringBootElasticSearchApplication.class, args);}}
2.5.数据实体类
package com.example.es;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
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;/*** @author 24412*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Document(indexName = "shopping", shards = 3, replicas = 1)
public class Product {/*** type : 字段数据类型* analyzer : 分词器类型* index : 是否索引(默认:true)* Keyword : 短语,不进行分词*//*** 商品唯一标识 必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id"*/@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title;//商品名称@Field(type = FieldType.Keyword)private String category;//分类名称@Field(type = FieldType.Double)private Double price;//商品价格@Field(type = FieldType.Keyword, index = false)private String images;//图片地址
}
2.6.配置类
package com.example.config;import lombok.Data;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;/** ElasticsearchRestTemplate基于RestHighLevelClient客户端的。* 需要自定义配置类,继承AbstractElasticsearchConfiguration,* 并实现elasticsearchClient()抽象方法,创建RestHighLevelClient对象。* @author 24412*/
@ConfigurationProperties(prefix = "elasticsearch")
@Configuration
@Data
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration{/*** 设置为static方便后面调用*/public static RestHighLevelClient restHighLevelClient;private String host ;private Integer port ;/*** 重写父类方法*/@Overridepublic RestHighLevelClient elasticsearchClient() {RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));restHighLevelClient = new RestHighLevelClient(builder);return restHighLevelClient;}
}
2.7.DAO 数据访问对象
import com.lun.model.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductDao extends ElasticsearchRepository<Product, Long>{}
3.框架集成-SpringData-集成测试-索引操作
package com.example;import com.example.es.Product;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringDataESIndexTest {//注入 ElasticsearchRestTemplate@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;//创建索引并增加映射配置@Testpublic void createIndex(){//创建索引,系统初始化会自动创建索引System.out.println("创建索引");}@Testpublic void deleteIndex(){//创建索引,系统初始化会自动创建索引boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);System.out.println("删除索引 = " + flg);}
}
4.框架集成-SpringData-集成测试-文档操作
package com.example;import com.example.dao.ProductDao;
import com.example.es.Product;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.List;/*** 文档操作*/
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootElasticSearchApplicationTests {@Autowiredprivate ProductDao productDao;/*** 新增*/@Testpublic void testAdd() {Product product = new Product();product.setId(1L);product.setTitle("小米手机");product.setCategory("手机");product.setPrice(1999.00);product.setImages("http://image.baidu.com/13123.jpg");productDao.save(product);}/*** 修改*/@Testpublic void testUpdate() {Product product = new Product();product.setId(1L);product.setTitle("华为手机");product.setCategory("手机");product.setPrice(2999.00);product.setImages("http://image.baidu.com/13123.jpg");productDao.save(product);}/*** 根据id查询*/@Testpublic void testFindById() {Product product = productDao.findById(1L).get();System.out.println(product);}/*** 查询全部*/@Testpublic void testFindAll() {productDao.findAll().forEach(System.out::println);}/*** 删除*/@Testpublic void testDelete() {productDao.deleteById(1L);}/*** 批量插入*/@Testpublic void testBatchAdd() {List<Product> list = new ArrayList<>();for (int i = 0; i < 100; i++) {Product product = new Product();product.setId(Long.valueOf(i));product.setTitle("华为手机" + i);product.setCategory("手机");product.setPrice(2999.00);product.setImages("http://image.baidu.com/13123.jpg");list.add(product);}productDao.saveAll(list);}/*** 分页查询*/@Testpublic void testPageQuery() {//设置排序(排序方式,正序还是倒序,排序的 id)Sort sort = Sort.by(Sort.Direction.DESC, "id");//设置分页(页码,每页显示的条数)//当前页码0开始int currentPage = 0;//每页显示的条数int pageSize = 10;//设置分页PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort);//分页查询productDao.findAll(pageRequest).forEach(System.out::println);}}
5.框架集成-SpringData-集成测试-文档搜索
package com.example;import com.example.config.ElasticsearchConfig;
import com.example.dao.ProductDao;
import com.example.es.Product;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringDataESSearchTest {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Autowiredprivate ProductDao productDao;/*** term 查询* search(termQueryBuilder) 调用搜索方法,参数查询构建器对象*/@Testpublic void termQuery() {TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "华为手机99");QueryBuilders.boolQuery().must(termQueryBuilder);Iterable<Product> products = productDao.search(termQueryBuilder);for (Product product : products) {System.out.println(product);}}/*** term 查询加分页*/@Testpublic void termQueryByPage() {int currentPage = 0;int pageSize = 5;//设置查询分页PageRequest pageRequest = PageRequest.of(currentPage, pageSize);TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "华为手机");Iterable<Product> products =productDao.search(termQueryBuilder, pageRequest);for (Product product : products) {System.out.println(product);}}/*** 高亮查询*/@Testpublic void testHighlight() {//构建查询条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.should(QueryBuilders.matchQuery("title", "华为手机"));//设置高亮字段HighlightBuilder highlightBuilder = new HighlightBuilder();//设置标签前缀highlightBuilder.preTags("<font color='red'>");//设置标签后缀highlightBuilder.postTags("</font>");//设置高亮字段highlightBuilder.field("title");// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery).withHighlightBuilder(highlightBuilder).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 高亮查询加分页*/@Testpublic void testHighlightByPage() {//当前页int currentPage = 0;//每页显示条数int pageSize = 5;//设置查询分页PageRequest pageRequest = PageRequest.of(currentPage, pageSize);//构建查询条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.should(QueryBuilders.matchQuery("title", "华为手机"));//设置高亮字段HighlightBuilder highlightBuilder = new HighlightBuilder();//设置标签前缀highlightBuilder.preTags("<font color='red'>");//设置标签后缀highlightBuilder.postTags("</font>");//设置高亮字段highlightBuilder.field("title");// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery).withHighlightBuilder(highlightBuilder).withPageable(pageRequest).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 模糊查询*/@Testpublic void testFuzzyQuery() {//构建查询条件FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("title", "华为").fuzziness(Fuzziness.ONE);// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQuery).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 最大查询*/@Testpublic void testMaxQuery() {FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("title", "华为").fuzziness(Fuzziness.ONE);// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(fuzzyQuery).addAggregation(AggregationBuilders.max("maxAge").field("age")).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 分组查询*/@Testpublic void testGroupQuery() {// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms("title").field("price")).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 范围查询*/@Testpublic void testRangeQuery() {//构建条件查询:id为30-50,按价格分组BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.rangeQuery("id").from(30).to(50));// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery).addAggregation(AggregationBuilders.terms("title").field("price")).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** 组合查询*/@Testpublic void testConditionQuery() {//构建条件查询:id为30-50,按价格分组BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.rangeQuery("id").from(30).to(50));// 构建查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery).addAggregation(AggregationBuilders.terms("title").field("price")).build();//执行查询SearchHits<Product> searchHits = elasticsearchRestTemplate.search(searchQuery, Product.class);//获取查询结果searchHits.forEach(searchHit -> {System.out.println(searchHit.toString());});}/*** TODO 查询排序 ElasticsearchConfig.restHighLevelClient*/@Testpublic void testSortQuery() throws IOException {//里面可以放多个索引SearchRequest request = new SearchRequest("shopping");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//按照id倒序排列(score会失效返回NaN)sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));//执行查询SearchResponse response = ElasticsearchConfig.restHighLevelClient.search(request, RequestOptions.DEFAULT);//打印结果信息org.elasticsearch.search.SearchHits hits = response.getHits();System.out.println("timeout:" + response.isTimedOut());System.out.println("total:" + hits.getTotalHits());System.out.println("MaxScore:" + hits.getMaxScore());System.out.println("hits========>>");hits.forEach(hit -> {System.out.println(hit.getSourceAsString());});System.out.println("<<========");}}
6.demo地址
SpringBoot整合ElasticSearch小demo: SpringBoot整合ElasticSearch小demo
相关文章:

SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮
目录 前言 1.框架集成-SpringData-整体介绍 1.1Spring Data Elasticsearch 介绍 2.框架集成Spring Data Elasticsearch 2.1版本说明 2.2.idea创建一个springboot项目 2.3.导入依懒 2.3.增加配置文件 2.4Spring Boot 主程序。 2.5.数据实体类 2.6.配置类 2.7.DAO 数据…...

YARN基本架构
主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如图所YA示。 ResourceManager(RM) RM是全局资源管理器,负责整个系统的资源管理和分配 主要由两个组件构成:Scheduler调度器和应用程序…...
【C++复习】类和对象全知识点总结
类和对象写在前面类和对象面向对象类类的定义类的访问限定符类的作用域类的实例化类对象大小this指针类的默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载前置后置重载取地址及const取地址操作符重载const 成员static 成员友元友元函数有元类内部类匿名对象…...

基于轻量级YOLOv5开发构建汉字检测识别分析系统
汉字检测、字母检测、手写数字检测、藏文检测、甲骨文检测在我之前的文章中都有做过了,今天主要是因为实际项目的需要,之前的汉字检测模型较为古老了还使用的yolov3时期的模型,检测精度和推理速度都有不小的滞后了,这里要基于yolo…...

leetcode-每日一题-66(简单题,数组)
这道题其实还没那么简单,中间还是有的绕的。。。。给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会…...
LeetCode295之数据流的中位数(相关话题:优先队列)
题目描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Media…...

助你加速开发效率!告别IDEA卡顿困扰的性能优化技巧
在现代软件开发中,IDE(集成开发环境)是一个必不可少的工具。IntelliJ IDEA是一个广受欢迎的IDE,但有时候IDE的性能可能会受到影响,导致开发人员的工作效率降低。本文将介绍一些可以提高IDE性能的技巧,帮助开…...
Java设计模式-适配器模式
1、简介 适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。 2、适配器模式分类 目标接口(Target&#x…...

Linux 练习六 (IPC 管道)
文章目录1 标准管道流2 无名管道(PIPE)3 命名管道(FIFO)3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例:基于管道的客服端服务器程序使用环境:Ubuntu18.04 使用工具:VMWare workstati…...

合并两个有序链表(精美图示详解哦)
全文目录引言合并两个有序链表题目描述方法一:将第二个链表合并到第一个思路实现方法二:尾插到哨兵位的头节点思路实现总结引言 在前面两篇文章中,我们介绍了几道链表的习题:反转链表、链表的中间结点、链表的倒数第k个结点&…...

33 JSON操作
目录 一、介绍 二、JSON的特点 三、JSON语法 1、json中的数据类型 四、JSON文件的定义 五、读取JSON文件 1、读取json文件的两种方式 (1)read、write (2)json.load 2、使用json.load读取json文件的步骤 3、练习读取json文件 六、练…...
三八妇女节快乐----IT女神活动随笔
献丑了,一首小小散文诗,请大家轻喷 O(≧口≦)O 我的答案 天下芸芸众生,好似夜幕漫天繁星。 与你相识,只是偶然。 简单的一个招呼,于是开始了一段故事。 我们或是诉说,或是分享; 我们彼此倾听&…...

【PSO-PID】使用粒子群算法整定PID参数控制起动机入口压力值
最近在学优化算法,接触到了经典寻优算法之粒子群PSO,然后就想使用PSO算法来调节PID参数,在试验成功之后将此控制算法应用到了空气起动系统上,同时与之前的控制器进行对比看看哪种控制效果最好。 0 引言 PID参数整定主要有两种&…...

当代数据分析指南:激发商业洞见的七个方法(上)
如果说眼下的发生的事能证明什么,那就是基于实时可信的数据分析正在变得越来越重要。但是要是想要在需要的时候准确地获取中肯的洞察,我们所需要的可不只是漂亮的可视化。 如何让你的员工都有能力和机会都做出最好的决策,不管这个决策会有多…...

javaWeb核心02-JSP、EL、JSTL、MVC
文章目录JSP1,JSP 概述2,JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3,JSP 原理4,JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试4.3 JSP 缺点5࿰…...
spring-boot+mybatis-plus连接Oracle数据库,及查询相关数据
配置java 略(这里我用的是jdk1.8) 配置maven 环境变量: M2_HOME:D:\LJ\software\java\maven\apache-maven-3.6.3 Path:%M2_HOME%\bin 仓库/jdk/镜像云设置(./config/sitting) 仓库 <localRepository> D:/…...

电商使用CRM系统有什么好处,如何选择
数据显示,使用电商CRM客户管理系统后,企业销售额提高了87%,客户满意度提高了74%,业务效率提高了73%。要在竞争激烈的电商市场取得成功,与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统?电商C…...

Nacos2.2.0多数据源适配oracle12C-修改Nacos源码
从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 文章目录一…...

第十四届蓝桥杯三月真题刷题训练——第 5 天
目录 题目1:数的分解 题目描述 运行限制 代码: 题目2:猜生日 题目描述 运行限制 代码: 题目3:成绩分析 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码: 题目4:最大和…...
大数据框架之Hive:第3章 DDL(Data Definition Language)数据定义
第3章 DDL(Data Definition Language)数据定义 3.1 数据库(database) 3.1.1 创建数据库 1)语法 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPER…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...