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

企业级开发SpringBoost玩转Elasticsearch

案例

Spring Boot 提供了 spring-data-elasticsearch 模块,可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8,并提供示例代码。

1. 添加依赖:

首先,需要在 pom.xml 文件中添加 spring-data-elasticsearch 的依赖。 注意,你需要选择与你的 Spring Boot 版本和 Elasticsearch 版本兼容的 spring-data-elasticsearch 版本

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 其他依赖 -->
</dependencies>

2. 配置 Elasticsearch:

application.propertiesapplication.yml 文件中配置 Elasticsearch 的连接信息。

spring.elasticsearch.uris=http://localhost:9200
# 如果 Elasticsearch 开启了安全认证,需要配置用户名和密码
#spring.elasticsearch.username=elastic
#spring.elasticsearch.password=your_password 

3. 创建实体类:

创建一个实体类,用于映射 Elasticsearch 中的文档结构。 使用 @Document 注解指定索引名称,使用 @Id 注解指定文档 ID 字段。

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;@Document(indexName = "products")  // 指定索引名称
public class Product {@Id  // 指定文档 ID 字段private String id;@Field(type = FieldType.Text, name = "name")private String name;@Field(type = FieldType.Double, name = "price")private Double price;// 必须要有默认构造函数public Product() {}public Product(String id, String name, Double price) {this.id = id;this.name = name;this.price = price;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}
}

4. 创建 Repository 接口:

创建一个 Repository 接口,用于操作 Elasticsearch 中的文档。 继承 ElasticsearchRepository 接口,并指定实体类和 ID 的类型。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, String> {// 可以自定义查询方法,例如根据名称查询商品// Spring Data Elasticsearch 会根据方法名自动生成查询语句Iterable<Product> findByName(String name);
}

5. 创建 Service 类:

创建一个 Service 类,用于调用 Repository 接口,实现业务逻辑。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class ProductService {@Autowiredprivate ProductRepository productRepository;// 创建索引(可选,通常 Elasticsearch 会自动创建)public void createIndex() {// 注意: Spring Data Elasticsearch 提供了自动索引管理的机制,通常不需要手动创建索引// 如果需要自定义索引设置,可以使用 ElasticsearchClient 手动创建// 例如设置 Settings 和 Mappings。}// 添加商品public Product addProduct(Product product) {return productRepository.save(product);}// 根据ID查找商品public Product findProductById(String id) {return productRepository.findById(id).orElse(null);}// 根据名称查找商品public Iterable<Product> findProductsByName(String name) {return productRepository.findByName(name);}// 更新商品public Product updateProduct(Product product) {return productRepository.save(product); // save 方法在 ID 存在时更新文档}// 删除商品public void deleteProductById(String id) {productRepository.deleteById(id);}// 列出所有商品public Iterable<Product> getAllProducts() {return productRepository.findAll();}
}

6. 创建 Controller 类:

创建一个 Controller 类,提供 RESTful API 接口。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;@RestController
@RequestMapping("/products")
public class ProductController {@Autowiredprivate ProductService productService;@PostMappingpublic Product addProduct(@RequestBody Product product) {return productService.addProduct(product);}@GetMapping("/{id}")public Product findProductById(@PathVariable String id) {return productService.findProductById(id);}@GetMapping("/name/{name}")public Iterable<Product> findProductsByName(@PathVariable String name) {return productService.findProductsByName(name);}@PutMappingpublic Product updateProduct(@RequestBody Product product) {return productService.updateProduct(product);}@DeleteMapping("/{id}")public void deleteProductById(@PathVariable String id) {productService.deleteProductById(id);}@GetMappingpublic Iterable<Product> getAllProducts() {return productService.getAllProducts();}
}

