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

Elasticsearch 之 ElasticsearchRestTemplate 聚合查询

前言:

上一篇我们分享了 ElasticsearchRestTemplate 的常用普通查询,本篇我们使用 ElasticsearchRestTemplate 来完成 Elasticsearch 更为复杂的聚合查询。

Elasticsearch 系列文章传送门

Elasticsearch 基础篇【ES】

Elasticsearch Windows 环境安装

Elasticsearch 之 ElasticsearchRestTemplate 普通查询

聚合查询

聚合查询是指从数据中提取统计信息,聚合又可以分为以下三类:

  • 度量聚合:度量聚合其实就是计算平均值、求和、计数、最大值、最小值等的聚合查询。
  • 桶聚合:桶聚合其实就是按指定的字段进行分组后聚合,例如先按汽车类型分类后,求汽车平均价格。
  • 嵌套聚合:嵌套聚合其实就在嵌套二字中,也就是文档的嵌套,比如汽车除了一些主要信息之外,还有一些次要零部件的信息,在汽车主信息中嵌套一个次要的车载手机支架信息文档对象,当我们需要统计某个汽车类型的车载手机支架信息的时候,就需要使用到嵌套聚合了。

度量聚合

Max(最大值查询)

查询最大值是一个非常常见的业务场景,而查询最大值就需要使用到聚合查询了,聚合查询需要使用到 AggregationBuilders,使用 ElasticsearchRestTemplate 完成最大值查询代码如下:

public double carMaxPrice() {MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxPrice").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(maxAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();double maxPrice = 0;if (aggregations != null) {Max max = aggregations.get("maxPrice");maxPrice = max.getValue();}return maxPrice;
}

Min(最小值查询)

查询最小值是一个非常常见的业务场景,而查询最小值就需要使用到聚合查询了,聚合查询需要使用到 AggregationBuilders,使用 ElasticsearchRestTemplate 完成最小值查询代码如下:

public double carMinPrice() {MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("minPrice").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(minAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();double minPrice = 0;if (aggregations != null) {Min min = aggregations.get("minPrice");minPrice = min.getValue();}return minPrice;
}

Avg(平均值查询)

计算平均值是一个非常常见的业务场景,如果没有聚合查询我们就需要把目标数据全部查询出来之后,在进行求平均操作,而 Elasticsearch 给我们提供了平均值的聚合查询方法,查询平均值的代码如下:

public double carAvgPrice() {AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avgPrice").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(avgAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();double avgPrice = 0;if (aggregations != null) {Avg avg = aggregations.get("avgPrice");avgPrice = avg.getValue();}return avgPrice;
}

Sum(求和查询)

计算求和是一个非常常见的业务场景,如果没有聚合查询我们就需要把目标数据全部查询出来之后,在进行求和操作,而 Elasticsearch 给我们提供了求和的聚合查询方法,代码如下:

public double carSumPrice() {SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sumPrice").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(sumAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();double sumPrice = 0;if (aggregations != null) {Sum sum = aggregations.get("sumPrice");sumPrice = sum.getValue();}return sumPrice;
}

Max、Min(同时查询最大、最小值)

前面我们分别演示了最大值、最小值、平均值、求和的场景,其实如果有同时要求最大值、最小值、平均值、求和的场景的时候,我们只可以在同一次查询得到结果的,代码如下:

public void aggregationCarPrice() {MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxPrice").field("price");MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("minPrice").field("price");AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avgPrice").field("price");SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sumPrice").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(maxAggregationBuilder).addAggregation(minAggregationBuilder).addAggregation(avgAggregationBuilder).addAggregation(sumAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();double maxPrice = 0;if (aggregations != null) {Max max = aggregations.get("maxPrice");maxPrice = max.getValue();Min min = aggregations.get("minPrice");double minPrice = min.getValue();Avg avg = aggregations.get("avgPrice");double avgPrice = avg.getValue();Sum sum = aggregations.get("sumPrice");double sumPrice = sum.getValue();log.info("汽车最贵价格:{},汽车最便宜价格:{},汽车平均价格:{},汽车价格之和:{}", maxPrice, minPrice, avgPrice, sumPrice);}
}

