ES升级--04--SpringBoot整合Elasticsearch

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • SpringBoot整合Elasticsearch
    • 1.建立项目
    • 2.Maven 依赖
        • [ES 官方网站:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html)
    • 3. pom配置
    • 4.证书文件elastic-certificates.p12 拷贝
        • 证书文件elastic-certificates.p12需拷贝到所有ES节点对应的目录下
    • 5.配置类 ElasticsearchConfig
    • 6.nacos配置参数
    • 7.测试
      • 1.TransportClient
      • 2.ElasticsearchTemplate
      • 3.RestHighLevelClient
      • 4.ElasticsearchRestTemplate


SpringBoot整合Elasticsearch

1.建立项目

在这里插入图片描述
在这里插入图片描述

2.Maven 依赖

进入到 ES 官方网站

ES 官方网站:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html

在这里插入图片描述

  • 可以看到有低级和 高级的 Rest Client

在这里插入图片描述

3. pom配置

基于 springboot 2.1.7.RELEASE

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 <!-- ES -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
         <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.8.23</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>transport</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.8.23</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.8.23</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.23</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>6.8.23</version>
        </dependency>
        <!-- Elasticsearch客户端依赖版本升级到6.8.32 新增x-pack依赖-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>x-pack-transport</artifactId>
            <version>6.8.23</version>
        </dependency>

4.证书文件elastic-certificates.p12 拷贝

证书文件elastic-certificates.p12需拷贝到所有ES节点对应的目录下
  • 注意:只需创建一次证书并将其复制到所有节点。

在这里插入图片描述

5.配置类 ElasticsearchConfig

支持x-pack 密码验证

/**
 * ES 配置 -----Elasticsearch 6.8.23
 * 通过实现配置配,初始化安全Elasticsearch客户端对象,包括ElasticsearchTemplate和RestHighLevelClient两者客户端类
 * 支持x-pack 密码验证
 */

@Slf4j
@Configuration
public class SecureElasticsearchConfig {


    //用户名 elastic
    @Value("${elasticsearch.xpack.username}")
    private String xpackUsername = "elastic";
    //用户密码
    @Value("${elasticsearch.xpack.password}")
    private String xpackrPassword;

    //证书路径  "/home/data/es"
    @Value("${elasticsearch.xpack.kspath}")
    private String certPath;
    //证书密码  ""
    @Value("${elasticsearch.xpack.kspwd}")
    private String certPassword;

    //集群名
    @Value("${elasticsearch.master.cluster-name}")
    private String masterClusterName;
    //节点名
    @Value("${elasticsearch.master.clusterNodes}")
    private String clusterNodes;
    //ip
    @Value("${elasticsearch.master.address}")
    private String masterAddress;
    //端口
    @Value("${elasticsearch.master.port}")
    private Integer masterPort;

//    // es 连接超时时间
//    private int connectTimeOut;
//    // es socket 连接超时时间
//    private int socketTimeOut;
//    // es 请求超时时间
//    private int connectionRequestTimeOut;
//    // es 最大连接数
//    private int maxConnectNum;
//    // es 每个路由的最大连接数
//    private int maxConnectNumPerRoute;



    /**
     *集群配置
     */
    private Settings settings() {
        Settings.Builder builder = Settings.builder();
        //基础配置
        builder.put("cluster.name", masterClusterName);
        builder.put("xpack.security.user", xpackUsername+ ":" + xpackrPassword);
        // Keystore 配置
        builder.put("xpack.security.transport.ssl.keystore.path", certPath);
        builder.put("xpack.security.transport.ssl.keystore.password", certPassword);
        // Truststore 配置
        builder.put("xpack.security.transport.ssl.truststore.path", certPath);
        builder.put("xpack.security.transport.ssl.truststore.password", certPassword);
        // 验证模式配置
        builder.put("xpack.security.transport.ssl.verification_mode", "certificate");
        // 启用 X-Pack 安全功能
        builder.put("xpack.security.enabled", true);
        builder.put("xpack.security.transport.ssl.enabled", true);
        return builder.build();
    }

