Elasticsearch 7.6 - Springboot应用基础操作篇

ES 7.6 - JAVA应用基础操作篇

    • 环境准备
      • 依赖配置
    • 实体类准备
    • 使用说明
    • 索引/映射操作
      • 创建索引和映射
      • 索引和映射相关查询
      • 删除索引
    • 文档操作
      • 插入数据
      • 更新数据
      • 删除数据
      • 批量操作
    • 文档查询
      • 根据ID查询
      • 根据字段精准查询
      • 根据字段分词查询
      • 控制返回字段
      • 范围查询
      • 组合查询
      • 排序+分页
      • 高亮搜索
      • 聚合查询
    • 场景查询实操
      • 查询2023年中男、女的数量并找出对应的最大/最小年龄
      • 查询在地址中包含 "深圳" 或者 备注中包含 "积极" 的 男性青年(18-30岁)
      • 要求根据关键字找出匹配项目标,高亮实时预览
      • 分别找出男、女性别中年龄最小的三个人(TOP N)
      • 查询tag中带有某些标签的或者出身地在某某地的人,按照年龄降序,并且分页
    • 总结

上文已经教了大家最基本的操作了,那我们在java代码里面要如何实现呢?本文的目的就是教大家在springboot框架下实现上文的API操作,也就是CURD!

环境准备

首先我们要知道ES的API都是HTTP请求!!!!,所以什么语言都可以操作,就是发送请求和处理返回而已嘛,只是说现在这种封装不需要我们做,有人做好了,这种叫做ES的客户端!

依赖配置

我们直接采用Spring-data-es的依赖,先看一下版本依赖说明:

在这里插入图片描述

这里建议客户端版本和你自身搭建的es版本保持一致(es不同版本间api差异很大,如果不想出现莫名其妙的错的最好一致),所以这里我们选择springboot 2.3版本,这里给出spring-data-es的官方文档

# springboot版本
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent># spring-elasticsearch依赖
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>4.0.9.RELEASE</version>
</dependency>

因为我这ES是7.6的,所以选择使用HighLevelRestClient客户端,虽然这个已经在高版本过时了(8.x),但是在7.x版本里面官方建议使用这个

在这里插入图片描述

项目引入依赖后,使用非常简单,文件中配置一下ES地址,就可以愉快的访问啦:

# yml配置文件
spring:elasticsearch:rest:uris: ip:portusername: password: 

实体类准备

@Data
@Document(indexName = "es_apply_test")
public class EsTest {@Idprivate Long id;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String name;@Field(type = FieldType.Keyword)private String sex;@Field(type = FieldType.Integer)private Integer age;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String remark;@Field(type = FieldType.Keyword)private String[] tag;@Field(type = FieldType.Text,analyzer = "ik_max_word")private String addressLocation;@Field(type = FieldType.Keyword)private String birthAddress;@Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss",format = DateFormat.custom)private Date createTime;@Field(type = FieldType.Boolean)private Boolean hasGirlFriend;public EsTest(){}// 下面都是为了生成测试数据而准备的private final static String[] city=new String[]{"深圳","广州","上海","北京","武汉"};private final static String[] address=new String[]{"北京市朝阳区北辰东路15号","上海市黄浦区人民大道200号","深圳市福田区福中三路市民中心C区","武汉市江岸区一元街道沿江大道188号","广州市花都区新华街新都大道68号"};public static EsTest getRandomData(Long id){EsTest esTest = new EsTest();esTest.setId(id);esTest.setName(RandomUtil.randomString("张三李四王五陈六江文档词测试",3));esTest.setSex(id%2==0 ? "男":"女");esTest.setAge(RandomUtil.randomInt(15,30));esTest.setRemark(RandomUtil.randomString("活波开朗,具有进取精神和团队精神,有较强的动手能力。良好协调沟通能力,适应力强,反应快、积极、细心、灵活, 具有一定的社会交往能力",15));esTest.setTag(new String[]{RandomUtil.randomString("活波开朗,具有进取精神和团队精神,有较强的动手能力。良好协调沟通能力,适应力强,反应快、积极、细心、灵活, 具有一定的社会交往能力",3),RandomUtil.randomString("活波开朗,具有进取精神和团队精神,有较强的动手能力。良好协调沟通能力,适应力强,反应快、积极、细心、灵活, 具有一定的社会交往能力",3),RandomUtil.randomString("活波开朗,具有进取精神和团队精神,有较强的动手能力。良好协调沟通能力,适应力强,反应快、积极、细心、灵活, 具有一定的社会交往能力",3)});esTest.setAddressLocation(address[RandomUtil.randomInt(0,address.length-1)]);esTest.setBirthAddress(city[RandomUtil.randomInt(0,city.length-1)]);esTest.setCreateTime(RandomUtil.randomDay(0,100));esTest.setHasGirlFriend(id%4==0 ? true:false);return esTest;}}
  • 注解:@Document用来声明Java对象与ElasticSearch索引的关系

