ElasticsearchJavaClient工具类分析

最近升级了Elasticsearch版本,从7.X升级到8.X的变化还是比较大的,原来7版本用的是RestHighLevelClient,8.X弃用RestHighLevelClient转而支持ElasticsearchClient,并且api调用方式经过建造者模式的改造,变成了链式调用。

因此为了更好地使用ElasticsearchClient的api操作Elasticsearch,封装了一个工具类,包含了常用的一些数据操作的方法。废话不多说直接上代码。。。

1、pom依赖

        <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
            <version>8.15.2</version>
        </dependency>
        <dependency>
            <artifactId>elasticsearch-rest-client</artifactId>
            <groupId>org.elasticsearch.client</groupId>
            <version>8.15.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.30</version>
        </dependency>

2、工具类代码

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.Result;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.Time;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.indices.AnalyzeRequest;
import co.elastic.clients.elasticsearch.indices.AnalyzeResponse;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import co.elastic.clients.elasticsearch.indices.analyze.AnalyzeToken;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Elasticsearch工具类
 * Elasticsearch版本:8.15.3
 */
public class ElasticsearchJavaClient {
    private ElasticsearchClient client;

    /**
     * 构造方法,获取客户端(未开启认证)
     * @param httpUrls
     */
    public ElasticsearchJavaClient(String[] httpUrls){
        HttpHost[] httpHosts = Arrays.stream(httpUrls).map(HttpHost::create).toArray(HttpHost[]::new);
        this.client = new ElasticsearchClient(new RestClientTransport(RestClient.builder(httpHosts).build(),
                new JacksonJsonpMapper()));
    }