    /**
     * 初始化安全TransportClient类
     */
    @Bean
    public TransportClient transportClient() throws Exception {

        //本地测试用
       // certPath="D:\\cdms\\es\\elastic-certificates.p12";
        log.info(">>>>>>>>>>> SecureElasticsearchConfig TransportClient 开始初始化");
        Settings settings = settings();
        PreBuiltXPackTransportClient client = new PreBuiltXPackTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName(masterAddress), masterPort));
        return client;
    }

    /**
     *初始化安全ElasticsearchTemplate类
     * 基于 spring-boot-starter-data
     */
    @Bean
    public ElasticsearchTemplate elasticsearchTemplate(@Autowired TransportClient transportClient) throws Exception {
        log.info(">>>>>>>>>>> SecureElasticsearchConfig ElasticsearchTemplate 开始初始化");
        ElasticsearchTemplate secureElasticsearchTemplate;
        try {
            secureElasticsearchTemplate = new ElasticsearchTemplate(transportClient);
            return secureElasticsearchTemplate;
        } catch (Exception e) {
            log.error("SecureElasticsearchConfig  初始化ElasticsearchTemplate报错: ", e.getMessage());
            throw e;
        }
    }



    /**
     * 初始化安全RestHighLevelClient类
     * 只支持http  端口: 9200
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        log.info(">>>>>>>>>>> SecureElasticsearchConfig RestHighLevelClient 开始初始化");
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

        credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(xpackUsername, xpackrPassword));

        RestClientBuilder builder = RestClient.builder(new HttpHost(masterAddress,9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        RestHighLevelClient client = new RestHighLevelClient(builder);

//        // 连接延时配置
//        builder.setRequestConfigCallback(requestConfigBuilder -> {
//            requestConfigBuilder.setConnectTimeout(connectTimeOut);
//            requestConfigBuilder.setSocketTimeout(socketTimeOut);
//            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
//            return requestConfigBuilder;
//        });
//        // 连接数配置
//        builder.setHttpClientConfigCallback(httpClientBuilder -> {
//                    httpClientBuilder.setMaxConnTotal(maxConnectNum);
//                    httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute);
//                    httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
//                    return httpClientBuilder;
//        });


        return client;
    }

    /**
     *初始化安全ElasticsearchRestTemplate类
     * 基于 spring-boot-starter-data
     */
    @Bean
    ElasticsearchRestTemplate elasticsearchRestTemplate(@Autowired RestHighLevelClient restHighLevelClient) {
        log.info(">>>>>>>>>>> SecureElasticsearchConfig ElasticsearchRestTemplate 开始初始化");
        return new ElasticsearchRestTemplate(restHighLevelClient);
    }

}

6.nacos配置参数

elasticsearch:
  xpack:
    username: elastic
    password: escdms
    kspath: /home/data/es
    kspwd: 
  master:
    cluster-name: gz-java-test-laas
    clusterNodes: master-test-laas
    address: 192.168.2.89
    port: 9300

7.测试

1.TransportClient

 @Autowired
    private  TransportClient transportClient;


    @Test
    public void createIndex_transportClient() {
        String indexName="lass_test_transportclient";

        try {
            CreateIndexRequest request = new CreateIndexRequest(indexName);
            // 可以在此处添加更多设置,例如映射 (mapping) 和设置 (settings)

            CreateIndexResponse response = transportClient.admin().indices().create(request).actionGet();
            if (response.isAcknowledged()) {
                System.out.println("Index created successfully: " + indexName);
            } else {
                System.out.println("Index creation failed: " + indexName);
            }
        } catch (Exception e) {
            System.err.println("Error creating index: " + e.getMessage());
        }

    }



    @Test
    public void addDocuments_transportClient() {
        String indexName = "lass_test_transportclient";

        try {


            String json1 = "{" +
                    "\"user\":\"kimchy\"," +
                    "\"postDate\":\"2013-01-30\"," +
                    "\"message\":\"trying out Elasticsearch\"" +
                    "}";

            IndexResponse response1 = transportClient.prepareIndex(indexName, "_doc")
                    .setSource(json1, XContentType.JSON)
                    .get();


//            if (response1.status() == RestStatus.CREATED) {
//                System.out.println("Document 1 indexed successfully.");
//            } else {
//                System.out.println("Failed to index Document 1.");
//            }

            String json2 = "{" +
                    "\"user\":\"Tom\"," +
                    "\"postDate\":\"2024-01-30\"," +
                    "\"message\":\"lass升级 transportClient \"" +
                    "}";

            transportClient.prepareIndex(indexName, "_doc")
                    .setSource(json2, XContentType.JSON)
                    .get();

        } catch (Exception e) {
            System.err.println("Error adding documents: " + e.getMessage());
        }
    }





    @Test
    public void deleteIndex_transportClient() {
        String indexName = "lass_test_transportclient";

        try {
            DeleteIndexRequest request = new DeleteIndexRequest(indexName);
            AcknowledgedResponse response = transportClient.admin().indices().delete(request).actionGet();
            if (response.isAcknowledged()) {
                System.out.println("Index deleted successfully: " + indexName);
            } else {
                System.out.println("Failed to delete index: " + indexName);
            }
        } catch (Exception e) {
            System.err.println("Error deleting index: " + e.getMessage());
        }
    }