    indexName 索引名称

    type 索引类型

    shards 主分区数量

    replicas 副本分区数量

    createIndex 索引不存在时,是否自动创建索引,默认true

    不建议自动创建索引(自动创建的索引 是按着默认类型和默认分词器)

  • 注解:@Id 表示索引的主键

  • 注解:@Field 用来描述字段的ES数据类型,是否分词等配置,等于Mapping描述

    index 设置字段是否索引,默认是true,如果是false则该字段不能被查询

    store 默认为no,被store标记的fields被存储在和index不同的fragment中,以便于快速检索。虽然store占用磁盘空间,但是减少了计算。

    type 数据类型(text、keyword、date、object、geo等)

    analyzer 对字段使用分词器,注意一般如果要使用分词器,字段的type一般是text。

    format 定义日期时间格式,详细见 官方文档: https://www.elastic.co/guide/reference/mapping/date-format/.

  • 注解:@CompletionField 定义关键词索引 要完成补全搜索

    analyzer 对字段使用分词器,注意一般如果要使用分词器,字段的type一般是text。

    searchAnalyzer 显示指定搜索时分词器,默认是和索引是同一个,保证分词的一致性。

    maxInputLength:设置单个输入的长度,默认为50 UTF-16 代码点

使用说明

我们引入依赖后,在使用的时候有四种使用方式(下面我由简→难说明一下):

  • ElasticsearchRepository:自动生成简单CURD方法,直接调用即可(复杂的不友好)
  • ElasticsearchRestTemplate:内部使用的是RestHighLevelClient,它帮我们封装了一层
  • RestHighLevelClient:直接使用客户端
  • 自己封装客户端:之前说了本质就是HTTP请求,自己封装一下,直接调API呗,这比啥都好使

本文使用ElasticsearchRestTemplate(对小白友好),但是我个人强烈推荐直接用RestHighLevelClient,因为这个支持得更全面还同时支持同步和异步操作,本文有些操作也会用到这个

本文索引名称:es_apply_test

客户端注入:

在这里插入图片描述

索引/映射操作

创建索引和映射

@Test
void createIndexAndMapping() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(EsTest.class);// 判断索引是否已经存在if(!indexOperations.exists()){// 不存在则创建indexOperations.create();Document mapping = indexOperations.createMapping(EsTest.class);indexOperations.putMapping(mapping);}log.info("使用API查询查看..................");
}

索引和映射相关查询

@Test
void queryIndexAndMapping() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(EsTest.class);boolean exists = indexOperations.exists();log.info("索引是否存在:{}",exists);Map<String, Object> mapping = indexOperations.getMapping();log.info("映射:{}",JSONObject.toJSONString(mapping));Map<String, Object> settings = indexOperations.getSettings();log.info("索引设置:{}",JSONObject.toJSONString(settings));// 索引刷新(这个功能用处,后面讲理论的时候你会知道是干嘛的)indexOperations.refresh();
}