7. 完整示例与注意事项:

  • 自动索引管理: spring-data-elasticsearch 提供了自动索引管理的机制。 当你的应用程序启动时,它会自动检查 Elasticsearch 中是否存在与你的实体类对应的索引。 如果不存在,它会自动创建索引,并根据实体类的注解设置 mappings。 如果需要更细粒度的控制,你可以禁用自动索引管理,并使用 ElasticsearchClient 手动创建索引。

  • ElasticsearchClient 的使用 (高级): spring-data-elasticsearch 默认提供了 ElasticsearchRestTemplate,可以方便地执行 Elasticsearch 操作。 如果你需要更高级的功能,例如手动创建索引、执行复杂的查询等,可以使用 ElasticsearchClient

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Map;@Service
public class ElasticsearchIndexService {@Autowiredprivate ElasticsearchOperations  elasticsearchOperations;public void createIndex(String indexName, Map<String, Object> mappings) throws IOException {ElasticsearchClient client = elasticsearchOperations.getClient();CreateIndexRequest request = new CreateIndexRequest.Builder().index(indexName).mappings(m -> m.properties(mappings)) //  这里 mappings 是一个 Map<String,Object>.build();CreateIndexResponse response = client.indices().create(request);if (response.acknowledged()) {System.out.println("Index '" + indexName + "' created successfully.");} else {System.out.println("Failed to create index '" + indexName + "'.");}}
}

企业中使用

ElasticsearchClient 是 Elasticsearch Java 客户端库中的核心组件,用于与 Elasticsearch 集群进行交互。它提供了一系列方法来执行各种操作,如索引文档、搜索数据、更新文档、删除文档等。

//根据查询条件删除    
@Overridepublic DeleteByQueryResponse delete(@NonNull Class<?> model, @NonNull Query query) {ModelContext context = ModelContext.of(model);DeleteByQueryRequest request = new DeleteByQueryRequest.Builder().index(context.getIndex()).query(query).conflicts(Conflicts.Proceed).build();try {return this.client.deleteByQuery(request);} catch (IOException e) {throw new RuntimeException(e);}}Query query = QueryBuilders.term(t -> t.field("resumeId").value(resume.getId()));
DeleteByQueryResponse response = this.elasticsearchHandler.delete(Vitae.class, query);//使用
DeleteRequest request = new DeleteRequest.Builder().index(context.getIndex()).id(id).build();

前期学习

修改文档:
全量修改:PUT/索引库名/_doc/文档id{json文档}

增量修改:POST/索引库名/_update/文档id{"doc":{字段}}

    @Overridepublic UpdateByQueryResponse update(@NonNull Class<?> model, @NonNull Query query,@NonNull Map<String, ?> parameters) {ModelContext context = ModelContext.of(model);StringBuilder source = new StringBuilder();Map<String, JsonData> params = Maps.newHashMapWithExpectedSize(parameters.size());parameters.forEach((key, value) -> {if (source.length() > 0) {source.append(";");}if (value == null) {source.append("ctx._source.").append(key).append("=null");} else {source.append("ctx._source.").append(key).append("=params.").append(key);params.put(key, JsonData.of(value));}});Script script = new Script.Builder().lang(ScriptLanguage.Painless).source(source.toString()).params(params).build();UpdateByQueryRequest request = new UpdateByQueryRequest.Builder().index(context.getIndex()).script(script).query(query).conflicts(Conflicts.Proceed).build();try {return this.client.updateByQuery(request);} catch (IOException e) {throw new RuntimeException(e);}}//使用
UpdateByQueryResponse response = this.elasticsearchHandler.update(Vitae.class, query, parameters);
    @Overridepublic UpdateByQueryResponse update(@NonNull Class<?> model, @NonNull Query query, @NonNull String field,Object value) {ModelContext context = ModelContext.of(model);String source = "ctx._source." + field + (value == null ? "=null" : ("=params." + field));Map<String, JsonData> params = value == null ? Collections.emptyMap() :ImmutableMap.of(field, JsonData.of(value));Script script = new Script.Builder().lang(ScriptLanguage.Painless).source(source).params(params).build();UpdateByQueryRequest request = new UpdateByQueryRequest.Builder().index(context.getIndex()).script(script).query(query).conflicts(Conflicts.Proceed).build();try {return this.client.updateByQuery(request);} catch (IOException e) {throw new RuntimeException(e);}}//使用
this.elasticsearchHandler.update(Vitae.class, query, "topping", document);
 @Overridepublic <T> UpdateResponse<T> update(@NonNull Class<T> model, @NonNull String id, @NonNull Object document,Long primary, Long sequence) {ModelContext context = ModelContext.of(model);UpdateRequest<T, ?> request = new UpdateRequest.Builder<T, Object>().index(context.getIndex()).id(id).doc(document).ifPrimaryTerm(primary).ifSeqNo(sequence).retryOnConflict(3).build();try {return this.client.update(request, model);} catch (IOException e) {throw new RuntimeException(e);}}//使用
this.elasticsearchHandler.update(Job.class, id, ImmutableMap.of("recruiting", recruiting));

前期学习

springboot操作es的DSL

QueryBuilders 常用方法
全文查询
  • matchQuery(String field, Object value): 全文匹配