GET lass_test_transportclient/_search
{
  "query":{
    "match_all" : {}
  }
}

在这里插入图片描述

2.ElasticsearchTemplate

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "lass_test_people",type = "_doc",shards = 1,replicas = 1)
public class People {
    @Id
    private String id;
    // 整个name不被分词,切不创建索引
    // Keyword表示不被分词
    @Field(type= FieldType.Keyword,index = false)
    private String name;
    // address被ik分词
    // Text类型的属性才能被分词
    @Field(type = FieldType.Text)
    private String address;

    @Field(type = FieldType.Long,index = false)
    private int age;

}
 @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Test
    public void createIndex_elasticsearchTemplate() {

        //根据实体类创建索引,
        boolean result1 = elasticsearchTemplate.createIndex(People.class);
        System.out.println(result1);
        //将索引放到软件里面
        boolean results = elasticsearchTemplate.putMapping(People.class);

    }




    @Test
    public void addDocuments_elasticsearchTemplate() {

        People peo = new People();
        peo.setId("123");
        peo.setName("张三");
        peo.setAddress("北京市海淀区回龙观东大街");
        peo.setAge(18);

        IndexQuery query = new IndexQuery();
        query.setObject(peo);

        String result = elasticsearchTemplate.index(query);
        System.out.println(result);
    }

    @Test
    public void bulk(){
        List<IndexQuery> list = new ArrayList<>();
        // IndexQuery多行写法
        IndexQuery indexQuery = new IndexQuery();
        indexQuery.setObject(new People("1", "王五", "北京东城", 12));
        list.add(indexQuery);
        // IndexQuery 连缀写法
        list.add(new IndexQueryBuilder().withObject(new People("2", "赵六", "北京西城", 13)).build());
        list.add(new IndexQueryBuilder().withObject(new People("3", "吴七", "北京昌平", 14)).build());
        elasticsearchTemplate.bulkIndex(list);
    }


    @Test
    public void deletee_elasticsearchTemplate() {
        boolean result = elasticsearchTemplate.deleteIndex(People.class);
        System.out.println(result);
    }

在这里插入图片描述

3.RestHighLevelClient

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "lass_test_student",type = AudienceEsConst.DOC, createIndex = false, useServerConfiguration = true)
public class Student {
    @Id
    private String id;
    // 整个name不被分词,切不创建索引
    // Keyword表示不被分词
    @Field(type= FieldType.Keyword,index = false)
    private String name;
    // address被ik分词
    // Text类型的属性才能被分词
    @Field(type = FieldType.Text)
    private String address;

    @Field(type = FieldType.Long,index = false)
    private int age;

}
 @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void createIndex_restHighLevelClient() throws IOException {
        String indexName = "lass_test_resthighlevelclient";

        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        {
            builder.field("user", "zhangSan");
            builder.timeField("postDate", new Date());
            builder.field("message", "laas 升级 RestHighLevelClient ");
        }

        builder.endObject();
        IndexRequest request = new IndexRequest(indexName, "doc").source(builder);

        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);

            if (indexResponse.status() == RestStatus.CREATED) {
                System.out.println("Document 1 indexed successfully.");
            } else {
                System.out.println("Failed to index Document 1.");
            }

    }



    @Test
    public void addDocuments_restHighLevelClient() {
        String indexName = "lass_test_resthighlevelclient";

        try {
            Map<String, Object> jsonMap = new HashMap<>();
            jsonMap.put("user", "李四");
            jsonMap.put("postDate", new Date());
            jsonMap.put("message", "laas 升级 RestHighLevelClient ");
            IndexRequest indexRequest = new IndexRequest(indexName,"doc").source(jsonMap);
            IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);

            if (indexResponse.status() == RestStatus.CREATED) {
                System.out.println("Document 1 indexed successfully.");
            } else {
                System.out.println("Failed to index Document 1.");
            }

        } catch (Exception e) {
            System.err.println("Error adding documents: " + e.getMessage());
        }
    }



    @Test
    public void deletee_restHighLevelClient() {
        String indexName = "lass_test_resthighlevelclient";
        boolean result = elasticsearchTemplate.deleteIndex(indexName);
        System.out.println(result);
    }