删除索引

@Test
void deletedIndex() {IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(EsTest.class);indexOperations.delete();
}

文档操作

插入数据

/** 插入一条数据 */@Testvoid insertDoc() {// 插入一条elasticsearchRestTemplate.save(EsTest.getRandomData(1L));// 同时插入多条 实际是遍历一条一条插入而不是用的bulk命令elasticsearchRestTemplate.save(EsTest.getRandomData(2L),EsTest.getRandomData(3L));}

更新数据

    /** 更新数据 */@Testvoid updateDoc() throws IOException {// es的数据结构都是文档,其实不存在文档更新,每次更新都会产生新的文档(这个是很低效的),所以es在API方面也看的出来对更新不是很友好// 没办法,虽然更新很低效,但终究得改呀// 下面提供几种方式// 1.根据ID更新UpdateQuery build = UpdateQuery.builder("1").withDocument(Document.parse("{ \"name\": \"根据ID更新\" }")).build();elasticsearchRestTemplate.update(build,elasticsearchRestTemplate.getIndexCoordinatesFor(EsTest.class));// 2.条件更新// 采用highLevel客户端,根据查询条件 使用脚本更新 等同于_update_by_query APIUpdateByQueryRequest request = new UpdateByQueryRequest("es_apply_test");request.setQuery(QueryBuilders.termQuery("age","24"));request.setScript(new Script("ctx._source['age']='300';ctx._source['remark']='根据条件批量更新';"));restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);}

删除数据

    /** 删除数据 */@Testvoid deleteDoc() throws IOException {// 1.根据ID删除elasticsearchRestTemplate.delete("1",EsTest.class);// 2.条件删除NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.termQuery("id", "3")).build();elasticsearchRestTemplate.delete(build,EsTest.class,elasticsearchRestTemplate.getIndexCoordinatesFor(EsTest.class));}

批量操作

    /** 批量增、删、改操作 */@Testvoid bulkDoc() throws IOException {// 量大的话强烈推荐这种方式,因为ES本身是以查询突出,修改的吞吐量并不高// 1. 批量插入BulkRequest insertRequest = new BulkRequest();for(int i=1;i<=20;i++){IndexRequest indexRequest = new IndexRequest("es_apply_test");indexRequest.id(String.valueOf(i));indexRequest.source(JSONObject.toJSONString(EsTest.getRandomData((long)i)),XContentType.JSON);insertRequest.add(indexRequest);}BulkResponse insertResult = restHighLevelClient.bulk(insertRequest, RequestOptions.DEFAULT);log.info("是否失败: {},失败原因:{}",insertResult.hasFailures(),insertResult.buildFailureMessage());// 2. 批量更新BulkRequest updateRequest = new BulkRequest();for(int i=1;i<=5;i++){UpdateRequest indexRequest = new UpdateRequest();indexRequest.id(String.valueOf(i));indexRequest.index("es_apply_test");HashMap<String, Object> objectObjectHashMap = new HashMap<>();objectObjectHashMap.put("name","bulk批量更新");indexRequest.doc(objectObjectHashMap);updateRequest.add(indexRequest);}BulkResponse updateResult = restHighLevelClient.bulk(updateRequest, RequestOptions.DEFAULT);log.info("是否失败: {},失败原因:{}",updateResult.hasFailures(),updateResult.buildFailureMessage());// 3. 批量删除BulkRequest deleteRequest = new BulkRequest();for(int i=1;i<=5;i++){DeleteRequest request = new DeleteRequest();request.id(String.valueOf(i));request.index("es_apply_test");updateRequest.add(request);}BulkResponse deleteResult = restHighLevelClient.bulk(deleteRequest, RequestOptions.DEFAULT);log.info("是否失败: {},失败原因:{}",deleteResult.hasFailures(),deleteResult.buildFailureMessage());// 当然也可混合操作 就是 _bulk API}

文档查询

根据ID查询

    /** 根据id查 */@Testvoid getDataById() {EsTest esTest = elasticsearchRestTemplate.get("1", EsTest.class);log.info("结果:{}", JSONObject.toJSONString(esTest));}

根据字段精准查询

    @Testvoid termQuery() {// term 精准查询TermQueryBuilder termQuery = QueryBuilders.termQuery("age", 10);NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(termQuery);SearchHits<EsTest> termResult = elasticsearchRestTemplate.search(nativeSearchQuery, EsTest.class);log.info("term-> 总数量:{} 结果:{}", termResult.getTotalHits(),JSONObject.toJSONString(termResult.getSearchHits()));// terms 精准查询TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("tag", "良心力", "高于动");NativeSearchQuery nativeSearchQuery1 = new NativeSearchQuery(termsQueryBuilder);SearchHits<EsTest> termsResult = elasticsearchRestTemplate.search(nativeSearchQuery1, EsTest.class);log.info("terms-> 总数量:{} 结果:{}", termsResult.getTotalHits(),JSONObject.toJSONString(termsResult.getSearchHits()));}

根据字段分词查询

    /** 根据字段分词查询 */@Testvoid matchQuery() {// matchall 全量查询 默认是分页查询10条MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(matchAllQueryBuilder);SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(nativeSearchQuery, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));// match 根据字段分词查询(字段分词)MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("addressLocation", "街道");NativeSearchQuery nativeSearchQuery1 = new NativeSearchQuery(matchQueryBuilder);SearchHits<EsTest> match = elasticsearchRestTemplate.search(nativeSearchQuery1, EsTest.class);log.info("match -> 总数量:{} 结果:{}", match.getTotalHits(),JSONObject.toJSONString(match.getSearchHits()));// match_phrase 根据字段分词查询(字段不分词)MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("addressLocation", "街道,武汉");NativeSearchQuery nativeSearchQuery2 = new NativeSearchQuery(matchPhraseQueryBuilder);SearchHits<EsTest> matchPhrase = elasticsearchRestTemplate.search(nativeSearchQuery2, EsTest.class);log.info("match_phrase -> 总数量:{} 结果:{}", matchPhrase.getTotalHits(),JSONObject.toJSONString(matchPhrase.getSearchHits()));// multi_match 根据字段分词查询多个字段MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("街道,武汉,队协", "addressLocation", "remark");NativeSearchQuery nativeSearchQuery3 = new NativeSearchQuery(multiMatchQueryBuilder);SearchHits<EsTest> multiMatch = elasticsearchRestTemplate.search(nativeSearchQuery3, EsTest.class);log.info("multiMatch -> 总数量:{} 结果:{}", multiMatch.getTotalHits(),JSONObject.toJSONString(multiMatch.getSearchHits()));}

控制返回字段

    /** 控制返回字段 */@Testvoid fieldFilterQuery() {// matchall 全量查询 并控制返回字段NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withFields("id", "name").build();SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}

范围查询

    /** 范围查询 */@Testvoid rangeQuery() {// 范围查询 并控制返回字段NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.rangeQuery("age").gte(20).lte(30)).withFields("id", "name","age").build();SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}

组合查询

    /** 组合查询 and 、or 、!= */@Testvoid boolGroupQuery() {// 范围查询 并控制返回字段// =10岁 !=男NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("age",23)).mustNot(QueryBuilders.termQuery("sex","男"))).withFields("id", "name","age","sex").build();SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}

排序+分页

    /** 排序+分页 */@Testvoid sortAndPageQuery() {// 排序+分页  排序可以多个NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withSort(SortBuilders.fieldSort("age").order(SortOrder.ASC)).withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC)).withSort(SortBuilders.scoreSort()).withFields("id", "name","age","sex").withPageable(PageRequest.of(0,5)).build();SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}

高亮搜索

    /** 高亮搜索 */@Testvoid highlightQuery() {// 高亮搜索NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery("武汉深圳", "addressLocation", "remark")).withFields("id", "name","addressLocation","remark").withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).withHighlightFields(new HighlightBuilder.Field("addressLocation"),new HighlightBuilder.Field("remark")).build();SearchHits<EsTest> matchAll = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", matchAll.getTotalHits(),JSONObject.toJSONString(matchAll.getSearchHits()));}

聚合查询

    /** 聚合查询 */@Testvoid aggregateQuery() {// 不分组 聚合查询NativeSearchQuery build = new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.avg("ageAvg").field("age")).addAggregation(AggregationBuilders.sum("ageSum").field("age")).addAggregation(AggregationBuilders.max("ageMax").field("age")).addAggregation(AggregationBuilders.min("ageMin").field("age")).withPageable(PageRequest.of(0,1)) // 应该设置为0,因为只需要聚合数据,但无赖有校验设置不了.build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("match all-> 总数量:{} 结果:{}", search.getTotalHits(),JSONObject.toJSONString(search.getAggregations()));// 先分组 在聚合NativeSearchQuery build1 = new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms("groupBySex").field("sex").subAggregation(AggregationBuilders.avg("ageAvg").field("age")).subAggregation(AggregationBuilders.sum("ageSum").field("age")).subAggregation(AggregationBuilders.max("ageMax").field("age")).subAggregation(AggregationBuilders.min("ageMin").field("age"))).withPageable(PageRequest.of(0,1)) // 应该设置为0,因为只需要聚合数据,但无赖有校验设置不了.build();SearchHits<EsTest> search1 = elasticsearchRestTemplate.search(build1, EsTest.class);Map<String, Aggregation> map = search1.getAggregations().asMap();Aggregation groupBySex = map.get("groupBySex");log.info("打断点看吧:{}",groupBySex);}

场景查询实操

查询2023年中男、女的数量并找出对应的最大/最小年龄

    /** 查询2023年中男、女的数量并找出对应的最大/最小年龄 */@Testvoid demo1() {NativeSearchQuery build = new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms("groupBySex").field("sex").subAggregation(AggregationBuilders.count("count").field("id")).subAggregation(AggregationBuilders.max("maxAge").field("age")).subAggregation(AggregationBuilders.min("minAge").field("age"))).withPageable(PageRequest.of(0,1)).build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("打断点查看:{}",search.getAggregations());}

查询在地址中包含 “深圳” 或者 备注中包含 “积极” 的 男性青年(18-30岁)

要求关键词高亮

/** 查询在地址中包含 "深圳" 或者 备注中包含 "积极" 的 男性青年(18-30岁),要求关键词高亮 */@Testvoid demo2() {NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("sex","男")).must(QueryBuilders.rangeQuery("age").gte(18).lte(30)).must(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("addressLocation","深圳")).should(QueryBuilders.matchQuery("remark","积极")))).withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).withHighlightFields(new HighlightBuilder.Field("addressLocation"),new HighlightBuilder.Field("remark")).build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("总量:{} 数据:{}",search.getTotalHits(),JSONObject.toJSONString(search.getSearchHits()));}

要求根据关键字找出匹配项目标,高亮实时预览

(搜地址、名称,返回 名称+id + 地址)

/** 搜索框:要求根据关键字找出匹配项目标,高亮实时预览(搜地址、名称,返回 名称+id + 地址) */@Testvoid demo3() {NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery("林深","name","addressLocation")).withFields("id", "name","addressLocation").withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).withHighlightFields(new HighlightBuilder.Field("addressLocation"),new HighlightBuilder.Field("name")).build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("总量:{} 数据:{}",search.getTotalHits(),JSONObject.toJSONString(search.getSearchHits()));}

分别找出男、女性别中年龄最小的三个人(TOP N)

    /** 分别找出男、女性别中年龄最小的三个人(TOP N) */@Testvoid demo4() {NativeSearchQuery build = new NativeSearchQueryBuilder().addAggregation(AggregationBuilders.terms("groupBySex").field("sex").subAggregation(AggregationBuilders.topHits("top3").sort("age",SortOrder.ASC).fetchSource(new String[]{"name","sex","age"},null).size(3))).build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("打断点自己看-》总量:{} 数据:{}",search.getTotalHits(),search.getAggregations());}

查询tag中带有某些标签的或者出身地在某某地的人,按照年龄降序,并且分页

    /** 查询tag中带有某些标签的或者出身地在某某地的人,按照年龄降序,并且分页 */@Testvoid demo5() {NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("tag","断能能","高于动","上格心","对朗步")).should(QueryBuilders.termsQuery("birthAddress","深圳","章丘"))).withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC)).withSort(SortBuilders.scoreSort().order(SortOrder.DESC)).withPageable(PageRequest.of(0,5)).build();SearchHits<EsTest> search = elasticsearchRestTemplate.search(build, EsTest.class);log.info("总量:{} 数据:{}",search.getTotalHits(),search.getSearchHits());}

总结

到了这恭喜你,你也成功的入门ES,成为了一名ES的CURD BOY,但你觉得ES就仅仅如此吗?少年加油吧,才刚开始呢!!

后面会介绍一些重点操作,以及相应的进阶理论知识,理论会偏多!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue插槽实现商品列表-编辑渲染

商品列表 文章目录 商品列表核心步骤创建组件 1. MyTag组件详细步骤双击显示&#xff0c;自动聚焦失去焦点&#xff0c;隐藏输入框回显标签信息回车修修改内容&#xff0c;同时隐藏输入框 MyTable组件详细步骤1-动态的设置整个表格的数据 &#xff1a; props2-实现自定义结构-插…

HBase集群环境搭建与测试

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

Java反射机制,动态代理,hook以及在Retrofit源码中的应用

1.反射的基础知识&#xff1a; Java的反射机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。这种动态获取程序信息以及…

如何判断自己的qt版本呢?

如何判断自己的qt版本呢? 前情提要很简单,按照如下图所示,即可查看当前打开的qtCreator的版本如何打开5.15.2版本的qtCreator呢?安装教程 前情提要 我的电脑已经安装了qt5.14.1,然后我又安装了qt5.15.2,我想尝试一下同一台电脑能否适应两个版本的qt? 当我安装完成qt5.15.2后…

2023-08-31 LeetCode每日一题(一个图中连通三元组的最小度数)

2023-08-31每日一题 一、题目编号 1761. 一个图中连通三元组的最小度数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui…

兔鲜儿 - 用户模块

目录 兔鲜儿 - 用户模块​ 会员中心页(我的)​ 静态结构​ 猜你喜欢分页加载 会员设置页 设置页分包和预下载 静态结构 退出登录 会员信息页 个人信息页准备工作 静态结构 获取会员信息​ 渲染会员信息 更新会员头像 更新表单信息​ 兔鲜儿 - 用户模块​ 在用户…

文心一言接入Promptulate,开发复杂LLM应用程序

简介 最近在尝试将文心一言的LLM能力接入Promptulate&#xff0c;故写了一篇博客记录一下&#xff0c;Promptulate 是 Promptulate AI 旗下的大语言模型自动化与应用开发框架&#xff0c;旨在帮助开发者通过更小的成本构建行业级的大模型应用&#xff0c;其包含了LLM领域应用层…

使用 Node-RED 构建 DolphinDB 低代码平台

前言 DolphinDB 是由浙江智臾科技有限公司研发的一款高性能分布式时序数据库&#xff0c;集成了功能强大的编程语言和高容量高速度的流数据分析系统&#xff0c;为海量结构化数据的快速存储、检索、分析及计算提供一站式解决方案。DolphinDB 数据库支持每秒百万级数据写入&…

day 2

多态&#xff0c;虚函数&#xff0c;纯虚函数 1.多态&#xff1a;父类的指针或者引用&#xff0c;指向或初始化子类的对象&#xff0c;调用子类对父类重写的函数&#xff0c;进而展开子类的功能。 函数重写 1> 必须有继承关系 2> 子类和父类有同名同类型的函数 3>…

(AS笔记)上传aar包到Maven中央仓库

目录 一、SonaType账户注册与登录 &#xff08;1&#xff09;注册 &#xff08;2&#xff09;登录 二、创建工单 &#xff08;1&#xff09;Github子域名验证 &#xff08;2&#xff09;自定义域名验证 三、登录Nexus Repository Manager 四、GPG签名生成和发布 五、Andr…

Springboot启动异常 Command line is too long

Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line&#xff0c;选择 JAR manife…

数学建模:数据的预处理

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 数据预处理数据变换数据清洗缺失值处理异常值处理 数据预处理 数据变换 常见的数据变换的方式&#xff1a;通过某些简单的函数进行数据变换。 x ′ x 2 x ′ x x ′ log ⁡ ( x ) ∇ f ( x k )…

Jenkins测试报告样式优化

方式一&#xff1a;修改Content Security Policy&#xff08;临时解决&#xff0c;Jenkins重启后失效) 1、jenkins首页—>ManageJenkins—>Tools and Actions标题下—>Script Console 2、粘贴脚本输入框中&#xff1a;System.setProperty("hudson.model.Directo…

word6 图文混排

目录 7-1 段落缩进排版7-2 搞定多级列表难题 7-1 段落缩进排版 段落对齐 缩进问题 悬挂缩进&#xff1a;缩进首行以外的段落 段落对齐&#xff1a; 7-2 搞定多级列表难题

MySQL数据库之索引

目录 一、索引的概念 二、索引的作用 三、索引的副作用 四、创建索引的规则 1、适合创建为索引的字段的规则 2、MySQL的优化 哪些字段/场景适合创建索引&#xff0c;哪些不适合 五、索引的分类和创建 1、索引的分类 2、三种创建方式 3、索引的创建演示 1、创建普通索…

Lvs+KeepAlived高可用高性能负载均衡

目录 1.环境介绍 2.配置keepalived 3.测试 1.测试负载均衡 2.测试RS高可用 3.测试LVS高可用 3.1测试lvs主服务宕机 3.2.测试lvs主服务器恢复 4.我在实验中遇到的错误 1.环境介绍 环境&#xff1a;centos7 RS1---RIP1:192.168.163.145 VIP 192.168.163.200 RS2---RIP2…

css强制显示一行

要强制将文本内容显示在一行中&#xff0c;可以使用CSS的white-space属性和overflow属性来实现。 首先&#xff0c;将white-space属性设置为nowrap&#xff0c;这样文本内容就不会换行。然后&#xff0c;将overflow属性设置为hidden&#xff0c;这样超出一行的内容就会被隐藏起…

带纽扣电池产品出口澳洲安全标准,纽扣电池IEC 60086认证

澳大利亚政府公布了《消费品&#xff08;纽扣/硬币电池&#xff09;安全标准》和《消费品&#xff08;纽扣/硬币电池&#xff09;信息标准》。届时出口纽扣/硬币电池以及含有纽扣/硬币电池产品到澳大利亚的供应商&#xff0c;必须遵守这些标准中的要求。 一、 安全标准及信息标…

【SQL中DDL DML DQL DCL所包含的命令】

SQL中DDL DML DQL DCL所包含的命令 关于DDL、DML、DQL、DCL的定义和适用范围如下&#xff1a; 数据定义语言&#xff08;Data Definition Language&#xff0c;DDL&#xff09;&#xff1a; DDL用于创建、修改和删除数据库中的表、视图、索引等对象。它的主要命令包括CREATE、A…

Xshell7和Xftp7的下载、安装及连接服务器的教程

1.下载 1.官网地址&#xff1a; XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项&#xff0c;然后无脑下一步 3.连接服务器 1.打开Xshell7&#xff0c;然后新建会话 2.填写相关信息 出现Connection establ…