  • multiMatchQuery(Object value, String... fields): 多字段匹配

  • matchPhraseQuery(String field, Object value): 短语匹配

  • matchPhrasePrefixQuery(String field, Object value): 短语前缀匹配

词项查询
  • termQuery(String field, Object value): 精确词项匹配

  • termsQuery(String field, String... values): 多词项精确匹配

  • rangeQuery(String field): 范围查询(如数值、日期)

  • existsQuery(String field): 检查字段是否存在

  • prefixQuery(String field, String value): 前缀匹配

  • wildcardQuery(String field, String value): 通配符匹配(如*?

  • regexpQuery(String field, String value): 正则表达式匹配

  • fuzzyQuery(String field, String value): 模糊匹配(容错匹配)

复合查询
  • boolQuery(): 布尔查询(组合多个子查询)

  • disMaxQuery(): 取多个查询中的最佳匹配

  • constantScoreQuery(QueryBuilder query): 固定评分查询

  • nestedQuery(String path, QueryBuilder query, ScoreMode scoreMode): 嵌套对象查询

  • functionScoreQuery(QueryBuilder query, FunctionScoreBuilder... functions): 自定义评分函数

地理位置查询

  • geoDistanceQuery(String field): 地理距离范围查询

  • geoBoundingBoxQuery(String field): 地理边界框查询

其他查询
  • scriptQuery(Script script): 脚本查询

  • idsQuery().addIds(String... ids): 根据ID查询


综合示例一

假设有一个products索引,包含以下字段:

  • name(文本)

  • price(整数)

  • status(关键字)

  • tags(关键字数组)

  • location(地理坐标)

  • metadata(嵌套类型,包含keyvalue

import org.elasticsearch.index.query.*;
import org.elasticsearch.common.geo.GeoPoint;
import org.elasticsearch.script.Script;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.action.search.SearchRequest;public class QueryExample {public static void main(String[] args) {// 1. 布尔查询(组合多个子查询)BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 2. 全文匹配:搜索name中包含"phone"boolQuery.must(QueryBuilders.matchQuery("name", "phone"));// 3. 多字段匹配:在name和description中搜索"smart"boolQuery.must(QueryBuilders.multiMatchQuery("smart", "name", "description"));// 4. 短语匹配:description中精确匹配"high quality"boolQuery.must(QueryBuilders.matchPhraseQuery("description", "high quality"));// 5. 精确词项匹配:status为"active"boolQuery.must(QueryBuilders.termQuery("status", "active"));// 6. 多词项匹配:tags包含"electronics"或"gadgets"boolQuery.must(QueryBuilders.termsQuery("tags", "electronics", "gadgets"));// 7. 范围查询:price在100到500之间boolQuery.must(QueryBuilders.rangeQuery("price").gte(100).lte(500));// 8. 存在性检查:stock字段必须存在boolQuery.filter(QueryBuilders.existsQuery("stock"));// 9. 前缀匹配:description以"latest"开头boolQuery.should(QueryBuilders.prefixQuery("description", "latest"));// 10. 通配符匹配:tags字段匹配"tec*"(如"tech")boolQuery.should(QueryBuilders.wildcardQuery("tags", "tec*"));// 11. 正则表达式匹配:name匹配正则"pho.*e"boolQuery.should(QueryBuilders.regexpQuery("name", "pho.*e"));// 12. 模糊查询:name容错匹配"fone"boolQuery.should(QueryBuilders.fuzzyQuery("name", "fone"));// 13. 地理距离查询:location距离(37.7749, -122.4194)10公里内boolQuery.filter(QueryBuilders.geoDistanceQuery("location").point(37.7749, -122.4194).distance("10km"));// 14. 嵌套查询:metadata.key为"color"且metadata.value为"black"boolQuery.must(QueryBuilders.nestedQuery("metadata",QueryBuilders.boolQuery().must(QueryBuilders.termQuery("metadata.key", "color")).must(QueryBuilders.matchQuery("metadata.value", "black")),ScoreMode.Total));// 15. 脚本查询:price大于200Script script = new Script("doc['price'].value > 200");boolQuery.filter(QueryBuilders.scriptQuery(script));// 构建搜索请求SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(boolQuery);SearchRequest searchRequest = new SearchRequest("products");searchRequest.source(sourceBuilder);// 执行搜索(需Elasticsearch客户端)// SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);}
}
综合案例二 
 @Overridepublic List<Job> listSearchJobs(@NonNull TextSearch search) {List<Query> pairs = Lists.newLinkedList();if (search.getRegion() != null) {pairs.add(this.jobRegionQuery("regionId", search.getRegion()));}if (StringUtils.notEmpty(search.getKeyword())) {pairs.add(QueryBuilders.match(b -> b.field("description").query(search.getKeyword())));}if (search.getType() != null) {// 指定职位类型pairs.add(QueryBuilders.term(t -> t.field("type").value(search.getType().name())));}if (ObjectUtils.notEmpty(search.getDriveLicenses())) {List<FieldValue> values = search.getDriveLicenses().stream().map(driveLicense -> FieldValue.of(driveLicense.name())).collect(Collectors.toList());pairs.add(QueryBuilders.terms(t -> t.field("driveLicense").terms(v -> v.value(values))));}if (ObjectUtils.isEmpty(pairs)) {return Collections.emptyList();}pairs.add(QueryBuilders.term(t -> t.field("status").value(ContentStatus.ONLINE.name())));Query query = QueryBuilders.bool(b -> b.must(pairs));SearchResponse<Job> response = this.elasticsearchHandler.search(Job.class, query,b -> b.sort(s -> s.field(f -> f.field("refreshTime").order(SortOrder.Desc))).sort(s -> s.field(f -> f.field("_score").order(SortOrder.Desc))).from(search.getPaging().getIndex()).size(search.getPaging().getSize()));return ElasticsearchUtils.sources(response);}

根据id查询:

    @Overridepublic <T> MgetResponse<T> get(@NonNull Class<T> model, @NonNull List<String> ids) {ModelContext context = ModelContext.of(model);MgetRequest request = new MgetRequest.Builder().index(context.getIndex()).ids(ids).build();try {return this.client.mget(request, model);} catch (IOException e) {throw new RuntimeException(e);}}//使用
MgetResponse<Vitae> response = this.elasticsearchHandler.get(Vitae.class, vitaeIds);
Set<Long> exists = response.docs().stream().map(doc -> doc.result().source()).filter(Objects::nonNull).map(Vitae::getId).collect(Collectors.toSet());

 滚动:

    @Overridepublic <T> ScrollResponse<T> scroll(@NonNull Class<T> model, @NonNull String id, @NonNull String time) {ScrollRequest request = new ScrollRequest.Builder().scrollId(id).scroll(s -> s.time(time)).build();try {return this.client.scroll(request, model);} catch (IOException e) {throw new RuntimeException(e);}}//使用
scrollResponse = elasticsearchHandler.scroll(Job.class, scrollId, keyLive + "m");
ElasticsearchUtils.sources(scrollResponse)

相关文章:

企业级开发SpringBoost玩转Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模块&#xff0c;可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8&#xff0c;并提供示例代码。 1. 添加依赖: 首先&#xff0c;需要在 pom.xml 文件中添加 spring-data-e…...

边缘计算网关作用

一、数据采集与预处理 边缘计算网关作为物联网系统的“数据入口”&#xff0c;能够连接各种传感器和设备&#xff0c;实时采集数据。在数据传输到云端之前&#xff0c;它会对数据进行清洗、过滤和聚合&#xff0c;剔除重复、无效或冗余的信息&#xff0c;只将有价值的数据上传…...

利用本地 Express Web 服务解决复杂的 Electron 通信链路的问题

背景 Web 服务对前端同学来说并不陌生&#xff0c;你们开发其他前端界面请求的后端接口就是 Web 服务&#xff0c;你们 npm run dev启动的也是一个本地的 Web 服务&#xff0c;前端的 js&#xff0c;html&#xff0c;css 都有从这个服务上拉取到的资源。 我们在开发 Electron…...

《自然-计算科学》诚邀您投稿计算社会科学研究(computational social science)

李升伟 编译 近年来&#xff0c;运用计算方法和工具来深化对社会科学长期议题理解的"计算社会科学"发展迅猛。这一增长主要得益于社交媒体数据、移动通信数据、数字化图书与历史档案、医疗记录等海量数据的涌现&#xff0c;这些资源不仅为验证现有社会科学理论提供了…...

【SPSS/EXCEl】主成分分析构建__综合评价指数

学习过程中实验操作的记录 1.数据准备和标准化&#xff1a; (1)区分正负相关性:判断每个因子是正向指标还是负向指标,计算每个的最大值和最小值 (2) 标准化: Min-Max标准化 Min-Max标准化&#xff08;最大最小值法&#xff09;&#xff1a; 将数据映射到指定的区间&#xff…...

#node.js后端项目的部署相关了解

熟悉 Spring Boot 的 java -jar 启动方式&#xff0c;那咱们就用类比 实战方式&#xff0c;来彻底搞懂&#xff1a; &#x1f680; Node.js 后端项目的 部署 & 启动方式 ✅ 和 Spring Boot 的 java -jar xxx.jar 一样&#xff0c;Node.js 也可以一句命令启动&#xff0c;而…...

程序化广告行业(69/89):DMP与PCP系统核心功能剖析

程序化广告行业&#xff08;69/89&#xff09;&#xff1a;DMP与PCP系统核心功能剖析 在数字化营销浪潮中&#xff0c;程序化广告已成为企业精准触达目标受众的关键手段。作为行业探索者&#xff0c;我深知其中知识的繁杂与重要性。一直以来&#xff0c;都希望能和大家一同学习…...

基于Python的二手房数据挖掘与可视化深度分析

一、技术框架与数据概况 1.1 技术栈构成 import pandas as pd # 数据操作(v1.3.5) import numpy as np # 数值计算(v1.21.6) from pyecharts.charts import * # 交互式可视化(v1.9.1) from sklearn.preprocessing import StandardScaler # 数据标准化(可选扩展) …...

linux第三次作业

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 2、测试你的虚拟机是否能够ping通网关和dns&#xff0c;如果不能请修改网关和dns的地址 3、将如下内容写入/etc/hosts文件中&#xff08;如果有多个ip地址则写多行&…...

C#编写HttpClient爬虫程序示例

要写一个使用C#和HttpClient的爬虫程序。首先&#xff0c;我需要了解HttpClient的基本用法。HttpClient是用来发送HTTP请求和接收响应的类&#xff0c;对吧&#xff1f;我记得在C#中使用它的时候需要注意一些事情&#xff0c;比如最好使用单例实例&#xff0c;而不是频繁创建和…...

关于Spring MVC在无注解情况下通过参数名匹配获取请求参数的详细说明,包含代码示例和总结表格

以下是关于Spring MVC在无注解情况下通过参数名匹配获取请求参数的详细说明&#xff0c;包含代码示例和总结表格&#xff1a; 1. 核心机制 Spring MVC通过参数名匹配实现无注解参数绑定&#xff1a; 条件&#xff1a;方法参数名需与请求参数&#xff08;查询参数、表单参数&a…...

数智读书笔记系列027:《医疗健康大数据治理》构建智慧医疗的核心基石

一、图书介绍: 1.1 书籍基本信息 在当今数字化技术飞速发展的背景下,医疗行业正经历着前所未有的变革。信息化、智能化、数据驱动的趋势正在深入到医疗服务的各个环节,推动着医疗健康大数据成为医疗行业发展的核心资产。在这样的时代背景下,《医疗健康大数据治理》这本书应…...

Wayland介绍

Wayland 是一种现代化的显示服务器协议&#xff0c;旨在替代传统的 X Window System&#xff08;X11&#xff09;&#xff0c;为 Linux 和类 Unix 系统提供更高效、安全的图形显示管理。以下是其核心要点&#xff1a; 1. 基本概念 显示服务器协议&#xff1a;Wayland 定义了客户…...

dockerTeskTop安装dify及使用deepseek

配置 在这之前&#xff0c;要把模型运行一起&#xff0c;我这里是 PS C:\Users\Administrator> ollama run deepseek-r1:8b 模型名称一定要写对 如果添加失败&#xff0c;参考 dify 1.0.1无法在ollama下新增LLM模型 - 何辉煌 - 博客园...

解释 Git 的基本概念和使用方式

Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化并协作开发项目。下面是 Git 的一些基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git 仓库是用来存储项目文件的地方&#xff0c;可以在本地计算机上创建一个本地仓库&#…...

【区块链安全 | 第三十三篇】备忘单

文章目录 备忘单操作符优先级备忘单ABI 编码和解码函数bytes 和 string 的成员Address 的成员区块与交易属性校验和断言数学和加密函数合约相关类型信息函数可见性说明符修饰符备忘单 操作符优先级备忘单 以下是操作符的优先级顺序,按评估顺序列出: 优先级描述操作符1后缀递…...

MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper

一、MyBatis的缓存 缓存&#xff1a;cache 缓存的作用&#xff1a;通过减少IO的方式&#xff0c;来提高程序的执行效率。 mybatis的缓存&#xff1a;将select语句的查询结果放到缓存&#xff08;内存&#xff09;当中&#xff0c;下一次还是这条select语句的话&#xff0c;直…...

GS+:地统计分析与空间插值工具

大家好&#xff0c;今天为大家介绍的软件是GS&#xff1a;一款用于地统计分析与空间数据处理的软件。与ArcGIS相比的话&#xff0c;它更适合专注于地质统计学分析的用户&#xff0c;尤其是需要对半方差函数进行深入分析和调整的场景下面。我们将从软件的主要功能、支持的系统、…...

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言&#xff0c;在内置类型之间转换规则和C语言一样的&am…...

scala-集合2

可变数组 定义变长数组 val arr01 ArrayBuffer[Any](3, 2, 5) &#xff08;1&#xff09;[Any]存放任意数据类型 &#xff08;2&#xff09;(3, 2, 5)初始化好的三个元素 &#xff08;3&#xff09;ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer 案例实操 Arra…...

Clang编译器优化选项

Clang 作为 C/C 编译器&#xff0c;提供了丰富的优化选项&#xff0c;以下是主要的优化相关选项分类和说明&#xff1a; 1. 优化级别&#xff08;通用选项&#xff09; 选项说明-O0默认级别&#xff0c;禁用所有优化&#xff0c;用于调试。-O1基础优化&#xff08;代码大小和执…...

Java文件流操作 - 【Guava】IO工具

引言 Guava 使用术语 流来表示可关闭的&#xff0c;并且在底层资源中有位置状态的 I/O 数据流。字节流对应的工具类为 ByteSterams&#xff0c;字符流对应的工具类为 CharStreams。 Guava 中为了避免和流直接打交道&#xff0c;抽象出可读的 源 source 和可写的 汇 sink 两个概…...

C语言中单链表操作:查找节点与删除节点

一. 简介 前面学习了C语言中创建链表节点&#xff0c;向链表中插入节点等操作&#xff0c;文章如下&#xff1a; C语言中单向链表&#xff1a;创建节点与插入新节点-CSDN博客 本文继续学习c语言中对链表的其他操作&#xff0c;例如在链表中查找某个节点&#xff0c;删除链表…...

mapbox基础,加载栅格图片到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀使用本地载…...

Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;十 二&#xff09;调试 SELinux&#xff0c;如何管理 SELinux 的运行模式、安全策略、端口和上下文策略 前言一、SELinux 简介二、SELinux 的运行模式2.1 查看和切换 SELinux 模式 三、SELinux 预设安全策略的开关控制四、管…...

模糊斜率熵Fuzzy Slope entropy+状态分类识别!2024年11月新作登上IEEE Trans顶刊

引言 2024年11月&#xff0c;研究者在测量领域国际顶级期刊《IEEE Transactions on Instrumentation and Measurement》&#xff08;IF 5.6&#xff0c;JCR 1区&#xff0c;中科院二区&#xff09;上发表科学研究成果&#xff0c;以“Optimized Fuzzy Slope Entropy: A Comple…...

【MATLAB】将数据保存在mat文件中 save/load/matfile

MAT文件为MATLAB格式的二进制文件 save()函数 save - 将工作区变量保存到文件中 save(filename) 将当前工作区中的所有变量保存在 MATLAB 格式的二进制文件&#xff08;MAT 文件&#xff09;filename 中。如果 filename 已存在&#xff0c;save 会覆盖该文件。 save(filena…...

009_抽象类和接口

抽象类和接口 final关键字常量 单例模式&#xff08;设计模式&#xff09;枚举类抽象类抽象类的注意事项、特点使用抽象类的好处模版方法设计模式 接口接口的好处接口的注意事项 final关键字 final关键字是最终的意思&#xff0c;可以修饰类、方法、变量。 修饰类&#xff1a;…...

【数据结构】排序算法(下篇·开端)·深剖数据难点

前引&#xff1a;前面我们通过层层学习&#xff0c;也就了解了Hoare大佬的排序思想&#xff0c;今天我们学习的东西可能稍微有点难度&#xff0c;因此我们必须学会思想&#xff0c;我很受感慨&#xff0c;因此借此分享一下&#xff1a;【用1520分钟去调试】&#xff0c;如果我们…...

Elixir语言的计算机视觉

Elixir语言在计算机视觉中的应用 引言 计算机视觉作为一门交叉学科&#xff0c;近年来随着深度学习技术的发展而蓬勃发展。传统上&#xff0c;计算机视觉应用通常采用Python、C等语言进行开发&#xff0c;因为这些语言拥有强大的图像处理库和深度学习框架。然而&#xff0c;随…...

VTK知识学习(51)- 交互与Widget(二)

1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互&#xff0c;比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放&#xff0c;然后移动鼠标&#xff0c;可以转动柱体;按下鼠标左键&#xff0c;同时按…...

目标跟踪Deepsort算法学习2025.4.7

一.DeepSORT概述 1.1 算法定义 DeepSORT(Deep Learning and Sorting)是一种先进的多目标跟踪算法,它结合了深度学习和传统的目标跟踪技术,在复杂环境下实现了高精度和鲁棒性的目标跟踪。该算法的核心思想是通过融合目标的外观特征和运动特征,实现对多个目标的持续跟踪,…...

nacos集群启动问题

根据您的描述&#xff0c;Nacos集群只能启动两个节点&#xff0c;可能的原因和解决方法如下&#xff1a; 1. 集群配置问题 • 原因&#xff1a;cluster.conf文件中可能只配置了两个节点的地址&#xff0c;导致第三个节点无法加入集群。 • 解决方法&#xff1a; • 检查每个…...

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…...

关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格

以下是关于Spring MVC中传递数组参数的详细说明&#xff0c;包括如何通过逗号分隔的字符串自动转换为数组&#xff0c;以及具体的代码示例和总结表格&#xff1a; 1. 核心机制 Spring MVC支持直接通过逗号分隔的字符串将请求参数自动转换为数组&#xff08;String[]、int[]等&…...

VBA之Word应用:利用Range方法进行字体及对齐方式设置

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…...

区块链技术:重塑供应链管理的未来

在当今全球化的商业环境中&#xff0c;供应链管理的复杂性和重要性日益凸显。从原材料采购到产品交付&#xff0c;供应链的每一个环节都可能影响企业的运营效率和客户满意度。随着区块链技术的兴起&#xff0c;供应链管理迎来了新的变革机遇。本文将深入探讨区块链技术在供应链…...

请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?

导语: 深夜收到粉丝私信:"面了5家大厂,4家都问集成测试和系统测试的区别,求大佬支招!" 作为经历过200+项目实战的测试老司机,今天用4个真实项目案例+3张原理图,带你彻底吃透这两个核心测试阶段!(文末送测试用例模板) 一、灵魂三问:到底测什么? 1.1 集成…...

SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c

SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c 一 函数的作用 根据编码模式&#xff0c;输入分辨率和快速解码标志动态计算自引导恢复(Self Guide Restoration)过滤器的启动级别&#xff0c;以下是详细解析&#xff1b; 1 参数说明 EncMode enc_m…...

第七章总结:集合

一、集合简介 Scala集合分为三大类&#xff1a;序列&#xff08;Seq&#xff09;、集&#xff08;Set&#xff09;、映射&#xff08;Map&#xff09;&#xff0c;所有集合都扩展自Iterable特质。集合分为可变集合和不可变集合&#xff1a; 不可变集合&#xff1a;scala.collec…...

玄机靶场:apache日志分析

什么是Apache日志 Apache日志‌是Apache Web服务器在处理HTTP请求时记录的所有事件的详细信息。Apache是全球最受欢迎的Web服务器软件之一&#xff0c;支持约30.2%的所有活跃网站。Apache通过记录每次请求的信息&#xff0c;包括时间、来源IP、请求的资源等&#xff0c;帮助分…...

Laravel 使用 事件和监听器实现 数据状态变更

首先知道事件是什么 1.事件的概念 事件(Event)是 Laravel 中实现观察者模式的一种机制&#xff0c;它允许应用程序中的不同部分进行松耦合的通信。 通俗一点就是&#xff0c;发生在应用程序中的动作或者事情。例如&#xff1a; 用户注册成功后&#xff0c;需要发邮件&#…...

uniapp App页面通过 web-view 调用网页内方法

先是报这个错 A parser-blocking, cross site (i.e. different eTLD1) script, https://api.map.baidu.com/getscript?v3.0&akpgJsRF87Fjia&services&t20250225111334, is invoked via document.write. The network request for this script MAY be blocked by t…...

Daz3D角色UE5材质优化

解决Daz3D人物角色导入UE5后材质不真实的问题 1. 引言&#xff1a;跨平台3D资产传输中的材质保真度挑战 在当今的数字内容创作领域&#xff0c;对高质量3D人物角色的需求日益增长&#xff0c;广泛应用于游戏开发、电影制作、虚拟现实等多种应用场景。Daz3D因其丰富的人物模型…...

Android studio

问题&#xff1a;没有界面可以操作&#xff0c;页面没有hello wolrd 原因&#xff1a;gradle没同步完&#xff0c;依赖项没有下载完整&#xff0c;所以布局预览看不了...

Playwright快照测试:如何让UI回归测试变得轻松高效

引言 使用带有模拟数据的PlaywrightP快照可以显著提高UI回归测试的速度。它能够快速自动化检查三大主流浏览器&#xff08;Chromium、Firefox、Webkit&#xff09;中的 UI 元素。你可以将多个断言绑定到一个快照上&#xff0c;这极大地提高了 UI 测试的效率。在 GUI 应用快速扩…...

控制理论-传递函数

【硬核】终于有人把传递函数和卷积定理讲明白了&#xff01;自动控制原理入门-传递函数 | 卷积定理 | 频率响应 | 喵星考拉...

虚拟世界的AI魔法:AIGC引领元宇宙创作革命

云边有个稻草人-CSDN博客——个人主页 热门文章_云边有个稻草人的博客-CSDN博客——本篇文章所属专栏 ~ 欢迎订阅~ 目录 1. 引言 2. 元宇宙与虚拟世界概述 2.1 什么是元宇宙&#xff1f; 2.2 虚拟世界的构建 3. AIGC在元宇宙中的应用 3.1 AIGC生成虚拟世界环境 3.2 AIGC…...

带QT界面的文件管理系统

下载地址 下载&完整介绍地址&#xff1a;https://www.mcso.top/course-design/qt-filesystem/ 开源地址&#xff1a;https://github.com/mcdudu233/FileSystem.git 软件包含 &#xff08;1&#xff09;设计数据的结构 &#xff08;2&#xff09;设计文件管理系统 &…...

【区块链安全 | 第二十六篇】表达式与控制结构(二)

文章目录 表达式与控制结构赋值结构化赋值与返回多个值数组和结构体的赋值复杂性作用域和声明检查或不检查的算术运算错误处理:Assert、Require、Revert 和异常通过 assert 进行 Panic 和通过 require 进行 Errorreverttry/catch表达式与控制结构 赋值 结构化赋值与返回多个…...