ElasticsearchJavaClient工具类分析
最近升级了Elasticsearch版本,从7.X升级到8.X的变化还是比较大的,原来7版本用的是RestHighLevelClient,8.X弃用RestHighLevelClient转而支持ElasticsearchClient,并且api调用方式经过建造者模式的改造,变成了链式调用。
因此为了更好地使用ElasticsearchClient的api操作Elasticsearch,封装了一个工具类,包含了常用的一些数据操作的方法。废话不多说直接上代码。。。
1、pom依赖
<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.15.2</version></dependency><dependency><artifactId>elasticsearch-rest-client</artifactId><groupId>org.elasticsearch.client</groupId><version>8.15.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.30</version></dependency>
2、工具类代码
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.Result;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.Time;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.indices.AnalyzeRequest;
import co.elastic.clients.elasticsearch.indices.AnalyzeResponse;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.analyze.AnalyzeToken;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** Elasticsearch工具类* Elasticsearch版本:8.15.3*/
public class ElasticsearchJavaClient {private ElasticsearchClient client;/*** 构造方法,获取客户端(未开启认证)* @param httpUrls*/public ElasticsearchJavaClient(String[] httpUrls){HttpHost[] httpHosts = Arrays.stream(httpUrls).map(HttpHost::create).toArray(HttpHost[]::new);this.client = new ElasticsearchClient(new RestClientTransport(RestClient.builder(httpHosts).build(),new JacksonJsonpMapper()));}/*** 构造方法,获取客户端(开启认证,通过用户名密码进行认证并获取客户端)* @param httpUrls* @param username* @param password*/public ElasticsearchJavaClient(String[] httpUrls, String username, String password){HttpHost[] httpHosts = Arrays.stream(httpUrls).map(HttpHost::create).toArray(HttpHost[]::new);final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));RestClientBuilder builder = RestClient.builder(httpHosts);builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});this.client = new ElasticsearchClient(new RestClientTransport(builder.build(), new JacksonJsonpMapper()));}/*** 创建索引* @param indexName 索引名* @param numberOfShards 分片数* @param numberOfReplicas 副本数* @param mapping mapping设计json字符串* @return*/public boolean createIndex(String indexName, Integer numberOfShards,Integer numberOfReplicas, String mapping) {CreateIndexResponse response = null;try {response = client.indices().create(builder -> builder.index(indexName).settings(b -> b.numberOfReplicas(numberOfReplicas.toString()).numberOfShards(numberOfShards.toString())).mappings(a -> a.withJson(new StringReader(mapping))));} catch (IOException e) {e.printStackTrace();} finally {client.shutdown();}return response.acknowledged();}/*** 删除索引* @param indexName 索引名* @return*/public boolean deleteIndex(String indexName) {try {return client.indices().delete(a -> a.index(indexName)).acknowledged();} catch (IOException e) {e.printStackTrace();} finally {client.shutdown();}return false;}/*** 判断索引是否已存在* @param indexName 索引名* @return*/public boolean indexExisit(String indexName) {try {return client.indices().exists(req -> req.index(indexName)).value();} catch (IOException e) {e.printStackTrace();} finally {client.shutdown();}return false;}/*** 由于数据落盘有默认的1秒延迟,刷新后使数据能被检索到* @param indexString*/public void refresh(String indexString){try {client.indices().refresh(req -> req.index(indexString));} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}}/*** 插入数据* @param indexName* @param data* @return*/public String insertData(String indexName, JSONObject data){try {IndexResponse response = client.index(a -> a.index(indexName).document(data));return response.id();} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return null;}/*** 根据索引和_id查询数据* @param indexName* @param id* @return*/public Map<String, Object> getDocById(String indexName, String id) {GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));try {GetResponse<Map> response = client.get(request, Map.class);if(response.found()){return response.source();}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return null;}/*** 根据索引和_id查询数据* @param indexName* @param id* @return*/public JSONObject getDocInfoById(String indexName, String id) {GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));try {GetResponse<JSONObject> response = client.get(request, JSONObject.class);if(response.found()){return response.source();}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return null;}/*** 根据索引和_id查询数据,并过滤掉无需返回的字段* @param indexName* @param id* @param excludes* @return*/public JSONObject getDocInfoById(String indexName, String id, String [] excludes) {GetRequest request = GetRequest.of(g -> g.index(indexName).id(id).sourceExcludes(Arrays.asList(excludes)));try {GetResponse<JSONObject> response = client.get(request, JSONObject.class);if(response.found()){return response.source();}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return null;}/*** 根据索引和_id查询数据,并过指定要返回的字段* @param indexName* @param id* @param includes* @return*/public JSONObject getDocInfoByIdWithIncludes(String indexName, String id, String [] includes) {GetRequest request = GetRequest.of(g -> g.index(indexName).id(id).sourceIncludes(Arrays.asList(includes)));try {GetResponse<JSONObject> response = client.get(request, JSONObject.class);if(response.found()){return response.source();}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return null;}/*** 判断数据是否存在* @param indexName* @param id* @return*/public boolean exists(String indexName, String id) {GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));try {GetResponse<JSONObject> response = client.get(request, JSONObject.class);return response.found();} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 根据索引和_id删除数据* @param indexName* @param id* @return*/public boolean deleteDocById(String indexName, String id) {DeleteRequest request = DeleteRequest.of(a -> a.index(indexName).id(id));try {DeleteResponse response = client.delete(request);if(response != null && response.result() != null){return Result.Deleted.jsonValue().equals(response.result().jsonValue());}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 更新数据* @param indexName* @param id* @param newDoc* @return*/public boolean updateDocById(String indexName, String id, JSONObject newDoc) {UpdateRequest request = UpdateRequest.of(r -> r.id(id).index(indexName).doc(newDoc));request.refresh();try {UpdateResponse response = client.update(request, JSONObject.class);if(response != null && response.result() != null){return Result.Updated.jsonValue().equals(response.result().jsonValue());}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 对输入的text使用analyzerName进行分词,返回分词后的词项* @param analyzerName* @param text* @return*/public List<AnalyzeToken> analyze(String analyzerName, String text){AnalyzeRequest analyzeRequest = new AnalyzeRequest.Builder().analyzer(analyzerName).text(text).build();AnalyzeResponse response = null;try {response = client.indices().analyze(analyzeRequest);} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return response.tokens();}/*** 批量删除* @param requestList* @return*/public boolean bulkDelete(List<DeleteRequest> requestList){List<BulkOperation> ops = requestList.stream().map(req -> BulkOperation.of(op -> op.delete(d -> d.id(req.id()).index(req.index())))).collect(Collectors.toList());try {BulkResponse response = client.bulk(r -> r.operations(ops));if(response != null ){return true;}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 批量更新* @param requestList* @return*/public boolean bulkUpdate(List<UpdateRequest> requestList){List<BulkOperation> ops = requestList.stream().map(req -> BulkOperation.of(op -> op.update(d -> d.id(req.id()).index(req.index()).action(a -> a.doc(req.doc()))))).collect(Collectors.toList());try {BulkResponse response = client.bulk(r -> r.operations(ops));if(response != null ){return true;}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 批量插入数据* @param requestList* @return*/public boolean bulkInsert(List<IndexRequest> requestList){List<BulkOperation> ops = requestList.stream().map(req -> BulkOperation.of(op -> op.index(i -> i.document(req.document()).index(req.index())))).collect(Collectors.toList());try {BulkResponse response = client.bulk(r -> r.operations(ops));if(response != null ){return true;}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 通过脚本批量更新* @param index* @param query* @param script* @return*/public boolean updateByquery(String index, BoolQuery query, String script){try {UpdateByQueryResponse response = client.updateByQuery(q -> q.index(index).query(query._toQuery()).script(s -> s.source(script)));if(response != null ){return true;}} catch (IOException e) {e.printStackTrace();}finally {client.shutdown();}return false;}/*** 检索* @param indexName* @param pageNo* @param pageSize* @param sortField* @param sortOrder* @param boolQuery* @return*/public SearchResponse search(String indexName, Integer pageNo, Integer pageSize,String sortField, SortOrder sortOrder, BoolQuery boolQuery) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).from((pageNo - 1) * pageSize).size(pageSize).sort(s -> s.field(f -> f.field(sortField).order(sortOrder))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, Integer pageNo, Integer pageSize,String sortField, SortOrder sortOrder, BoolQuery boolQuery, String[] excludes) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes)))).from((pageNo - 1) * pageSize).size(pageSize).sort(s -> s.field(f -> f.field(sortField).order(sortOrder))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,String sortField, SortOrder sortOrder, String sortField2, SortOrder sortOrder2) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).from((pageNo - 1) * pageSize).size(pageSize).sort(s -> s.field(f -> f.field(sortField).order(sortOrder).field(sortField2).order(sortOrder2))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,String sortField, SortOrder sortOrder, String sortField2, SortOrder sortOrder2,String[] excludes) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes)))).from((pageNo - 1) * pageSize).size(pageSize).sort(s -> s.field(f -> f.field(sortField).order(sortOrder).field(sortField2).order(sortOrder2))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,String sortField, SortOrder sortOrder, String[] includes, String[] excludes) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes)).includes(Arrays.asList(includes)))).from((pageNo - 1) * pageSize).size(pageSize).sort(s -> s.field(f -> f.field(sortField).order(sortOrder))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,String sortField, SortOrder sortOrder, String time) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).from((pageNo - 1) * pageSize).size(pageSize).scroll(new Time.Builder().time(time).build()).sort(s -> s.field(f -> f.field(sortField).order(sortOrder))).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}/*** 查询符合条件的数据条数* @param indexName* @param boolQuery* @return*/public CountResponse count(String indexName, BoolQuery boolQuery) {try {return client.count(c -> c.index(indexName).query(q -> q.bool(boolQuery)));} catch (IOException e) {e.printStackTrace();}return null;}public SearchResponse search(String indexName, BoolQuery boolQuery) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}public SearchResponse search(String indexName, BoolQuery boolQuery, int size) {SearchRequest request = new SearchRequest.Builder().index(indexName).query(q -> q.bool(boolQuery)).size(size).build();SearchResponse response = null;try {response = client.search(request, JSONObject.class);} catch (IOException e) {e.printStackTrace();}return response;}
}
如果本文对你有帮助,请点赞、收藏 + 关注,谢谢!!(本文将持续更新)
相关文章:
ElasticsearchJavaClient工具类分析
最近升级了Elasticsearch版本,从7.X升级到8.X的变化还是比较大的,原来7版本用的是RestHighLevelClient,8.X弃用RestHighLevelClient转而支持ElasticsearchClient,并且api调用方式经过建造者模式的改造,变成了链式调用。…...
Docker-文章目录
为什么互联网公司离不开Docker容器化,它到底解决了什么问题? VMware下Centos7安装步骤 Windows安装Docker Linux安装Docker Docker快速安装Tomcat 在docker中对MySQL快速部署与初始数据 利用Dockerfile构建自定义镜像 Dockerfile基础指令 Docker…...
docker安装codeserver 运行vite项目(linux)
估计很多人遇到了codeserver安装后执行vite项目 有proxy路径的问题 我这边去掉了路径代理直接端口访问 防火墙记得打开 8089 和 5173端口 code-server路径 服务器ip:8089 项目路径 服务器ip:5173 docker安装codeserver(linux) mkdir -p ~/.config dock…...
Electron快速入门——跨平台桌面端应用开发框架
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
Delphi+SQL Server实现的(GUI)户籍管理系统
1.项目简介 本项目是一个户籍管理系统,用于记录住户身份信息,提供新户登记(增加)、户籍变更(修改)、户籍注销(删除)、户籍查询、曾用名查询、迁户记录查询以及创建备份、删除备份共8…...
【JavaEE进阶】获取Cookie/Session
🍀Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…...
在macOS上安装Flutter和环境配置
操作系统 Flutter 支持在 macOS 11 (Big Sur) 或更高版本上开发。本指南假定你的 Mac 默认运行 zsh shell。 如果你的 Mac 是 Apple silicon 处理器,那么有些 Flutter 组件就需要通过 Rosetta 2 来转换适配(详情)。要在 Apple silicon 处理器…...
【电子通识】PWM驱动让有刷直流电机恒流工作
电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作,其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时,电机会怎样工作呢࿱…...
Maven在不同操作系统上如何安装?
大家好,我是袁庭新。Maven是一个重要的工具,还有很多初学者竟然不知道如何安装Maven?这篇文章将系统介绍如何在Windows、macOS、Linux操作系统上安装Maven。 Maven是一个基于Java的项目管理工具。因此,最基本的要求是在计算机上安…...
maven如何从外部导包
1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮...
如何在 Hive SQL 中处理复杂的数据类型?
目录 一、复杂数据类型简介 二、创建表时使用复杂数据类型 三、插入数据到复杂数据类型的表 四、查询复杂数据类型...
数据结构:DisjointSet
Disjoint Sets意思是一系列没有重复元素的集合。一种常见的实现叫做,Disjoint-set Forest可以以接近常数的时间复杂度查询元素所属集合,用来确定两个元素是否同属一个集合等,是效率最高的常见数据结构之一。 Wiki链接:https://en…...
中国省级产业结构高级化及合理化数据测算(2000-2023年)
一、数据介绍 数据名称:中国省级产业结构高级化、泰尔指数 数据年份:2000-2023年 数据范围:31个省份 数据来源:中国统计年鉴、国家统计局 数据整理:内含原始版本、线性插值版本、ARIMA填补版本 数据说明…...
Nginx不使用域名如何配置证书
如果你不打算使用域名而是使用 IP 地址来配置 Nginx 的 SSL 证书,你会遇到一个问题,因为 SSL/TLS 证书通常是为特定的域名颁发的,而不是 IP 地址。虽然可以为 IP 地址生成证书,但大多数证书颁发机构(CA)不支…...
Perturbed-Attention Guidance(PAG) 笔记
Self-Rectifying Diffusion Sampling with Perturbed-Attention Guidance Github 摘要 近期研究表明,扩散模型能够生成高质量样本,但其质量在很大程度上依赖于采样引导技术,如分类器引导(CG)和无分类器引导ÿ…...
自动驾驶控制与规划——Project 6: A* Route Planning
目录 零、任务介绍一、算法原理1.1 A* Algorithm1.2 启发函数 二、代码实现三、结果分析四、效果展示4.1 Dijkstra距离4.2 Manhatten距离4.3 欧几里德距离4.4 对角距离 五、后记 零、任务介绍 carla-ros-bridge/src/ros-bridge/carla_shenlan_projects/carla_shenlan_a_star_p…...
通俗易懂之线性回归时序预测PyTorch实践
线性回归(Linear Regression)是机器学习中最基本且广泛应用的算法之一。它不仅作为入门学习的经典案例,也是许多复杂模型的基础。本文将全面介绍线性回归的原理、应用,并通过一段PyTorch代码进行实践演示,帮助读者深入…...
[离线数仓] 总结二、Hive数仓分层开发
接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…...
页面顶部导航栏(Navbar)的功能(Navbar/index.vue)
这段代码是一个 Vue.js 组件,实现了页面顶部导航栏(Navbar)的功能。我将分块分析它的各个部分: 模板 (Template): <!-- spid-admin/src/layout/components/Navbar/index.vue --> <template><div class"navb…...
thinnkphp5.1和 thinkphp6以及nginx,apache 解决跨域问题
ThinkPHP 5.1 使用中间件设置响应头 ThinkPHP 5.1 及以上版本支持中间件,可以通过中间件统一设置跨域响应头。 步骤: 创建一个中间件文件,例如 CorsMiddleware.php: namespace app\middleware;class CorsMiddleware {public fu…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
