企业级开发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.properties 或 application.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(嵌套类型,包含key和value)
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 模块,可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8,并提供示例代码。 1. 添加依赖: 首先,需要在 pom.xml 文件中添加 spring-data-e…...
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点,更新其…...
SpringBoot框架—启动原理
1.SpringBootApplication注解 在讲解启动原理之前先介绍一个非常重要的注解SpringBootApplication,这个注解在Springboot程序的入口文件Application.java中必须添加。SpringBootApplication是一个整合了三个核心注解的组合注解。 三个核心注解的作用机制࿱…...
Chapter 7: Compiling C++ Sources with CMake_《Modern CMake for C++》_Notes
Chapter 7: Compiling C Sources with CMake 1. Understanding the Compilation Process Key Points: Four-stage process: Preprocessing → Compilation → Assembly → LinkingCMake abstracts low-level commands but allows granular controlToolchain configuration (c…...
怎么检查网站CDN缓存是否生效
为什么要使用CDN缓存? 网站使用缓存可显著提升加载速度,减少服务器负载和带宽消耗,优化用户体验,增强架构稳定性,助力SEO优化,实现资源高效利用与性能平衡。 通过合理配置 CDN 缓存策略,可降低…...
【自然语言处理】深度学习中文本分类实现
文本分类是NLP中最基础也是应用最广泛的任务之一,从无用的邮件过滤到情感分析,从新闻分类到智能客服,都离不开高效准确的文本分类技术。本文将带您全面了解文本分类的技术演进,从传统机器学习到深度学习,手把手实现一套…...
vba讲excel转换为word
VBA将excel转换为word Sub ExportToWordFormatted() 声明变量Dim ws As Worksheet 用于存储当前活动的工作表Dim rng As Range 用于存储工作表的使用范围(即所有有数据的单元格)Dim rowCount As Long, colCount As Long 用于存储数据范围的行数和列数…...
ubuntu安装openWebUI和Dify【自用详细版】
系统版本:ubuntu24.04LTS 显卡:4090 48G 前期准备 先安装好docker和docker-compose,可以参考我之前文章安装: ubuntu安装docker和docker-compose【简单详细版】 安装openWebUI 先docker下载ollama docker pull ghcr.nju.edu.c…...
基于Flask的勒索病毒应急响应平台架构设计与实践
基于Flask的勒索病毒应急响应平台架构设计与实践 序言:安全工程师的防御视角 作为从业十年的网络安全工程师,我深刻理解勒索病毒防御的黄金时间法则——应急响应速度每提升1分钟,数据恢复成功率将提高17%。本文介绍的应急响应平台ÿ…...
Solidity基础入门—web3
Remix介绍 官网地址 Remix 是一个基于浏览器的 Solidity 开发环境,主要用于编写、测试、调试和部署以太坊智能合约。 Solidity基本数据类型 类型说明示例uint / int无符号 / 有符号整数uint256, int8, int256bool布尔类型(true / false)bo…...
spark数据清洗案例:流量统计
一、项目背景 在互联网时代,流量数据是反映用户行为和业务状况的重要指标。通过对流量数据进行准确统计和分析,企业可以了解用户的访问习惯、业务的热门程度等,从而为决策提供有力支持。然而,原始的流量数据往往存在格式不规范、…...
git commit时自动生成Change-ID
创建全局钩子目录: 创建一个全局的Git hooks目录: mkdir -p ~/.githooks 下载并设置commit-msg钩子脚本: 下载Gerrit的commit-msg钩子脚本,并放置在全局钩子目录中(如下载不了,可从本页面附件中下载,“…...
list的使用以及模拟实现
本章目标 1.list的使用 2.list的模拟实现 1.list的使用 在stl中list是一个链表,并且是一个双向带头循环链表,这种结构的链表是最优结构. 因为它的实现上也是一块线性空间,它的使用上是与string和vector类似的.但相对的因为底层物理结构上它并不像vector是线性连续的,它并没有…...
分布式防护节点秒级切换:实战配置与自动化运维
摘要:针对DDoS攻击导致节点瘫痪的问题,本文基于群联AI云防护的智能调度系统,详解如何实现节点健康检查、秒级切换与自动化容灾,并提供Ansible部署脚本。 一、分布式节点的核心价值 资源分散:攻击者难以同时击溃所有节…...
【今日三题】小乐乐改数字 (模拟) / 十字爆破 (预处理+模拟) / 比那名居的桃子 (滑窗 / 前缀和)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 小乐乐改数字 (模拟)十字爆破 (预处理模拟)比那名居的桃子 (滑窗 / 前缀和) 小乐乐改数字 (模拟) 小乐乐改数字…...
基于 Qt 的图片处理工具开发(一):拖拽加载与基础图像处理功能实现
一、引言 在桌面应用开发中,图片处理工具的核心挑战在于用户交互的流畅性和异常处理的健壮性。本文以 Qt为框架,深度解析如何实现一个支持拖拽加载、亮度调节、角度旋转的图片处理工具。通过严谨的文件格式校验、分层的架构设计和用户友好的交互逻辑&am…...
CentOS 7 yum 无法安装软件的解决方法
一、解决方法 1、备份原有的 CentOS 7 默认 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2、从阿里云镜像源下载 CentOS 7 的 YUM 源配置文件,并覆盖原有的配置文件 wget -O /etc/yum.repos.d/CentOS-Base.re…...
3DGS之光栅化
光栅化(Rasterization)是计算机图形学中将连续的几何图形(如三角形、直线等)转换为离散像素的过程,最终在屏幕上形成图像。 一、光栅化的核心比喻 像画家在画布上作画 假设你是一个画家,要把一个3D立方体画…...
44、Spring Boot 详细讲义(一)
Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…...
虽然理解git命令,但是我选择vscode插件!
文章目录 2025/3/11 补充一个项目一个窗口基本操作注意 tag合并冲突已有远程,新加远程仓库切换分支stash 只要了解 git 的小伙伴,应该都很熟悉这些指令: git init – 初始化git仓库git add – 把文件添加到仓库git commit – 把文件提交到仓库…...
【Pandas】pandas DataFrame head
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行 pandas.DataFrame.head pandas.DataFrame.head 是一个方法,用于返回 DataFrame 的前几行。这个方法非常有用,特别是在需要快速查看 DataFrame 的前…...
idea 打不开terminal
IDEA更新到2024.3后Terminal终端打不开的问题_idea terminal打不开-CSDN博客...
【JVM】JVM调优实战
😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!Ǵ…...
FPGA_DDR(二)
在下板的时候遇到问题 1:在写一包数据后再读,再写再读 这时候读无法读出 查看时axi_arready没有拉高 原因 : 由于读地址后没有拉高rready,导致数据没有读出卡死现象。 解决结果...
Genspark vs manus
1. 产品定位与核心技术 Genspark Super Agent 定位:由前百度高管景鲲创立的MainFunc公司推出,主打“快速、准确、可控”的通用AI Agent,强调从思考到执行的全闭环能力,聚焦复杂任务自动化(如旅行规划、电话预订)。 核心技术: 混合代理架构(MoA):集成8个不同规模的LL…...
【吾爱出品】[Windows] 鼠标或键盘可自定义可同时多按键连点工具
[Windows] 鼠标或键盘连点工具 链接:https://pan.xunlei.com/s/VONSFKLNpyVDeYEmOCBY3WZJA1?pwduik5# [Windows] 鼠标或键盘可自定义可同时多按键连点工具 就是个连点工具,功能如图所示,本人系统win11其他系统未做测试,自己玩…...
vue3实战一、管理系统之实战立项
目录 管理系统之实战立项对应相关文章链接入口:实战效果登录页:动态菜单:动态按钮权限白天黑夜模式:全屏退出全屏退出登录:菜单收缩: 管理系统之实战立项 vue3实战一、管理系统之实战立项:这个项…...
【MySQL 删除数据详解】
文章目录 一、前言二、MySQL 中的三种删除方式1. DELETE 语句✅ 基本语法:🔥 示例:删除指定行:删除所有数据:删除多行: 2. TRUNCATE 语句✅ 基本语法:🔥 示例: 3. DROP 语…...
设计模式 Day 6:深入讲透观察者模式(真实场景 + 回调机制 + 高级理解)
观察者模式(Observer Pattern)是一种设计结构中最实用、最常见的行为模式之一。它的魅力不仅在于简洁的“一对多”事件推送能力,更在于它的解耦能力、模块协作设计、实时响应能力。 本篇作为 Day 6,将带你从理论、底层机制到真实…...
C#异步方法返回Task<T>的同步调用
在C#中我们已经非常习惯使用async/await来实现异步调用,但是某些时候并不允许异步调用,比如在一个Dynamics365的插件或操作中 为了确保事务性是不允许异步调用的,这个时候在使用httpclient发起请求时我们就可以使用Task<T>.Result来实现线程阻塞,进行同步方式的调用: va…...
