1.springboot 集成elasticsearch组件
1.前置条件已经安装和搭建好了elasticsearch中间件
一:项目中引入elasticsearch相关依赖
我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致
此处省略springboot 搭建及必要的依赖项
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.2</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.10.2</version></dependency>
二:项目配置文件里配置上elasticsearch相关的信息
application.yml
es:data:host: ip # es安装所在的服务器ipport: 9200 #es对外暴露的端口clusterName: hc-es-cluster #es的集群
三:工程里编写elasticsearch相关的配置代码
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ESConfig {@Value("${es.data.host}")private String host;@Value("${es.data.clusterName}")private String clusterName;@Value("${es.data.port}")private Integer port;@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(host, port, "http")));return client;}
}
四:项目中的引入和测试
import cn.hutool.json.JSONUtil;
import com.jinyi.up.user.JinyiUserProviderApplication;
import com.jinyi.up.user.esPojo.AggDimensionEnum;
import com.jinyi.up.user.esPojo.EsUser;
import com.jinyi.up.user.esPojo.EsUserSearchQueryDto;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;/*** @author huangchong* @date 2023/9/2 14:36* @desc*/
@SpringBootTest(classes = {JinyiUserProviderApplication.class})
public class TestES {@Resourceprivate RestHighLevelClient esClient;/*** 创建索引** @throws IOException*/@Testpublic void createIndex() throws IOException {//1.创建索引请求CreateIndexRequest request = new CreateIndexRequest("hc_index");//2.执行创建请求CreateIndexResponse indexResponse = esClient.indices().create(request, RequestOptions.DEFAULT);System.out.println(indexResponse);}/*** 获取索引 判断是否存在** @throws IOException*/@Testpublic void getIndex() throws IOException {//1.创建索引请求GetIndexRequest request = new GetIndexRequest("hc_index");//2.执行存在请求Boolean exists = esClient.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);}/*** 删除索引** @throws IOException*/@Testpublic void deleteIndex() throws IOException {//1.创建索引请求DeleteIndexRequest request = new DeleteIndexRequest("hc_index");//2.执行删除请求AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);System.out.println(response.isAcknowledged());}/*** 添加文档** @throws IOException*/@Testpublic void addEsDocument() throws IOException {EsUser esUser = new EsUser(1L, "hc", 32, 12, new Date());//1.指定索引库IndexRequest request = new IndexRequest("hc_index");// PUT /hc_index/_doc/1request.id("1").timeout(TimeValue.timeValueSeconds(2));//2.将数据放入请求request.source(JSONUtil.toJsonStr(esUser), XContentType.JSON);//发送请求IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);System.out.println(response.toString());}/*** 判断文档是否存在文档** @throws IOException*/@Testpublic void existsEsDocument() throws IOException {//1.指定索引库 和 查询idGetRequest request = new GetRequest("hc_index", "1");//不获取返回的_source 的上下文request.fetchSourceContext(new FetchSourceContext(false));request.storedFields("_none_");boolean exists = esClient.exists(request, RequestOptions.DEFAULT);System.out.println(exists);}/*** 获取文档** @throws IOException*/@Testpublic void getEsDocument() throws IOException {//1.指定索引库 和 查询idGetRequest request = new GetRequest("hc_index", "1");//不获取返回的_source 的上下文// request.fetchSourceContext(new FetchSourceContext(false));// request.storedFields("_none_");GetResponse getResponse = esClient.get(request, RequestOptions.DEFAULT);System.out.println(getResponse.toString());String sourceAsString = getResponse.getSourceAsString();System.out.println(sourceAsString); //返回全部内容 ,和命令一样}/*** 更新文档** @throws IOException*/@Testpublic void updateEsDocument() throws IOException {//1.指定索引库 和 查询idGetRequest request = new GetRequest("hc_index", "1");GetResponse getResponse = esClient.get(request, RequestOptions.DEFAULT);System.out.println(getResponse.toString());String sourceAsString = getResponse.getSourceAsString();EsUser esUser = JSONUtil.toBean(sourceAsString, EsUser.class);//1.指定索引库 和 查询idUpdateRequest updateRequest = new UpdateRequest("hc_index", String.valueOf(esUser.getId()));//不获取返回的_source 的上下文updateRequest.timeout(TimeValue.timeValueSeconds(2));esUser.setUserName("huangchong 2");updateRequest.doc(JSONUtil.toJsonStr(esUser), XContentType.JSON);UpdateResponse updateResponse = esClient.update(updateRequest, RequestOptions.DEFAULT);System.out.println(updateResponse.toString());}/*** 删除文档** @throws IOException*/@Testpublic void deleteEsDocument() throws IOException {//1.指定索引库 和 查询idDeleteRequest deleteRequest = new DeleteRequest("hc_index", "1");deleteRequest.timeout("1s");DeleteResponse delete = esClient.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(delete.toString());}/*** 批量操作** @throws IOException*/@Testpublic void bulkAddEsDocument() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("10s");List<EsUser> esUsers = new ArrayList<EsUser>();esUsers.add(new EsUser(11L, "hc1", 31, 1, new Date()));esUsers.add(new EsUser(17L, "hc2", 31, 1, new Date()));esUsers.add(new EsUser(18L, "hc3", 28, 2, new Date()));esUsers.add(new EsUser(19L, "hc4", 25, 2, new Date()));esUsers.add(new EsUser(20L, "hc5", 19, 3, new Date()));//批量插入for (int i = 0; i < esUsers.size(); i++) {EsUser esUser = esUsers.get(i);bulkRequest.add(new IndexRequest("hc_index").id(String.valueOf(esUser.getId())).source(JSONUtil.toJsonStr(esUser), XContentType.JSON).opType(DocWriteRequest.OpType.CREATE));}esClient.bulk(bulkRequest, RequestOptions.DEFAULT);}/*** private AggregatorFactories.Builder aggregations;* 1.SearchRequest 请求* 2.SearchSourceBuilder 条件构建* searchSourceBuilder.highlighter() 高亮** @throws IOException*/@Testpublic void queryEsDocument() throws IOException {// 1.指定索引库SearchRequest searchRequest = new SearchRequest("hc_index");//2.构建查询请求条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//QueryBuilders工具类 termQuery 精确查询TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("userName", "hc4");searchSourceBuilder.query(termQueryBuilder);searchSourceBuilder.timeout(TimeValue.timeValueSeconds(60L));searchRequest.source(searchSourceBuilder);SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits searchHits = response.getHits();SearchHit[] hits = searchHits.getHits();for (int i = 0; i < hits.length; i++) {SearchHit hit = hits[i];String sourceAsString = hit.getSourceAsString();System.out.println(JSONUtil.toBean(sourceAsString, EsUser.class).toString());}}/*** private AggregatorFactories.Builder aggregations;* 1.SearchRequest 请求* 2.SearchSourceBuilder 条件构建* searchSourceBuilder.highlighter() 高亮** @throws IOException*/@Testpublic void aggsEsDocument() throws IOException {//对hc_index库的查询请求SearchRequest searchRequest = new SearchRequest("hc_index");//paramDto 转BoolQueryBuilder :对查询条件统一封装EsUserSearchQueryDto queryDto = new EsUserSearchQueryDto();queryDto.setLikeWords("hc");queryDto.setUserStatus("1,2,3");queryDto.setAggDimensions("age");BoolQueryBuilder boolQueryBuilder = buildQuery(queryDto);//查询条件构建SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(boolQueryBuilder);//聚合分析无需得到分页结果,只要聚合结果就行buildQueryFromSize(searchSourceBuilder, 1, 0);//构建聚合aggregationsBuild(searchSourceBuilder, queryDto);searchRequest.source(searchSourceBuilder);//获取结果SearchResponse searchResponse = esClient.search(searchRequest, RequestOptions.DEFAULT);Map<String, Aggregation> aggregationMap = searchResponse.getAggregations().asMap();ParsedValueCount idNumAggs = (ParsedValueCount) aggregationMap.get("idNum");ParsedSum ageSumAggs = (ParsedSum) aggregationMap.get("ageSum");ParsedAvg ageAveAggs = (ParsedAvg) aggregationMap.get("ageAve");ParsedCardinality userNumAggs = (ParsedCardinality) aggregationMap.get("userStatusCount");}/*** 构建聚合方式*/private void aggregationsBuild(SearchSourceBuilder sourceBuilder, EsUserSearchQueryDto queryDto) {ValueCountAggregationBuilder idNumAggs = AggregationBuilders.count("idNum").field("id");SumAggregationBuilder ageSumAggs = AggregationBuilders.sum("ageSum").field("age");//平均值AvgAggregationBuilder ageAvgAggs = AggregationBuilders.avg("ageAve").field("age");//统计去重后的数量CardinalityAggregationBuilder userStatusAggs = AggregationBuilders.cardinality("userStatusCount").field("userStatus");sourceBuilder.aggregation(idNumAggs);sourceBuilder.aggregation(ageSumAggs);sourceBuilder.aggregation(userStatusAggs);sourceBuilder.aggregation(ageAvgAggs);if (StringUtils.isNotEmpty(queryDto.getAggDimensions())) {List<String> list = Arrays.asList(queryDto.getAggDimensions().split(",")).stream().map(s -> s.trim()).collect(Collectors.toList());for (String dimension : list) {AggDimensionEnum dimensionEnum = AggDimensionEnum.getByDimension(dimension);if (dimension == null) {continue;}TermsAggregationBuilder aggs = AggregationBuilders.terms(dimensionEnum.getDimension()).field(dimensionEnum.getField()).size(10000);sourceBuilder.aggregation(aggs);aggs.subAggregation(idNumAggs);aggs.subAggregation(ageSumAggs);aggs.subAggregation(ageAvgAggs);aggs.subAggregation(userStatusAggs);}}}protected void buildQueryFromSize(SearchSourceBuilder sourceBuilder, Integer start, Integer size) {sourceBuilder.from(start);sourceBuilder.size(size);}/*** 构建查询条件** @param queryDto* @return*/private BoolQueryBuilder buildQuery(EsUserSearchQueryDto queryDto) {BoolQueryBuilder query = QueryBuilders.boolQuery();//搜索 分词if (StringUtils.isNotEmpty(queryDto.getUserName())) {query.must(QueryBuilders.matchQuery("userName", queryDto.getUserName()));}//匹配 包含 模糊查询if (StringUtils.isNotEmpty(queryDto.getLikeWords())) {query.must(QueryBuilders.wildcardQuery("userName", "*" + queryDto.getLikeWords() + "*"));}//订单状态 多状态 or查询if (StringUtils.isNotEmpty(queryDto.getUserStatus())) {String[] orderStatuss = StringUtils.split(queryDto.getUserStatus(), ",");BoolQueryBuilder orQuery = QueryBuilders.boolQuery()// 多个状态查询.should(QueryBuilders.termsQuery("userStatus", orderStatuss));query.must(orQuery);}//订单创建时间if (queryDto.getBeginCreateTime() != null) {query.must(QueryBuilders.rangeQuery("createTime").gte(queryDto.getBeginCreateTime().getTime()));}if (queryDto.getEndCreateTime() != null) {query.must(QueryBuilders.rangeQuery("createTime").lte(queryDto.getEndCreateTime().getTime()));}return query;}
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;import java.util.Date;/*** @author huangchong* @date 2023/9/2 14:51* @desc*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class EsUser {private Long id;private String userName;private Integer age;private Integer userStatus;private Date createTime;}
import lombok.Data;import java.util.Date;/*** @author huangchong* @date 2023/9/3 16:12* @desc*/
@Data
public class EsUserSearchQueryDto {private Long id;private String userName;private String likeWords;private Integer age;private String userStatus;private Date beginCreateTime;private Date endCreateTime;private String aggDimensions;
}
package com.jinyi.up.user.esPojo;import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;/*** 聚合分析维度* @author huangchong* @date 2023/9/3 17:00* @desc*/
public enum AggDimensionEnum {userStatus("userStatus", "userStatus", "用户状态"),age("age", "age", "年纪类型"),name("userName", "userName", "名字");private final String dimension;private final String field;private final String desc;AggDimensionEnum(String dimension, String field, String desc) {this.dimension = dimension;this.field = field;this.desc = desc;}public String getDesc() {return desc;}public String getDimension() {return dimension;}public String getField() {return field;}private static final Map<String, String> aggDimensionEnumMap = Arrays.stream(values()).collect(Collectors.toMap(AggDimensionEnum::getDimension, AggDimensionEnum::getDesc));public static Map<String, String> getAggDimensionEnumMap() {return aggDimensionEnumMap;}public static AggDimensionEnum getByDimension(String dimension) {for (AggDimensionEnum dimensionEnum : values()) {if (dimensionEnum.dimension.equals(dimension)) {return dimensionEnum;}}return null;}
}
相关文章:
1.springboot 集成elasticsearch组件
1.前置条件已经安装和搭建好了elasticsearch中间件 一:项目中引入elasticsearch相关依赖 我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致 此处省略springboot 搭建及必要的依赖项 <dependency><groupId>org.elasticsearch.client</group…...

【学习笔记】元学习如何解决计算机视觉少样本学习的问题?
目录 1 计算机视觉少样本学习 2 元学习 3 寻找最优初始参数值方法:MAML 3.1 算法步骤 3.2 代码:使用MAML 和 FO-MAML、任务增强完成Few-shot Classification 4 距离度量方法:Siamese Network,ProtoNet,RN 4.1 孪生网络(Sia…...
【C语言】17-函数-3
1. 链接属性 当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数将链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体,还是表示不同的实体?标识符的链接属性决定如何处理…...
人工智能:为你提供的未来工作岗位
随着科技的快速发展,人工智能(Artificial Intelligence,AI)正逐渐渗透到各个领域。本文探讨一下人工智能可以提供的工作岗位,以期帮助大家更好地了解这个新兴行业的就业前景。 文章目录 1 机器学习工程师2 数据科学家3 自然语言处理工程师4 机器视觉工程…...

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。
HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。 HashMap相关问题 1、你用过HashMap吗?什么是HashMap?你为什么用到它?用过,HashMap是基于哈希表的Map接口的非同步实现, 它允许null键…...

flink学习之广播流与合流操作demo
广播流是什么? 将一条数据广播到所有的节点。使用 dataStream.broadCast() 广播流使用场景? 一般用于动态加载配置项。比如lol,每天不断有人再投诉举报,客服根本忙不过来,腾讯内部做了一个判断,只有vip3…...

PPT架构师架构技能图
PPT架构师架构技能图 目录概述需求: 设计思路实现思路分析1.软素质2.核心输出(office输出) 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,ma…...

STM32微控制器的低功耗模式
STM32微控制器的低功耗模式(Low-power modes):Sleep mode、Stop mode 和 Standby mode。 1.1 Sleep Mode(睡眠模式): 把STM32微控制器当作一位劳累的工人,他在工作过程中需要短暂的休息。在Sleep模式下,微控制器会关闭一部分电路,减小功耗,但仍然保持对中央处理单…...

tensorflow QAT
tensorflow qat https://www.wpgdadatong.com/tw/blog/detail/70672 在边缘运算的重点技术之中,除了简化复杂的模块构架,来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架(TensorFlow、Pytorc…...

[杂谈]-快速了解LoRaWAN网络以及工作原理
快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备(End Devices)1.2 网关(Gateways)1.3 网络服务器(Net Server)1.4 应用服务器(Appli…...

MySQL--MySQL表的增删改查(基础)
排序:ORDER BY 语法: – ASC 为升序(从小到大) – DESC 为降序(从大到小) – 默认为 ASC SELECT … FROM table_name [WHERE …] ORDER BY column [ASC|DESC], […]; *** update...
Vue中启动提示polyfill缺少-webpack v5版本导致
安装 npm i node-polyfill-webpack-plugin 因为我们的项目使用webpack v5,其中polyfill Node核心模块被删除。所以,我们安装它是为了在项目中访问这些模块 vue.config.js文件 const { defineConfig } require("vue/cli-service"); const No…...
Hugging Face实战-系列教程3:AutoModelForSequenceClassification文本2分类
🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在notebook中进行 本篇文章配套的代码资源已经上传 下篇内容: Hugging Face实战-系列教程4:padding与attention_mask 输出我…...

《TCP/IP网络编程》阅读笔记--Socket类型及协议设置
目录 1--协议的定义 2--Socket的创建 2-1--协议族(Protocol Family) 2-2--Socket类型(Type) 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…...
GitHub使用教程
GitHub使用教程 视频教程一:Github 新手够用指南 | 全程演示&个人找项目技巧放送_哔哩哔哩_bilibili 笔记: README.md编写教程:Typora官方免费版与入门教程__阿伟_的博客-CSDN博客 找开源项目的一些途径 • https://github.com/trendin…...

sql server 分区表
分区表 分区表是在SQL Server 2005之后的版本引入的特性,这个特性允许把逻辑上的一个表在物理上分为很多部分。换句话说,分区表从物理上看是将一个大表分成几个小表,但是从逻辑上看,还是一个大表。 步骤 创建分表区的步骤分为…...
开源许可证概述:GNU, BSD, Apache, MPL, 和 MIT
前言 开源许可证是开源软件分发的基础。它们定义了使用者如何使用,修改,分发开源软件。在这篇文章中,我们将探讨五种常见的开源许可证:GNU通用公共许可证 (GNU GPL),BSD许可证,Apache许可证,Mo…...

java中log使用总结
目录 一、概述1.1. 核心日志框架1.2 门面日志框架 二、最佳实践2.1 核心日志框架API包2.2 门面日志框架依赖2.3 集成使用2.3.1 集成jcl2.3.2 集成slf4j2.3.2.1 slf4j集成单一框架2.3.2.2 slf4j整合混合框架 三、总结3.1 所有相关包3.1.1 核心日志框架包3.1.2 门面日志框架3.1.3…...

【Java】传输层协议TCP
传输层协议TCP TCP报文格式首部长度保留位32位序列号和32位确认应答号标记ACKSYNFINRSTURGPSH 16位窗口大小16位校验和16位紧急指针选项 TCP特点可靠传输实现机制-确认应答超时重传连接管理机制三次握手四次挥手特殊情况 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘…...

计算机网络基础知识(非常详细)
1. 网络模型 1.1 OSI 七层参考模型 七层模型,亦称 OSI(Open System Interconnection)参考模型,即开放式系统互联,是网络通信的标准模型。一般称为 OSI 参考模型或七层模型。 它是一个七层的、抽象的模型体ÿ…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...
【仿生机器人】刀剑神域——爱丽丝苏醒计划,需求文档
仿生机器人"爱丽丝"系统架构设计需求文档 一、硬件基础 已完成头部和颈部硬件搭建 25个舵机驱动表情系统 颈部旋转功能 眼部摄像头(视觉输入) 麦克风阵列(听觉输入) 颈部发声装置(语音输出)…...