可以看到我们使用一次查询就可以得到最大值、最小值、平均值、求和。

桶聚合

数值类字段桶聚合

我们统计一下不同价格的汽车各有多少个,实现这个业务也需要使用聚合查询,代码如下:

public void categoryPriceCountCar() {TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("priceCount").field("price");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(termsAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();if (aggregations != null) {Terms terms = (Terms) aggregations.asMap().get("priceCount");for (Terms.Bucket bucket : terms.getBuckets()) {String price = bucket.getKeyAsString();long priceCount = bucket.getDocCount();log.info("汽车价格:{},有:{} 辆", price, priceCount);}}
}

字符串类型字段桶聚合

我们统计一下不同颜色的汽车各有多少辆,实现这个业务也需要使用聚合查询,使用按价格统计的方式来实现,代码如下:

public void categoryColorCountCar() {TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("colorCount").field("color");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(termsAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();if (aggregations != null) {Terms terms = (Terms) aggregations.asMap().get("colorCount");for (Terms.Bucket bucket : terms.getBuckets()) {String color = bucket.getKeyAsString();long colorCount = bucket.getDocCount();log.info("汽车颜色:{},有:{} 辆", color, colorCount);}}
}

执行上述代码我们发现控制台报错如下:

org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [color] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:496) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:407) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:437) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:407) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:437) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.ElasticsearchException.failureFromXContent(ElasticsearchException.java:603) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.rest.BytesRestResponse.errorFromXContent(BytesRestResponse.java:179) ~[elasticsearch-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1892) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1869) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1626) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1583) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1553) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.elasticsearch.client.RestHighLevelClient.search(RestHighLevelClient.java:1069) ~[elasticsearch-rest-high-level-client-7.9.3.jar:7.9.3]at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.lambda$search$10(ElasticsearchRestTemplate.java:256) ~[spring-data-elasticsearch-4.1.8.jar:4.1.8]at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.execute(ElasticsearchRestTemplate.java:343) ~[spring-data-elasticsearch-4.1.8.jar:4.1.8]at org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate.search(ElasticsearchRestTemplate.java:256) ~[spring-data-elasticsearch-4.1.8.jar:4.1.8]at org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate.search(AbstractElasticsearchTemplate.java:446) ~[spring-data-elasticsearch-4.1.8.jar:4.1.8]at com.order.service.service.impl.CarEsServiceImpl.categoryColorCountCar(CarEsServiceImpl.java:288) ~[classes/:na]at com.order.service.controller.ElasticsearchController.categoryColorCountCar(ElasticsearchController.java:164) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.6.jar:5.3.6]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.6.jar:5.3.6]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.6.jar:5.3.6]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.6.jar:5.3.6]at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.6.jar:5.3.6]at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.45.jar:4.0.FR]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.6.jar:5.3.6]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.6.jar:5.3.6]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) ~[spring-boot-actuator-2.4.5.jar:2.4.5]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.6.jar:5.3.6]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.6.jar:5.3.6]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.45.jar:9.0.45]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.45.jar:9.0.45]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.45.jar:9.0.45]at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]

错误的核心信息如下:

[type=illegal_argument_exception, reason=Fielddata is disabled on text fields by default. Set fielddata=true on [color] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.]

大概得意思就是 color 这个字段有问题,上面我们使用 price 字段就可以,为啥 color 字段就有问题呢?

原因是因为 price 是数值类型的字段,而 color 是 text 类型的字段,在 Elasticsearch 中 text 类型的字段不能直接进行分组聚合,我们需要将其标记为 keyword 类型的字符串可以分组聚合。

在字段上增加如下如下注解:

//颜色
@Field(store = true, type = FieldType.Keyword)
private String color;

同时修改查询代码如下:

public void categoryColorCountCar() {TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("colorCount").field("color.keyword");NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();NativeSearchQuery build = queryBuilder.withQuery(QueryBuilders.matchAllQuery()).addAggregation(termsAggregationBuilder).build();SearchHits<CarDO> search = elasticsearchRestTemplate.search(build, CarDO.class);Aggregations aggregations = search.getAggregations();if (aggregations != null) {Terms terms = (Terms) aggregations.asMap().get("colorCount");for (Terms.Bucket bucket : terms.getBuckets()) {String color = bucket.getKeyAsString();long colorCount = bucket.getDocCount();log.info("汽车颜色:{},有:{} 辆", color, colorCount);}}
}