    /**
     * 构造方法,获取客户端(开启认证,通过用户名密码进行认证并获取客户端)
     * @param httpUrls
     * @param username
     * @param password
     */
    public ElasticsearchJavaClient(String[] httpUrls, String username, String password){
        HttpHost[] httpHosts = Arrays.stream(httpUrls).map(HttpHost::create).toArray(HttpHost[]::new);
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        RestClientBuilder builder = RestClient.builder(httpHosts);
        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
            }
        });
        this.client = new ElasticsearchClient(new RestClientTransport(builder.build(), new JacksonJsonpMapper()));
    }


    /**
     * 创建索引
     * @param indexName  索引名
     * @param numberOfShards  分片数
     * @param numberOfReplicas  副本数
     * @param mapping  mapping设计json字符串
     * @return
     */
    public boolean createIndex(String indexName, Integer numberOfShards,
                               Integer numberOfReplicas, String mapping) {
        CreateIndexResponse response = null;
        try {
            response = client.indices()
                    .create(builder -> builder.index(indexName)
                            .settings(b -> b.numberOfReplicas(numberOfReplicas.toString())
                                    .numberOfShards(numberOfShards.toString()))
                            .mappings(a -> a.withJson(new StringReader(mapping))));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            client.shutdown();
        }
        return response.acknowledged();
    }

    /**
     * 删除索引
     * @param indexName  索引名
     * @return
     */
    public boolean deleteIndex(String indexName) {
        try {
            return client.indices().delete(a -> a.index(indexName)).acknowledged();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 判断索引是否已存在
     * @param indexName 索引名
     * @return
     */
    public boolean indexExisit(String indexName) {
        try {
            return client.indices().exists(req -> req.index(indexName)).value();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 由于数据落盘有默认的1秒延迟,刷新后使数据能被检索到
     * @param indexString
     */
    public void refresh(String indexString){
        try {
            client.indices().refresh(req -> req.index(indexString));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
    }

    /**
     * 插入数据
     * @param indexName
     * @param data
     * @return
     */
    public String insertData(String indexName, JSONObject data){
        try {
            IndexResponse response = client.index(a -> a.index(indexName).document(data));
            return response.id();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return null;
    }

    /**
     * 根据索引和_id查询数据
     * @param indexName
     * @param id
     * @return
     */
    public Map<String, Object> getDocById(String indexName, String id) {
        GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));
        try {
            GetResponse<Map> response = client.get(request, Map.class);
            if(response.found()){
                return response.source();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return null;
    }

    /**
     * 根据索引和_id查询数据
     * @param indexName
     * @param id
     * @return
     */
    public JSONObject getDocInfoById(String indexName, String id) {
        GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));
        try {
            GetResponse<JSONObject> response = client.get(request, JSONObject.class);
            if(response.found()){
                return response.source();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return null;
    }

    /**
     * 根据索引和_id查询数据,并过滤掉无需返回的字段
     * @param indexName
     * @param id
     * @param excludes
     * @return
     */
    public JSONObject getDocInfoById(String indexName, String id, String [] excludes) {
        GetRequest request = GetRequest.of(g -> g.index(indexName).id(id).sourceExcludes(Arrays.asList(excludes)));
        try {
            GetResponse<JSONObject> response = client.get(request, JSONObject.class);
            if(response.found()){
                return response.source();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return null;
    }

    /**
     * 根据索引和_id查询数据,并过指定要返回的字段
     * @param indexName
     * @param id
     * @param includes
     * @return
     */
    public JSONObject getDocInfoByIdWithIncludes(String indexName, String id, String [] includes) {
        GetRequest request = GetRequest.of(g -> g.index(indexName).id(id).sourceIncludes(Arrays.asList(includes)));
        try {
            GetResponse<JSONObject> response = client.get(request, JSONObject.class);
            if(response.found()){
                return response.source();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return null;
    }

    /**
     * 判断数据是否存在
     * @param indexName
     * @param id
     * @return
     */
    public boolean exists(String indexName, String id) {
        GetRequest request = GetRequest.of(g -> g.index(indexName).id(id));
        try {
            GetResponse<JSONObject> response = client.get(request, JSONObject.class);
            return response.found();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 根据索引和_id删除数据
     * @param indexName
     * @param id
     * @return
     */
    public boolean deleteDocById(String indexName, String id) {
        DeleteRequest request = DeleteRequest.of(a -> a.index(indexName).id(id));
        try {
            DeleteResponse response = client.delete(request);
            if(response != null && response.result() != null){
                return Result.Deleted.jsonValue().equals(response.result().jsonValue());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 更新数据
     * @param indexName
     * @param id
     * @param newDoc
     * @return
     */
    public boolean updateDocById(String indexName, String id, JSONObject newDoc) {
        UpdateRequest request = UpdateRequest.of(r -> r.id(id).index(indexName).doc(newDoc));
        request.refresh();
        try {
            UpdateResponse response = client.update(request, JSONObject.class);
            if(response != null && response.result() != null){
                return Result.Updated.jsonValue().equals(response.result().jsonValue());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 对输入的text使用analyzerName进行分词,返回分词后的词项
     * @param analyzerName
     * @param text
     * @return
     */
    public List<AnalyzeToken> analyze(String analyzerName, String text){
        AnalyzeRequest analyzeRequest = new AnalyzeRequest.Builder().analyzer(analyzerName).text(text).build();
        AnalyzeResponse response = null;
        try {
            response = client.indices().analyze(analyzeRequest);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return response.tokens();
    }

    /**
     * 批量删除
     * @param requestList
     * @return
     */
    public boolean bulkDelete(List<DeleteRequest> requestList){
        List<BulkOperation> ops = requestList
                .stream()
                .map(req -> BulkOperation.of(op -> op
                        .delete(d -> d.id(req.id()).index(req.index()))))
                .collect(Collectors.toList());
        try {
            BulkResponse response = client.bulk(r -> r.operations(ops));
            if(response != null ){
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 批量更新
     * @param requestList
     * @return
     */
    public boolean bulkUpdate(List<UpdateRequest> requestList){
        List<BulkOperation> ops = requestList
                .stream()
                .map(req -> BulkOperation.of(op -> op
                        .update(d -> d.id(req.id())
                                .index(req.index())
                                .action(a -> a.doc(req.doc())))))
                .collect(Collectors.toList());
        try {
            BulkResponse response = client.bulk(r -> r.operations(ops));
            if(response != null ){
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 批量插入数据
     * @param requestList
     * @return
     */
    public boolean bulkInsert(List<IndexRequest> requestList){
        List<BulkOperation> ops = requestList
                .stream()
                .map(req -> BulkOperation.of(op -> op
                        .index(i -> i.document(req.document()).index(req.index()))))
                .collect(Collectors.toList());
        try {
            BulkResponse response = client.bulk(r -> r.operations(ops));
            if(response != null ){
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 通过脚本批量更新
     * @param index
     * @param query
     * @param script
     * @return
     */
    public boolean updateByquery(String index, BoolQuery query, String script){
        try {
            UpdateByQueryResponse response = client.updateByQuery(q -> q.index(index)
                    .query(query._toQuery())
                    .script(s -> s.source(script)));
            if(response != null ){
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            client.shutdown();
        }
        return false;
    }

    /**
     * 检索
     * @param indexName
     * @param pageNo
     * @param pageSize
     * @param sortField
     * @param sortOrder
     * @param boolQuery
     * @return
     */
    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize,
                                 String sortField, SortOrder sortOrder, BoolQuery boolQuery) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize,
                                 String sortField, SortOrder sortOrder, BoolQuery boolQuery, String[] excludes) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes))))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,
                                 String sortField, SortOrder sortOrder, String sortField2, SortOrder sortOrder2) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder).field(sortField2).order(sortOrder2))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,
                                 String sortField, SortOrder sortOrder, String sortField2, SortOrder sortOrder2,
                                 String[] excludes) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes))))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder).field(sortField2).order(sortOrder2))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize, BoolQuery boolQuery,
                                 String sortField, SortOrder sortOrder, String[] includes, String[] excludes) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .source(a -> a.filter(f -> f.excludes(Arrays.asList(excludes)).includes(Arrays.asList(includes))))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, Integer pageNo, Integer pageSize,  BoolQuery boolQuery,
                                 String sortField, SortOrder sortOrder, String time) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .from((pageNo - 1) * pageSize)
                .size(pageSize)
                .scroll(new Time.Builder().time(time).build())
                .sort(s -> s.field(f -> f.field(sortField)
                        .order(sortOrder))).build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 查询符合条件的数据条数
     * @param indexName
     * @param boolQuery
     * @return
     */
    public CountResponse count(String indexName, BoolQuery boolQuery) {
        try {
            return client.count(c -> c.index(indexName).query(q -> q.bool(boolQuery)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public SearchResponse search(String indexName, BoolQuery boolQuery) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    public SearchResponse search(String indexName, BoolQuery boolQuery, int size) {
        SearchRequest request = new SearchRequest.Builder().index(indexName)
                .query(q -> q.bool(boolQuery))
                .size(size)
                .build();
        SearchResponse response = null;
        try {
            response = client.search(request, JSONObject.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }
}

如果本文对你有帮助,请点赞、收藏 + 关注,谢谢!!(本文将持续更新)

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

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

相关文章

minibatch时,损失如何记录

目录 minibatch时&#xff0c;损失如何记录 报错&#xff1a;UnboundLocalError: local variable coef referenced before assignment是什么回事 未溢出则不会报错&#xff0c;可以完整滴运行完成 indent 缩进 炫酷技能&#xff1a;一遍运行&#xff0c;一遍画图 实例1 解释…

Linux : Linux环境开发工具vim / gcc / makefile / gdb / git的使用

Linux环境开发工具的使用 一、操作系统的生态二、程序下载安装&#xff08;一&#xff09;程序安装方式&#xff08;二&#xff09;包管理器 yum / apt 运行原理 三、文本编辑器 vim&#xff08;一&#xff09;认识vim 下的操作模式&#xff08;二&#xff09;命令模式常用的快…

国产游戏崛起,燕云十六移动端1.9上线,ToDesk云电脑先开玩

游戏爱好者的利好消息出新了&#xff01;网易大型武侠仙游《燕云十六声》正式官宣&#xff0c;移动端要在1月9日正式上线了&#xff01;你期待手游版的燕云吗&#xff1f;不妨评论区留言说说你的看法。小编分别花了几个小时在台式机电脑和手机上都试了下&#xff0c;欣赏画面还…

力扣刷题:数组OJ篇(下)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.轮转数组&#xff08;1&#xff09;题目描述…

有序数据中插入不确定数据保证数据插入的位置顺序正确排序

解决有序数据中插入不确定数据保证数据插入的位置顺序正确排序 前言 java 数据库中存储自增id 有序的数据&#xff0c; 前端页面基于 id 5和 6 之间新增一条数据&#xff0c;在 id 6 和 7之间新增 2条&#xff0c;或者更复杂的场景&#xff0c;后台接口如何保存数据使得页面数…

python无需验证码免登录12306抢票 --selenium(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 就在刚刚我抢的票&#xff1a;2025年1月8日…

DNS协议漏洞利用实验_hust计算机网络安全实验

文章目录 计算机网络安全实验 DNS协议漏洞利用实验 docker使用 建立实验环境docker常用指令 一些注意事项设置本地 DNS 服务器 配置用户计算机设置本地DNS服务器在本地 DNS 服务器中建一个区域 修改主机文件&#xff08;可略&#xff09;netwox实施DNS的用户响应欺骗攻击netwo…

基于MP157AAA的I2C练习

练习要求&#xff1a; 通过I2C分别实现与芯片si7006(获取湿度、温度)和芯片ap3216(获取环境光照强度)的通讯&#xff1b; 1、运行效果 2、分析ap3216如何获取光照强度 2.1、需要操作的寄存器 通过分析手册&#xff0c;需要操作以下寄存器: 0x00&#xff1a;系统配置 0x0C&…

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 1-2 磁盘存储结构 ​编辑…

网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…

《Spring Framework实战》7:4.1.2.容器概述

欢迎观看《Spring Framework实战》视频教程 容器概述 该接口表示 Spring IoC 容器&#xff0c;并负责实例化、配置和组装 bean。 容器在组件上获取其指令&#xff0c;以实例化、配置和 通过读取配置元数据进行汇编。可以表示配置元数据 作为带注释的组件类、具有工厂方法的配置…

学生公寓技术规格书如何编写?

学生公寓限电柜的技术规格书主要包括以下内容‌&#xff1a; ‌用电计量计费‌&#xff1a;限电柜可以通过计算机售电管理系统进行用电计量计费&#xff0c;学生需要预交电费&#xff0c;系统会自动将数据传给控电柜和配电箱&#xff0c;对宿舍的电量进行累减计量‌。 ‌时间控…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层&#xff0c;它简化了缓存的使用和管理。Spring Cache默认使用服务器内存&#xff0c;并无法控制缓存时长&#xff0c;查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

MySQL事件功能简介

MySQL 的事件调度器&#xff08;Event Scheduler&#xff09;提供了一种便捷的方法来定时执行 SQL 语句&#xff0c;从而实现数据维护、报告生成等自动化操作。本文将详细介绍 MySQL 的事件功能&#xff0c;并说明如何使用 Navicat 管理这些事件。 1. 什么是 MySQL 事件调度器…

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

闲谭SpringBoot--ShardingSphere分库分表探究

文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文&#xff0c;我们对日志表&#xff0c;进行了按月的分表&#xff0c;这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢&#xff0c;除了提高硬件性能&#xff0c;还有一…

基于伪分布式模式部署Hadoop集群

1.上传Hadoop安装包 在/export/software目录下使用rz命令上传Hadoop安装包 2.创建目录 在/export/servers目录下创建wfb-hadoop目录&#xff0c;用于存放Hadoop的安装目录&#xff0c;命令如下&#xff1a; mkdir -p /export/servers/wfb-hadoop 3.安装Hadoop 1)将Hadoop安…

Android车载音频系统目录

目录 第一章 1.1 Android Automotive&#xff08;一&#xff09; 1.2 Android Automotive&#xff08;二&#xff09; 1.3 Android Automotive&#xff08;三&#xff09; 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…