Springboot集成Elasticsearch High Level REST Client实现增删改查实战

在这里插入图片描述

获取源码🚩

需要完整代码资料,请一键三连后评论区留下邮箱,安排发送!!!🤖

什么是High Level REST Client?

Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch 进行交互的 Java 客户端库,它提供了比低级别的 REST 客户端更高级别的抽象。High Level REST Client 使用了 OkHttp 库作为底层的 HTTP 客户端,并且提供了自动重试、连接管理和错误处理等功能。它允许开发人员以面向对象的方式构建请求和解析响应,从而简化了与 Elasticsearch 的 REST API 的交互过程。

✔️优点:

  • 易用性:High Level REST Client 提供了丰富的 API,使得常见的 Elasticsearch 操作变得简单直观。
  • 自动重试和错误处理:它能够处理网络故障和重试失败的请求,减少了开发人员需要处理的异常情况。
  • 封装了 JSON 处理:它自动处理了请求和响应的序列化和反序列化,使得开发人员无需直接处理 JSON 字符串。
  • 连接管理:它提供了连接池管理,可以复用连接,提高性能。

❌缺点:

  • 依赖较大:由于其提供了丰富的功能,因此其依赖库和整体大小相对较大。
  • 性能开销:高层面的抽象可能会引入额外的性能开销,尤其是在高并发场景下。

High Level REST Client的核心

索引管理

CreateIndexRequest 和 CreateIndexResponse:用于创建一个新的索引。
GetIndexRequest 和 GetIndexResponse:用于获取索引的元数据。
DeleteIndexRequest 和 DeleteIndexResponse:用于删除一个索引。

文档操作

IndexRequest 和 IndexResponse:用于索引(或更新)一个文档。
UpdateRequest 和 UpdateResponse:用于更新已存在的文档。
GetRequest 和 GetResponse:用于检索一个文档。
DeleteRequest 和 DeleteResponse:用于删除一个文档。

搜索和聚合

SearchRequest 和 SearchResponse:用于执行搜索查询和聚合。
CountRequest 和 CountResponse:用于计算满足给定条件的文档数量。
ScrollRequest 和 ScrollResponse:用于滚动搜索结果,获取大量数据。

批量操作

BulkRequest 和 BulkResponse:用于执行批量操作,如批量索引、更新或删除多个文档。

request.source()等于DSL中query{}

Sprinboot集成High Level REST Client

创建索引

可以使用postman或者谷歌浏览器插件Elasticvue 创建:
在这里插入图片描述

{"article_doc": {"aliases": {},"mappings": {"properties": {"author": {"type": "keyword"},"category": {"type": "keyword"},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"createTime": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"},"id": {"type": "keyword"},"readCount": {"type": "integer"},"title": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}},"settings": {"index": {"routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"number_of_shards": "1","provided_name": "article_doc","creation_date": "1721725035763","number_of_replicas": "1","uuid": "r55CXBCLSxO8aFWPtL1Niw","version": {"created": "7130299"}}}}
}

添加pom依赖

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.14.0</version>
</dependency><dependency><groupId> org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version>
</dependency>

编写配置类

@Configuration
public class ElasticsearchConfig {@Value("${elasticsearch.host}")private String host;@Value("${elasticsearch.port}")private int port;/*@Value("${elasticsearch.username}")private String userName;@Value("${elasticsearch.password}")private String password;*//*** 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名*/@Beanpublic RestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(RestClient.builder(new HttpHost(host, port, "http")));}}

编写模型

@Data
@TableName("tb_article")
public class Article {private String id;private String author;private String category;private String title;private String content;private Integer readCount;@JSONField(format = "yyyy-MM-dd HH:mm:ss")private Date createTime;
}

编写接口服务类

获取索引结构接口

http://localhost:9000/articleDoc/getMapping
在这里插入图片描述

数据同步接口

/***  批量从数据库导入* @throws IOException*/public void importFromDb() throws IOException {List<Article> articleList = articleService.list();BulkRequest bulkRequest = new BulkRequest();for (Article doc : articleList) {String data = JSON.toJSONString(doc);IndexRequest indexRequest = new IndexRequest(Constant.ARTICLE_INDEX);indexRequest.id(doc.getId()).source(data, XContentType.JSON);bulkRequest.add(indexRequest);}BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);log.info("批量导入状态:{}, 耗时{}", response.status(), response.getTook().getSeconds());}

在这里插入图片描述

精确查询