执行结果如下:

2024-12-30 20:43:58.621  INFO 42108 --- [nio-8086-exec-2] c.o.s.service.impl.CarEsServiceImpl      : 汽车颜色:钻石黑,有:2 辆
2024-12-30 20:43:58.621  INFO 42108 --- [nio-8086-exec-2] c.o.s.service.impl.CarEsServiceImpl      : 汽车颜色:雅灰,有:2 辆

执行结果如何预期,上述编码的重点在 color.keyword,我们在查询的字段后面要带上 keyword。

嵌套聚合查询本篇暂不讲,在实现嵌套聚合查询的时候踩了很多坑,找了多种解决方法才实现,下一篇会对嵌套查询场景单独分享。

总结:本篇简单分享了使用 ElasticsearchRestTemplate 实现 Elasticsearch 的各种聚合查询,希望可以帮助到对 ElasticsearchRestTemplate API 使用不熟悉的朋友们。

如有不正确的地方欢迎各位指出纠正。

相关文章:

Elasticsearch 之 ElasticsearchRestTemplate 聚合查询

前言&#xff1a; 上一篇我们分享了 ElasticsearchRestTemplate 的常用普通查询&#xff0c;本篇我们使用 ElasticsearchRestTemplate 来完成 Elasticsearch 更为复杂的聚合查询。 Elasticsearch 系列文章传送门 Elasticsearch 基础篇【ES】 Elasticsearch Windows 环境安装…...

基础认证-单选题(一)

单选题 1、下列关于request方法和requestlnStream方法说法错误的是(C) A 都支持取消订阅响应事件 B 都支持订阅HTTP响应头事件 C 都支持HttpResponse返回值类型 D 都支持传入URL地址和相关配置项 2、如需修改Text组件文本的透明度可通过以下哪个属性方法进行修改 (C) A dec…...

DeepSeek算法研发闭环解析:如何打造持续进化的AI生产线?

摘要&#xff1a;在AI模型快速迭代的今天&#xff0c;如何构建一个高效、自优化的算法研发体系&#xff1f;DeepSeek通过独特的"数据-训练-评估-部署"闭环架构&#xff0c;实现了AI模型的持续进化。本文将深入剖析其核心设计逻辑与工程实现细节&#xff0c;揭秘支撑千…...

python项目整体文件和依赖打包

python项目整体文件和依赖打包 python项目整体文件和依赖打包 python项目整体文件和依赖打包 准备工作&#xff1a;扫描项目中必要的依赖包 pip install pipreqs pipreqs . 会有一些警告包&#xff0c;需要pip list进行版本修正,这里是三个包第一步&#xff1a;在虚拟环境中安…...

logstash收集数据

防止ES的的I/O的压力过大&#xff0c;使用redis/kafka进行缓冲。 对redis的要求 Redis input plugin | Logstash Reference [8.17] | Elastic 一般企业要求的架构 我实现的架构 filebeat把数据传给logstash 配置好filebeat把收集到的数据输入到redis 然后执行命令&#xff0…...

智能运维时代的网络拓扑管理:乐维监控的架构可视化实践

在数字化转型的浪潮中&#xff0c;企业IT基础设施正经历着前所未有的复杂化进程。当数以千计的网络设备、服务器、存储系统构成庞大网络体系时&#xff0c;如何实现全局可视化管理已成为企业数字化转型的关键命题。乐维监控网络拓扑系统作为新一代智能运维平台的核心组件&#…...

spring batch 中JpaNamedQueryProvider、JpaNativeQueryProvider两种查询方式对比

完整代码示例&#xff1a;对比两种查询方式 // Employee.java 实体类&#xff08;包含命名查询&#xff09; Entity NamedQuery(name "Employee.findAllNamedQuery", query "SELECT e FROM Employee e ORDER BY e.id") // 定义命名查询 public class Em…...

Spring项目中使用EasyExcel实现Excel 多 Sheet 导入导出功能(完整版)

