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

【Easylive】Elasticsearch搜索组件详解

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版

一、Elasticsearch基础介绍

Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎,基于Apache Lucene构建。在视频平台中,它主要用于:

  1. 全文搜索:快速检索视频标题、标签等内容
  2. 结构化查询:支持多种条件组合查询
  3. 高亮显示:突出显示匹配的关键词
  4. 聚合统计:对播放量、弹幕数等进行统计分析

核心特性

近实时搜索:数据变更后1秒内可搜索
分布式架构:支持水平扩展
丰富的API:RESTful接口和多种客户端
强大的查询DSL:灵活的查询语法

二、组件配置解析

@Value("${es.host.port:127.0.0.1:9200}")
private String esHostPort;@Value("${es.index.video.name:easylive_video}")
private String esIndexVideoName;

esHostPort:ES服务器地址,默认本地9200端口
esIndexVideoName:视频索引名称,默认"easylive_video"

三、核心方法详解

1. 索引初始化方法 createIndex()

public void createIndex() {try {// 检查索引是否存在Boolean existIndex = isExistIndex();if (existIndex) {return;}// 创建索引请求CreateIndexRequest request = new CreateIndexRequest(appConfig.getEsIndexVideoName());// 设置分析器(处理逗号分隔的标签)request.settings("{\"analysis\": {\"analyzer\": {\"comma\": {\"type\": \"pattern\",\"pattern\": \",\"}}}}", XContentType.JSON);// 定义字段映射request.mapping("{\"properties\": {...}}", XContentType.JSON);// 执行创建CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);if (!response.isAcknowledged()) {throw new BusinessException("初始化es失败");}} catch (Exception e) {log.error("初始化es失败", e);throw new BusinessException("初始化es失败");}
}

字段映射说明
videoId/userId:仅存储不索引
videoName:使用ik中文分词器
tags:使用自定义逗号分析器
• 数值/日期字段:仅存储不索引

2. 文档操作方法

(1) 保存文档 saveDoc()
public void saveDoc(VideoInfo videoInfo) {try {// 存在则更新,不存在则新增if (docExist(videoInfo.getVideoId())) {updateDoc(videoInfo);} else {VideoInfoEsDto dto = CopyTools.copy(videoInfo, VideoInfoEsDto.class);// 初始化统计字段dto.setCollectCount(0);dto.setPlayCount(0);dto.setDanmuCount(0);IndexRequest request = new IndexRequest(appConfig.getEsIndexVideoName());request.id(videoInfo.getVideoId()).source(JsonUtils.convertObj2Json(dto), XContentType.JSON);restHighLevelClient.index(request, RequestOptions.DEFAULT);}} catch (Exception e) {log.error("新增视频到es失败", e);throw new BusinessException("保存失败");}
}
(2) 更新文档 updateDoc()
private void updateDoc(VideoInfo videoInfo) {try {// 排除时间字段videoInfo.setLastUpdateTime(null);videoInfo.setCreateTime(null);// 反射获取非空字段Map<String, Object> dataMap = new HashMap<>();Field[] fields = videoInfo.getClass().getDeclaredFields();for (Field field : fields) {Method getter = videoInfo.getClass().getMethod("get" + StringTools.upperCaseFirstLetter(field.getName()));Object value = getter.invoke(videoInfo);if (value != null && !(value instanceof String && ((String)value).isEmpty())) {dataMap.put(field.getName(), value);}}if (!dataMap.isEmpty()) {UpdateRequest updateRequest = new UpdateRequest(appConfig.getEsIndexVideoName(), videoInfo.getVideoId());updateRequest.doc(dataMap);restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);}} catch (Exception e) {log.error("更新视频到es失败", e);throw new BusinessException("保存失败");}
}
(3) 更新统计字段 updateDocCount()
public void updateDocCount(String videoId, String fieldName, Integer count) {try {// 使用painless脚本实现原子递增UpdateRequest updateRequest = new UpdateRequest(appConfig.getEsIndexVideoName(), videoId);Script script = new Script(ScriptType.INLINE, "painless", "ctx._source." + fieldName + " += params.count", Collections.singletonMap("count", count));updateRequest.script(script);restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);} catch (Exception e) {log.error("更新数量到es失败", e);throw new BusinessException("保存失败");}
}
(4) 删除文档 delDoc()
public void delDoc(String videoId) {try {DeleteRequest deleteRequest = new DeleteRequest(appConfig.getEsIndexVideoName(), videoId);restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);} catch (Exception e) {log.error("从es删除视频失败", e);throw new BusinessException("删除视频失败");}
}

3. 搜索方法 search()

public PaginationResultVO<VideoInfo> search(Boolean highlight, String keyword, Integer orderType, Integer pageNo, Integer pageSize) {try {// 1. 构建搜索请求SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 2. 设置查询条件(多字段匹配)sourceBuilder.query(QueryBuilders.multiMatchQuery(keyword, "videoName", "tags"));// 3. 设置高亮if (highlight) {HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("videoName").preTags("<span class='highlight'>").postTags("</span>");sourceBuilder.highlighter(highlightBuilder);}// 4. 设置排序SearchOrderTypeEnum orderEnum = SearchOrderTypeEnum.getByType(orderType);if (orderType != null) {sourceBuilder.sort(orderEnum.getField(), SortOrder.DESC);} else {sourceBuilder.sort("_score", SortOrder.DESC); // 默认按相关度排序}// 5. 设置分页pageNo = pageNo == null ? 1 : pageNo;pageSize = pageSize == null ? PageSize.SIZE20.getSize() : pageSize;sourceBuilder.from((pageNo - 1) * pageSize).size(pageSize);// 6. 执行查询SearchRequest searchRequest = new SearchRequest(appConfig.getEsIndexVideoName());searchRequest.source(sourceBuilder);SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 7. 处理结果SearchHits hits = response.getHits();List<VideoInfo> videoList = Arrays.stream(hits.getHits()).map(hit -> {VideoInfo info = JsonUtils.convertJson2Obj(hit.getSourceAsString(), VideoInfo.class);// 应用高亮if (hit.getHighlightFields().get("videoName") != null) {info.setVideoName(hit.getHighlightFields().get("videoName").getFragments()[0].string());}return info;}).collect(Collectors.toList());// 8. 补充用户信息Map<String, UserInfo> userMap = userInfoMapper.selectList(new UserInfoQuery().setUserIdList(videoList.stream().map(VideoInfo::getUserId).collect(Collectors.toList()))).stream().collect(Collectors.toMap(UserInfo::getUserId, Function.identity()));videoList.forEach(video -> {UserInfo user = userMap.get(video.getUserId());if (user != null) video.setNickName(user.getNickName());});// 9. 返回分页结果return new PaginationResultVO<>((int)hits.getTotalHits().value,pageSize,pageNo,(int)Math.ceil((double)hits.getTotalHits().value / pageSize),videoList);} catch (Exception e) {log.error("查询视频失败", e);throw new BusinessException("查询失败");}
}

四、设计亮点分析

  1. 优雅的异常处理
    • 统一捕获异常并转换为业务异常
    • 记录详细错误日志

  2. 智能的文档操作
    • 自动判断文档存在性
    • 增量更新非空字段

  3. 高效的统计更新
    • 使用painless脚本实现原子操作

  4. 完整的分页支持
    • 支持自定义页码和大小
    • 返回总页数等元信息

  5. 关联数据补充
    • 搜索后批量查询用户信息
    • 减少N+1查询问题

五、潜在优化建议

  1. 批量操作支持

    BulkRequest bulkRequest = new BulkRequest();
    // 添加多个操作
    restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    
  2. 缓存用户信息
    • 使用Redis缓存频繁访问的用户数据

  3. 搜索建议功能

    SearchSourceBuilder.suggest(new SuggestBuilder().addSuggestion("video-suggest", SuggestBuilders.completionSuggestion("videoName.suggest")));
    
  4. 更复杂的高亮策略
    • 支持多字段高亮
    • 自定义高亮片段长度

  5. 索引别名支持
    • 使用别名实现零停机索引重建

六、初始化流程(InitRun)

@Component("initRun")
public class InitRun implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {// 1. 测试数据库连接try (Connection conn = dataSource.getConnection()) {// 2. 测试Redis连接redisUtils.get("test");// 3. 初始化ES索引esSearchComponent.createIndex();logger.info("服务启动成功");} catch (Exception e) {logger.error("服务启动失败", e);System.exit(0); // 启动失败直接退出}}
}

启动验证逻辑

  1. 数据库连接测试
  2. Redis连通性测试
  3. ES索引初始化
  4. 任一失败则终止应用启动

这个ES搜索组件为视频平台提供了完整、高效的搜索能力,从基础索引管理到复杂的搜索功能都有良好实现,是系统核心功能的重要支撑。

相关文章:

【Easylive】Elasticsearch搜索组件详解

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 一、Elasticsearch基础介绍 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎&#xff0c;基于Apache Lucene构建。在视频平台中&#xff0c;它主要用于&#xff1a; 全…...

基于AT89C51单片机的加减乘除液晶计算机设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/90574816?spm1001.2014.3001.5503 功能介绍&#xff1a; 可进行最高四位数的加减乘除运算&#xff0c;除法运算保留小数点后四位&#xff1b;4*4矩阵按键输入&…...

先进制造aps专题三十三 开源aps产品,frepple和dream对比分析

开源的两个aps产品&#xff0c;frepple和dream对比分析 frepple开源的基本不能用&#xff0c;第一它甘特图没开源&#xff0c;而且甘特图不允许你手工个修改&#xff0c;你想把它当成手工甘特图用也不行&#xff0c;第二&#xff0c;算法强制倒排&#xff0c;很少企业是倒排 …...

Vue3.2 项目打包成 Electron 桌面应用

本文将详细介绍如何将基于 Vue3.2 的项目打包成 Electron 桌面应用。通过结合 Electron 和 Vue CLI 工具链&#xff0c;可以轻松实现跨平台桌面应用的开发与发布。 1. 项目结构说明 项目主要分为以下几个部分&#xff1a; electron/main.js&#xff1a;Electron 主进程文件。…...

第16届蓝桥杯单片机模拟试题Ⅰ

试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //onewire.c float getT(); //sys.c extern unsigned char UI; extern bit touch_mode; extern float jiaozhun; extern float canshu; extern float temper; void init74hc138(unsigned…...

ES:geoip_databases

如何查看 .geoip_databases 的内容 在Elasticsearch中&#xff0c;.geoip_databases 是一个特殊的索引&#xff0c;用于存储GeoIP数据库文件。这些文件通常用于地理信息的丰富&#xff08;GeoIP enrichment&#xff09;。以下是如何查看和管理这些数据库文件的方法&#xff1a…...

企业级开发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因其丰富的人物模型…...