public List<Article> searchByAuthor(String author) {try {// 构建查询条件(注意:termQuery 支持多种格式查询,如 boolean、int、double、string 等,这里使用的是 string 的查询)SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.termQuery("author", author));SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);// 执行查询,然后处理响应结果SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 根据状态和数据条数验证是否返回了数据List<Article> articleList = new ArrayList<>();if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {Article doc = JSON.parseObject(hit.getSourceAsString(), Article.class);articleList.add(doc);}}return articleList;} catch (IOException e) {log.error("精确查询异常:", e);return null;}}

在这里插入图片描述

全文查询

  • 查全部,
    java MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
    太简单,不再演示。
/***  全文查询*/public List<Article> matchQuery(String keyword) {try {// 构建查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.multiMatchQuery(keyword,"title","content"));// 创建查询请求对象,将查询对象配置到其中SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);// 执行查询,然后处理响应结果SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);return getArticleListFromSearchResponse(searchResponse);} catch (IOException e) {log.error("全文查询异常", e);return null;}}

在这里插入图片描述

分页查询(带排序)

/***  分页查询* @param page*/public void pageSortQuery(Page<Article> page) {try {// 构建查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();// 创建查询源构造器SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchAllQueryBuilder);// 设置分页searchSourceBuilder.from((int) ((page.getCurrent()-1)*page.getSize()));searchSourceBuilder.size((int) page.getSize());// 按照阅读量排序searchSourceBuilder.sort("readCount", SortOrder.DESC);// 创建查询请求对象,将查询对象配置到其中SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);// 执行查询,然后处理响应结果SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 根据状态和数据条数验证是否返回了数据page.setTotal(getHitTotal(searchResponse));page.setRecords(getArticleListFromSearchResponse(searchResponse));} catch (IOException e) {log.error("分页查询失败", e);}}

在这里插入图片描述

高亮查询✨

public List<Article> highlightQuery(String keyword) {try {MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", keyword);HighlightBuilder highlightBuilder = new HighlightBuilder().field("title").preTags("<font color='red'>").postTags("</font>");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchQueryBuilder);searchSourceBuilder.highlighter(highlightBuilder);searchSourceBuilder.size(100);SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);List<Article> articleList = new ArrayList<>();if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {Article doc = JSON.parseObject(hit.getSourceAsString(), Article.class);// 获取高亮的数据HighlightField highlightField = hit.getHighlightFields().get("title");System.out.println("高亮名称:" + highlightField.getFragments()[0].string());// 替换掉原来的数据Text[] fragments = highlightField.getFragments();if (fragments != null && fragments.length > 0) {StringBuilder title = new StringBuilder();for (Text fragment : fragments) {title.append(fragment);}doc.setTitle(title.toString());}articleList.add(doc);}}return articleList;} catch (Exception e) {log.error("高亮查询失败", e);return null;}}

在这里插入图片描述

范围查询

/***  范围查询*  时间文档表达式:https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math* @return*/public List<Article> rangeQuery() {try {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//searchSourceBuilder.query(QueryBuilders.rangeQuery("price").gte(10000));searchSourceBuilder.query(QueryBuilders.rangeQuery("createTime").gte("now-2d").includeLower(true).includeUpper(true));SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);return getArticleListFromSearchResponse(searchResponse);} catch (Exception e) {log.error("范围查询失败", e);return null;}}

在这里插入图片描述

布尔查询(BooleanQuery)

bool 查询可以用来合并多个条件查询结果的布尔逻辑,它包含一下操作符:

must:多个查询条件必须完全匹配,相当于关系型数据库中的 and。
should:至少有一个查询条件匹配,相当于关系型数据库中的 or。
must_not: 多个查询条件的相反匹配,相当于关系型数据库中的 not。
filter:过滤满足条件的数据。
range:条件筛选范围。
gt:大于,相当于关系型数据库中的 >。
gte:大于等于,相当于关系型数据库中的 >=。
lt:小于,相当于关系型数据库中的 <。
lte:小于等于,相当于关系型数据库中的 <=。

public List<Article> highlightQuery(String keyword) {try {MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", keyword);HighlightBuilder highlightBuilder = new HighlightBuilder().field("title").preTags("<font color='red'>").postTags("</font>");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchQueryBuilder);searchSourceBuilder.highlighter(highlightBuilder);searchSourceBuilder.size(100);SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);List<Article> articleList = new ArrayList<>();if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {SearchHits hits = searchResponse.getHits();for (SearchHit hit : hits) {Article doc = JSON.parseObject(hit.getSourceAsString(), Article.class);// 获取高亮的数据HighlightField highlightField = hit.getHighlightFields().get("title");System.out.println("高亮名称:" + highlightField.getFragments()[0].string());// 替换掉原来的数据Text[] fragments = highlightField.getFragments();if (fragments != null && fragments.length > 0) {StringBuilder title = new StringBuilder();for (Text fragment : fragments) {title.append(fragment);}doc.setTitle(title.toString());}articleList.add(doc);}}return articleList;} catch (Exception e) {log.error("高亮查询失败", e);return null;}}

在这里插入图片描述

聚合查询

在使用Elasticsearch时,更多会用到聚合操作,它类似SQL中的groupby操作。ES的聚合查询是先查出结果,然后对结果使用聚合函数做处理,常用的操作有:avg:求平均、max:最大值、min:最小值、sum:求和等。

在ES中聚合分为指标聚合和分桶聚合:

Metric 指标聚合:指标聚合对一个数据集求最大、最小、和、平均值等
Bucket 分桶聚合:除了有上面的聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行游标聚合。

  • Metric 指标聚合
/***  指标查询*/public int metricQuery() {try {MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchAllQueryBuilder);AggregationBuilder mostPopular = AggregationBuilders.max("mostPopular").field("readCount");searchSourceBuilder.aggregation(mostPopular);SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//            log.info("查询结果:{}", JSON.toJSONString(searchResponse));Aggregations aggregations = searchResponse.getAggregations();ParsedMax max = aggregations.get("mostPopular");return (int) max.getValue();} catch (Exception e) {log.error("指标查询失败", e);return -1;}}

在这里插入图片描述

  • Bucket 分桶聚合

根据文章分类,统计文章数量。

/***  分桶聚合* @return*/public Map<String,Object> bucketQuery() {try {// 构建查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();// 创建查询源构造器SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(matchAllQueryBuilder);// 根据商品分类进行分组查询TermsAggregationBuilder categoryGroup = AggregationBuilders.terms("categoryGroup").field("category");searchSourceBuilder.aggregation(categoryGroup);// 创建查询请求对象,将查询对象配置到其中SearchRequest searchRequest = new SearchRequest(Constant.ARTICLE_INDEX);searchRequest.source(searchSourceBuilder);// 执行查询,然后处理响应结果SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);Aggregations aggregations = searchResponse.getAggregations();ParsedStringTerms agg = aggregations.get("categoryGroup");Map<String,Object> resultMap = new HashMap<>();for (Terms.Bucket bucket : agg.getBuckets()) {resultMap.put(bucket.getKeyAsString(), bucket.getDocCount());}return resultMap;} catch (Exception e) {log.error("分桶聚合查询失败", e);return null;}}

在这里插入图片描述

为什么8.0版本要弃用?

在 Elasticsearch 8.0 版本中,High Level REST Client 被标记为弃用,主要是因为以下几个原因:

  • 维护成本:High Level REST Client 的维护成本较高,因为它需要随着 Elasticsearch 的发展而持续更新,以保持与 REST API 的兼容性。
  • 性能考量:为了提高性能和减少内存消耗,Elasticsearch 开发团队决定移除一些高成本的组件,High Level REST Client 因其封装层次较多而成为目标之一。
  • 替代方案:Elasticsearch 推出了新的 Java API Client,这是一个更轻量级、更高效的选择,它直接使用了 Elasticsearch 的内部协议,从而提供了更好的性能和更低的延迟。
    新的 Java API Client 能够更好地利用 Elasticsearch 的内部机制,减少序列化和反序列化的开销,同时也提供了更细粒度的控制和更高的灵活性。因此,Elasticsearch 推荐用户迁移到新的 Java API Client 上。

所以后续我会再整理个新的Java API Client 用法。与时俱进。

点赞收藏加评论

用到的时候再来看,收获更大。

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

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

相关文章

2024安全大模型技术与市场研究报告

大模型驱动的AIGC引发技术革命&#xff0c;国资委强调国企需加大AI投入。大模型解决网络安全行业攻防不对等问题&#xff0c;国内外企业纷纷推出基于大模型的网络安全产品&#xff0c;AI将改变网络安全产品格局。 自 2022 年底开始&#xff0c;以 LLM(大语言模型&#xff0c;简…

python-实践简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数&#xff1a; import pygame import time import random 游戏源码&#xff1a; import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

{Spring Boot 原理篇} Spring Boot自动装配原理

SpringBootApplication 1&#xff0c;Spring Boot 应用启动&#xff0c;SpringBootApplication标注的类就是启动类&#xff0c;它去实现配置类中的Bean的自动装配 SpringBootApplication public class SpringbootRedis01Application {public static void main(String[] args)…

计算word文件打印页数 VBA实现

目录 场景复现环境说明实现原理计算当前文件夹下所有word文件页数总和利用递归计算当前文件夹所有work文件页面数量几个BUG计算结果软件报价后话 场景复现 最近需要帮我弟打印高考资料&#xff0c;搜集完资料去网上打印&#xff0c;商家发出了这个计算页数的界面。我就好奇怎么…

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom

【Tomcat】Mac M3 Pro安装Tomcat7

文章目录 下载配置环境变量修改权限启动和关闭 下载 官网&#xff1a;https://tomcat.apache.org/ cd ~/Library tar -zxvf /Users/用户名/Downloads/apache-tomcat-7.0.99.tar.gz mv apache-tomcat-7.0.99 ~/Library/tomcat配置环境变量 vi ~/.bash_profileexport TOMCAT…

Oracle核心进程详解并kill验证

Oracle核心进程详解并kill验证 文章目录 Oracle核心进程详解并kill验证一、说明二、核心进程详解2.1.PMON-进程监控进程2.2.SMON-系统监控进程2.3.DBWn-数据库块写入进程2.4. LGWR-日志写入器进程2.5. CKPT-检查点进程 三、Kill验证3.1.kill ckpt进程3.2.kill pmon进程3.3.kill…

【OpenCV C++20 学习笔记】操作图片

操作图片 概述图片的导入和保存对导入的图片的操作获取像素值Point类型和图片像素 内存管理和引用计数一些简便操作图片可视化更精确的类型转换 概述 在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例&#xff08;《图片处理基础》&#xff09;&#xff0c;这篇文章…

破局产品同质化:解锁3D交互式营销新纪元!

近年来&#xff0c;随着数字体验经济的蓬勃发展&#xff0c;3D交互式营销作为一种创新手段迅速崛起&#xff0c;它巧妙地解决了传统产品展示中普遍存在的缺乏差异性和互动性的问题&#xff0c;使您的产品在激烈的市场竞争中独树一帜&#xff0c;脱颖而出。 若您正面临产品营销…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展&#xff0c;网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市&#xff0c;网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站&#xff0c;作为杭州的重要交通枢纽&#xff0c;网约车管理显得尤为重要。近日&#xff0c;沧穹科技郑重宣告已助力…

photoshop学习笔记——选区2 套索工具

套索工具 快捷键 L shift L 在3中套索工具间切换 套索工具有3种 套索工具 按下鼠标左键绘制选取&#xff0c;松开后自动闭合&#xff0c;完成选取绘制 多边形套索工具 按下鼠标左键绘制定位点&#xff0c;点与点之间用直线连接&#xff0c;使用back键删除上一个点&#x…

外行对自动驾驶汽车的一些想法-2024-

起源 前段时间有关于自动驾驶汽车的讨论&#xff0c;现在热度终于快过去了。 (⊙﹏⊙) 其实&#xff0c;完全不用担心自动驾驶取代人类。 引用 这是一篇24年4月的报道。 上图为引用&#xff0c;可以看到打工人的忙碌。 2023 一个热爱自动驾驶但妥妥外行之人的思考-2023-C…

Pytorch使用教学7-张量的广播

PyTorch中的张量具有和NumPy相同的广播特性&#xff0c;允许不同形状的张量之间进行计算。 广播的实质特性&#xff0c;其实是低维向量映射到高维之后&#xff0c;相同位置再进行相加。我们重点要学会的就是低维向量如何向高维向量进行映射。 相同形状的张量计算 虽然我们觉…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…

霍尔传感器介绍

霍尔传感器概述 霍尔传感器是一种基于霍尔效应原理的传感器&#xff0c;‌广泛应用于各种电子和工业领域。‌ 霍尔传感器的工作原理基于霍尔效应&#xff0c;‌即当电流通过一个位于磁场中的导体时&#xff0c;‌在导体两侧会产生电势差。‌这种效应由美国物理学家爱德华霍尔…

“真互动”线上艺术空间,为艺术展览注入新活力!

在数字技术蓬勃发展的浪潮中&#xff0c;线上艺术展览作为艺术界的一股新兴力量&#xff0c;正以其独特的魅力重塑展览形态。相较于传统线下艺术展的复杂筹备与地域限制&#xff0c;线上艺术展凭借其高效的时间空间利用、无界限的沉浸式探索&#xff0c;赋予观众前所未有的艺术…

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …

UE4调试UE4Editor-Cmd.exe

在工作中&#xff0c;我们看到这样的构建命令&#xff1a; %EnginePath%\Binaries\Win64\UE4Editor-Cmd.exe %ClientPath%\%ProjectName%.uproject -runHotPatcher {其它参数} 我们应该如何调试UE4Editor-Cmd.exe呢&#xff1f;其实调试 UE4Editor.exe 就可以了&#xff08;参考…

全球模块化机器人市场展望与未来增长机遇预测:未来六年CAGR为14.9%

在全球自动化和智能化水平提升的背景下&#xff0c;模块化机器人正成为市场的焦点。本文详细分析了全球模块化机器人市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2023年&am…