Excel 多 Sheet 导入导出功能完整实现指南 一、环境依赖 1. Maven 依赖 <!-- EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> </dependency>…...

OkHttp的拦截器是如何工作的?

OkHttp 的拦截器是其核心特性之一,它允许开发者在请求和响应的处理过程中插入自定义逻辑。下面为你详细介绍 OkHttp 拦截器的工作原理、分类及执行流程。 拦截器工作原理概述 OkHttp 中的拦截器本质上是实现了Interceptor接口的类。该接口定义了一个intercept方法,在这个方…...

CentOS 7 安装 EMQX (MQTT)

CentOS 7 安装 EMQX 通过 Yum 源安装 EMQX 支持通过 Yum 源安装&#xff0c;您可通过以下 Yum 命令从中自动下载和安装 EMQX。 通过以下命令配置 EMQX Yum 源&#xff1a; curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash安装以下依赖项&#xff…...

重试机制之指针退避策略算法

一、目的&#xff1a;随着重试次数增加&#xff0c;逐步延长重连等待时间&#xff0c;避免加重服务器负担。 二、计算公式&#xff1a; 每次重试的延迟时间 初始间隔 (退避基数 ^ 重试次数) 通常设置上限防止等待时间过长。 const delay Math.min(initialDelay * Math.pow…...

spring security的过滤器链

Spring Security 的安全功能通过一系列过滤器&#xff08;Filter&#xff09;组成的链式结构实现&#xff0c;每个过滤器负责处理特定的安全任务。这些过滤器按特定顺序执行&#xff0c;形成过滤器链&#xff08;Security Filter Chain&#xff09;。以下是其核心过滤器及工作原…...

人工智能:officeAI软件,如何调整AI对话界面的字体?

1、首先&#xff0c;随便打开一个excel&#xff08;使用wps&#xff09; 依次点击上方的【OfficeAI】—【右侧面板】 2、在弹出的面板中&#xff0c;输入&#xff1a;助手设置 &#xff0c; 然后按【回车】发送出去 3、之后会弹出界面&#xff0c;在【样式设定】中&#xff…...

Qt之共享内存类QSharedMemory的使用及实现原理(全)

目录 1.简介 2.使用 3.实现原理 3.1.Windows内存映射 3.2.POSIX 共享内存 3.3.System V 共享内存 3.4.QSharedMemory的实现原理 4.总结 1.简介 QSharedMemory 是 Qt 框架提供的一个类&#xff0c;用于在不同进程或线程之间实现共享内存的管理。借助共享内存&#xff0c…...

dockerfile构建镜像方式

在 Docker 中&#xff0c;可使用 docker build 命令依据 Dockerfile 构建镜像。下面为你详细介绍构建镜像的具体方式。 基本构建命令 若要构建镜像&#xff0c;需在包含 Dockerfile 的目录下执行 docker build 命令。基本语法如下&#xff1a; bash docker build -t <镜像…...

Problem A: 接口使用

1.题目问题 2.样例 3.代码实现 补充&#xff1a;注意空格 // 定义Vehicle接口 interface Vehicle {void start();void stop(); }// 实现Vehicle接口的Bike类 class Bike implements Vehicle {Overridepublic void start() {System.out.println("i am bike,i am running&…...

用Python插入Excel表格到Word文档

在日常办公场景中&#xff0c;通过Python脚本自动化整合Excel数据与Word文档&#xff0c;能够实现表格的智能迁移&#xff0c;满足不同场景下数据呈现的专业性要求。直接提取表格内容插入Word适用于需要快速传递核心数据的场景&#xff0c;确保信息精准直达&#xff1b;完整复制…...

合合信息TextIn大模型加速器 2.0来了:智能文档解析和图表解析能力全面升级

合合信息“TextIn大模型加速器 2.0”版本来了&#xff1a;文档解析和图表解析能力全面升级 背景 在日常工作中&#xff0c;我们常常遇到无法直接复制的文档内容或图片内容&#xff0c;这些内容通常需要进行识别和解析。一个典型的例子是&#xff0c;当我们需要将折线图转化为…...

笔记:代码随想录算法训练营day62:108.冗余连接、109.冗余连接II