4.ElasticsearchRestTemplate

 @Autowired
    private  ElasticsearchRestTemplate  restTemplate;

    @Test
    public void createIndex_restTemplate() {

        //根据实体类创建索引,
        boolean result1 = restTemplate.createIndex(Student.class);
        System.out.println(result1);
        //将索引放到软件里面
        boolean results = restTemplate.putMapping(Student.class);

    }

    @Test
    public void addDocuments_restTemplate() {

        Student student = new Student();
        student.setId("123");
        student.setName("张三");
        student.setAddress("北京市海淀区回龙观东大街");
        student.setAge(18);

        IndexQuery query = new IndexQuery();
        query.setObject(student);

        String result = restTemplate.index(query);
        System.out.println(result);
    }

    @Test
    public void bulk_restTemplate(){
        List<IndexQuery> list = new ArrayList<>();
        // IndexQuery多行写法
        IndexQuery indexQuery = new IndexQuery();
        indexQuery.setObject(new Student("1", "王五", "北京东城", 12));
        list.add(indexQuery);
        // IndexQuery 连缀写法
        list.add(new IndexQueryBuilder().withObject(new Student("2", "赵六", "北京西城", 13)).build());
        list.add(new IndexQueryBuilder().withObject(new Student("3", "吴七", "北京昌平", 14)).build());
        restTemplate.bulkIndex(list);
    }


    @Test
    public void deletee_restTemplate() {
        boolean result = restTemplate.deleteIndex(Student.class);
        System.out.println(result);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何修改uni微信小程序editor组件和input组件的placeholder默认样式

需求 修改input组件的placeholder的颜色修改editor的placeholder的默认样式 input组件的placeholder样式修改 使用 placeholder-class&#xff0c;官网&#xff08;input | uni-app官网&#xff09;说明如下&#xff1a; html <input type"text" placeholder&…

layui实现表格根据数据来勾选已保存的数据

示例图 勾选一次保存后&#xff0c;每次进到查询都会看到被勾选的数据&#xff0c;代码如下&#xff1a; done: function(res, curr, count) {var groupId "[[${groupId}]]";$.ajax({url: //写后端获取数据的接口type: GET,success: function(data) {console.log(d…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

Vue使用axios实现调用后端接口

准备后端接口 首先&#xff0c;我已经写好一个后端接口用来返回我的用户数据&#xff0c;并用Postman测试成功如下&#xff1a; 以我的接口为例&#xff0c;接口地址为&#xff1a;http://localhost:8080/user/selectAll 返回Json为&#xff1a; {"code": "2…

1.3纹理介绍

纹理是什么&#xff1f; 纹理的概念 一种可供着色器读写的结构化存储形式 任何图片都可以作为纹理 &#xff08;但纹理就是图片并不正确&#xff0c;因为纹理并不一定是图片&#xff0c;处理包含具体储存的信息以外&#xff0c;还会包含纹理采样的一些设置&#xff09; 纹理…

只刷题可以通过PMP考试吗?

咱们都知道&#xff0c;PMBOK那本书&#xff0c;哎呀&#xff0c;读起来确实有点费劲。所以&#xff0c;有些人就想了&#xff0c;干脆我就刷题吧&#xff0c;题海战术&#xff0c;没准儿也能过。这话啊&#xff0c;听起来似乎有点道理&#xff0c;但咱们得好好琢磨琢磨。 刷题…

卷积常用网络

目录 1.AlexNet2.VGG3.GoogleNet4.ResNet5.MobileNet 1.AlexNet AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;竞赛的冠军网络。 首次利用 GPU 进行网络加速训练。使用了 ReLU 激活函数&#xff0c;而不是传统的 Si…

音视频开发—FFmpeg 音频重采样详解

音频重采样&#xff08;audio resampling&#xff09;是指改变音频信号的采样率的过程。采样率&#xff08;sample rate&#xff09;是指每秒钟采集的音频样本数&#xff0c;通常以赫兹&#xff08;Hz&#xff09;或每秒样本数&#xff08;samples per second&#xff09;表示。…

如何理解和使用 this 关键字

this 关键字是许多编程语言中的一个核心概念&#xff0c;在面向对象编程&#xff08;OOP&#xff09;中尤为重要。在JavaScript、Java、C、C#等语言中&#xff0c;this 扮演着至关重要的角色。理解 this 的意义和用法&#xff0c;对于编写清晰、有效的代码至关重要。 什么是th…

OrangePi Kunpeng Pro体验——安装Hass与驱动SPI小屏幕

OrangePi Kunpeng Pro 是一款面向开发者和爱好者的高性能开发板。在本次测评中&#xff0c;主要将以前的一些代码在该开发板上实现&#xff0c;包括docker部署hass&#xff0c;引脚驱动SPI小屏幕。中间遇到了一些小小问题&#xff0c;但都成功了&#xff0c;一起来试试吧~ 一、…

wifi贴码推广哪家靠谱?

如今越来越多的人想轻资产创业&#xff0c;WIFI贴码是共享行业最无成本的创业项目了&#xff0c;而在选择厂商的时候&#xff0c;大家就想要知道哪家公司靠谱&#xff0c;更好、更便宜、可靠。那么wifi贴码推广哪家靠谱&#xff1f;别急&#xff0c;下面小编将带你一起了解。 目…

LLM - 模型下载与 git-lfs 安装

目录 一.引言 二.安装 git lfs 1.使用 apt-get 安装 2.使用 Brew 安装 3.LFS 验证 三.总结 一.引言 在 HuggingFace 上下载模型时提供一个 git clone 的指令&#xff0c;执行后可以下载对应模型的模型文件: 但是本机还没有 git lfs 命令: git: lfs is not a git comman…

CPU对代码执行效率的优化,CPU的缓存、指令重排序

目录 一、CPU对代码执行效率的优化 1. 指令流水线&#xff08;Instruction Pipelining&#xff09; 2. 超标量架构&#xff08;Superscalar Architecture&#xff09; 3. 动态指令重排序&#xff08;Dynamic Instruction Reordering&#xff09; 4. 分支预测&#xff08;…

文献解读-群体基因组第二期|《中国人群中PAX2新生突变的检测及表型分析:一项单中心研究》

关键词&#xff1a;应用遗传流行病学&#xff1b;群体测序&#xff1b;群体基因组&#xff1b;基因组变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Detection of De Novo PAX2 Variants and Phenotypes in Chinese Population: A Single-Cente…

下一代 CI/CD:利用 Tekton 和 ArgoCD 实现云原生自动化

一、回顾目标 背景&#xff1a; ​ 部门业务上云&#xff0c;之前服务采用传统的部署方式&#xff0c;这种方式简单&#xff0c;但是不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算资源&#xff0c;而且程序之间容易产生影响。随着互联网时代的到来&#xff…

【Chrono Engine学习总结】6-创建自定义场景-6.1-3D场景获取

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 Chrono可以导入自定义的三维模型&#xff0c;所以想自己搭建一个3D仿真环境。过程中遇到了一些问题&#xff0c;记录与整理。 1、3D环境的创建方法 Chrono的Irrlich…

2024年6月1日(星期六)骑行禹都甸

2024年6月1日 (星期六&#xff09;骑行禹都甸&#xff08;韭葱花&#xff09;&#xff0c;早8:30到9:00&#xff0c;昆明氧气厂门口集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:昆明氧气厂门口集合 &#xff0c;…

视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案

为了实现“以信息化推动应急管理能力现代化”的目标&#xff0c;应急管理部提出了加速现代信息技术与应急管理业务深度融合的计划。这一计划是国家加强和改进应急管理工作的关键举措&#xff0c;也是满足日益严峻的应急管理形势和人民群众不断增长的公共安全需求的紧迫需求。 为…

12个好用的视频自动加字幕工具

多个提供视频字幕生成及翻译服务的工具和平台&#xff0c;涵盖了从自动识别到翻译、配音等多种功能&#xff0c;适合不同需求的用户选择使用。 网易见外: 支持视频智能字幕功能&#xff0c;转换正确率高&#xff0c;转换后的字幕可以直接导入Pr和会声会影等主流剪辑工具&#…