学习资料&#xff1a;代码随想录 108. 冗余连接 卡码网题目链接&#xff08;ACM模式&#xff09; 判断是否有环的依据为&#xff0c;利用并查集&#xff0c;isSame函数&#xff0c;判断当下这条边的两个节点入集前是否为同根&#xff0c;如果是的话&#xff0c;该边就是会构…...

刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富

在金融科技高速发展的今天&#xff0c;股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口&#xff0c;帮助用户快速获取实时或历史市场数据&#xff0c;为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...

消息队列Message Queue

前面&#xff0c;我们在黑点点评中秒杀场景中&#xff0c;首次了解到消息队列MQ&#xff0c;它主要解决了秒杀场景中异步场景&#xff0c;提升了并发性&#xff0c;吞吐量。可是还是对消息队列又很多的疑惑&#xff1f; 消息队列是什么 消息队列是一种通信协议或中间件&#…...

Day 25:股票的最大利润 + 1到n求和

数组 prices 记录了某芯片近期的交易价格&#xff0c;其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片&#xff0c;并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利润&…...

如何利用AI智能生成PPT提升工作效率

如何利用AI智能生成PPT提升工作效率&#xff1f;PPT制作曾经是每个人办公生活中的一大痛点。你有多久没有在制作PPT时感到焦头烂额&#xff0c;选模板、调整格式、插入图片&#xff0c;每一项都得花费大量的时间和精力&#xff0c;最后还未必能做出一份令人满意的效果。随着人工…...

WIN11 企业版 部署Dify+Docker

Dify&#xff08;Do it for you&#xff09;是一款开源的大语言模型应用开发平台&#xff0c;旨在简化AI应用的创建、部署和管理过程&#xff0c;使开发者能够更快速、更轻松地构建和运营基于GPT等模型的AI应用。 Dify平台创建和运营一个AI chatbot应用&#xff0c;涉及到登录…...

理解CMakeLists.txt文件

CMakeLists.txt(主入口) │ ├── 项目元信息(project, cmake_minimum_required) ├── 编译选项设置(option) ├── 编译标志设置(set(CMAKE_...)) ├── 查找依赖库(find_package, include_directories) ├── 注册插件、扩展(register_extension, add_subdi…...

1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块

盛铂SWFA300捷变频频率综合器模块简述&#xff1a; 盛铂科技国产SWFA300捷变频频率综合器是一款在频率范围内任意两点频率的跳频时间在500nS以内的高速跳频源&#xff0c;其输出频率范围为1.25GHz至20GHz&#xff0c;频率的最小步进为10kHz。同时它拥有优秀的相位噪声特性&…...

MySql修改全部表和字段编码

修改全部表 SELECT CONCAT(ALTER TABLE , TABLE_NAME, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;) AS sql_statements FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 数据库名称 返回的下面这种SQL,然后批量执行即可 ALTER TABLE gen_table CO…...

elementUI el-image图片加载失败解决

是不是&#xff0c;在网上找了一些&#xff0c;都不行&#xff0c;这里一行代码&#xff0c;解决&#xff0c;后端返回图片路径&#xff0c;el-image图片加载失败的问题 解决办法&#xff0c; vue项目里&#xff0c;index.html文件里加一行代码就可 <meta name"refe…...

代理IP协议详解HTTP、HTTPS、SOCKS5分别适用于哪些场景

“代理IP协议在现代网络通信中扮演着至关重要的角色。它们通过提供中间层服务&#xff0c;帮助用户匿名访问网络、绕过地理限制、提高安全性和加速数据传输。HTTP、HTTPS和SOCKS5是三种最常见的代理IP协议&#xff0c;每种协议都有其特定的用途和适用场景。” HTTP代理及其适用…...

UniApp开发多端应用——流式语音交互场景优化

一、问题背景&#xff1a;UniApp默认方案的局限性 在流式语音交互场景&#xff08;如AI语音助手、实时字幕生成&#xff09;中&#xff0c;UniApp默认的uni.getRecorderManager 和uni.createInnerAudioContext 存在以下瓶颈&#xff1a; 录音端&#xff1a; 延迟高&#xff1…...