ElasticSearch的自动补全功能(拼音分词器、自定义分词器、DSL实现自动补全查询、RestAPI实现自动补全查询)

文章目录

  • 1. 什么是自动补全
  • 2. 拼音分词器
    • 2.1 初识拼音分词器
    • 2.2 下载拼音分词器
    • 2.3 安装拼音分词器
    • 2.4 测试拼音分词器
  • 3. 自定义分词器
    • 3.1 拼音分词器存在的问题
    • 3.2 分词器(analyzer)的组成
    • 3.3 如何自定义分词器
    • 3.4 拼音分词器的可选参数
    • 3.5 配置自定义分词器的tokenizer和filter
    • 3.6 如何使用自定义分词器
    • 3.7 测试自定义分词器
      • 3.7.1 直接测试
      • 3.7.2 插入文档测试
    • 3.8 使用自定义分词器要注意的事项
  • 4. DSL实现自动补全查询
    • 4.1 字段的类型的约束
    • 4.2 查询语法
  • 5. 自动补全案例
    • 5.1 准备工作
      • 5.1.1 创建hotel索引库
      • 5.1.2 导入测试工程
      • 5.1.3 导入酒店数据到数据库中
      • 5.1.4 将数据库中的数据导入到ElasticSearch
    • 5.2 测试自动补全功能
  • 6. RestAPI实现自动补全查询
  • 7. 综合案例:实现搜索框自动补全

视频教程:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务


阅读本文前可以先阅读以下文章:

  • ElasticSearch快速入门——上篇(认识ElasticSearch、安装ElasticSearch、安装kibana、IK分词器、ElasticSearch中的基本概念、索引库操作、文档操作)
  • ElasticSearch快速入门——下篇(在Java代码中操作ElasticSearch、JavaRestClient、操作索引库、操作文档、DSL查询、JavaRestClient查询、数据聚合)
  • 通过docker启动ElasticSearch后为ElasticSearch设置用户和密码

1. 什么是自动补全

ElasticSearch 中的自动补全跟我们理解的自动补全不太一样,为了大家理解,我们来看一个案例

在这里插入图片描述

当我们在搜索框输入 sj 时,搜索框下方会显示以 sj 拼音首字母开头的词条(如手机、湿巾、数据线、史记、书架等),这个功能被称为自动补全

自动补全功能可以让用户尽可能地搜索到想要的东西,而不需要打出完整的内容

2. 拼音分词器

要想实现自动补全功能,我们需要先学习一下拼音分词器,因为自动补全功能是基于拼音分词器实现的

2.1 初识拼音分词器

拼音分词器的官网:analysis-pinyin

拼音分词器跟我们学过的 IK 分词器相似,都是 ElasticSearch 的一个插件

2.2 下载拼音分词器

下载地址:v7.17.18

在这里插入图片描述


本次演示使用的 ElasticSearch 版本为 7.17.18

其它 ElasticSearch 版本对应的拼音分词器的下载地址:Tags

2.3 安装拼音分词器

解压完成之后,将拼音分词器上传到 ElasticSearch 的 plugin 目录下(本次演示是通过 docker 安装 ElasticSearch 的)


先将拼音分词器上传到服务器,一般是当前用户的目录

cd ~

接着将拼音分词器复制到 ElasticSearch 的 plugin 的目录下

sudo cp elasticsearch-analysis-pinyin-7.17.18 -r /var/lib/docker/volumes/elasticsearch-plugins/_data

最后重启 ElasticSearch 容器

sudo docker restart elasticsearch

2.4 测试拼音分词器

我们在 Kibana 提供的控制台中测试拼音分词器是否生效


在浏览器打开 Kibana 提供的控制台

http://127.0.0.1:5601/app/dev_tools#/console

输入以下内容测试拼音分词器是否生效

POST /_analyze
{"text": ["练习时长两年半"],"analyzer": "pinyin"
}

测试结果如下,主要包含两部分内容:

  1. 每个字的完整拼音
  2. 每个字的拼音首字母的合并

在这里插入图片描述

{"tokens" : [{"token" : "lian","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 0},{"token" : "lxsclnb","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 0},{"token" : "xi","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 1},{"token" : "shi","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 2},{"token" : "chang","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 3},{"token" : "liang","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 4},{"token" : "nian","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 5},{"token" : "ban","start_offset" : 0,"end_offset" : 0,"type" : "word","position" : 6}]
}

3. 自定义分词器

3.1 拼音分词器存在的问题

拼音分词器还无法正常用于生产环境,因为拼音分词器存在一些问题

以 “练习时长两年半” 这句话为例,拼音分词器存在以下问题:

  1. “练习时长两年半” 这句话没有被分词,而是作为一个整体出现
  2. 把 “练习时长两年半” 这句话中的每一个字都形成了一个拼音(用处不大)
  3. 分词后的结果只剩下拼音,没有汉字

其实我们很少使用拼音搜索,大多数情况下我们都是使用中文去搜索的,分词后有拼音只是锦上添花,分词后的结果中汉字是必须保留的,所以我们需要对拼音分词器做一些配置,也就是自定义分词器

3.2 分词器(analyzer)的组成

ElasticSearch 中分词器(analyzer)的组成有三部分:

  • character filters:在 tokenizer 之前对文本进行处理,例如删除字符、替换字符
  • tokenizer:将文本按照一定的规则切割成词条(term),例如 keyword(不分词)、ik_smart 等
  • tokenizer filter:将 tokenizer 输出的词条做进一步处理,例如大小写转换、同义词处理、拼音处理等

在这里插入图片描述

3.3 如何自定义分词器

要想自定义分词器,一定要在创建索引库的时候去设置

我们可以在创建索引库时,通过 settings 来配置自定义的 analyzer(分词器)

自定义分词器时可以只设置分词器(analyzer)的某个部分

在这里插入图片描述

PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": "pinyin"}}}}
}

tokenizer 我们使用 ik_max_word,先分词,分好词后再将词条交给拼音分词器处理,这样做可以解决拼音分词器没有分词的问题

但是拼音分词器还存在两个问题:分词后的每一个字都形成了一个拼音、分词后的结果只剩下拼音,没有汉字

3.4 拼音分词器的可选参数

我们需要对拼音分词器做进一步的定制

在拼音分词器的官网上,给出了很多的可选参数(Optional Parameters)

在这里插入图片描述

参数名称含义
keep_first_letter启用后,只保留每个汉字的第一个字母。例如,刘德华变为ldh。默认:true。
keep_separate_first_letter启用后,保留每个汉字的第一个字母,并分别显示。例如,刘德华变为l,d,h。默认:false。注意:这可能会因词频增加查询的模糊度。
limit_first_letter_length设置第一个字母结果的最大长度。默认:16。
keep_full_pinyin启用后,保留每个汉字的完整拼音。例如,刘德华变为[liu,de,hua]。默认:true。
keep_joined_full_pinyin启用后,将每个汉字的完整拼音连接起来。例如,刘德华变为[liudehua]。默认:false。
keep_none_chinese保留结果中的非汉字字母或数字。默认:true。
keep_none_chinese_together保留非汉字字母在一起。默认:true。例如,DJ音乐家变为DJ,yin,yue,jia。当设置为false时,DJ音乐家变为D,J,yin,yue,jia。注意:需要先启用keep_none_chinese。
keep_none_chinese_in_first_letter在首字母中保留非汉字字母。例如,刘德华AT2016变为ldhat2016。默认:true。
keep_none_chinese_in_joined_full_pinyin在连接的完整拼音中保留非汉字字母。例如,刘德华2016变为liudehua2016。默认:false。
none_chinese_pinyin_tokenize如果非汉字字母是拼音,将其拆分为单独的拼音词。默认:true。例如,liudehuaalibaba13zhuanghan变为liu,de,hua,a,li,ba,ba,13,zhuang,han。注意:需要先启用keep_none_chinese和keep_none_chinese_together。
keep_original启用后,保留原始输入。默认:false。
lowercase将非汉字字母转换为小写。默认:true。
trim_whitespace默认:true。
remove_duplicated_term启用后,移除重复的词以节省索引空间。例如,de的变为de。默认:false。注意:可能与位置相关的查询受到影响。
ignore_pinyin_offset在6.0版本之后,偏移量受到严格限制,不允许重叠的词。通过此参数,将允许重叠的词,忽略偏移量。请注意,所有与位置相关的查询或高亮将变得不正确。如果需要偏移量,请设置为false。默认:true。

3.5 配置自定义分词器的tokenizer和filter

在这里插入图片描述

PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}}
}

创建一个自定义的分词器my_analyzer,使用ik_max_word分词器进行中文分词,并通过pinyin过滤器将中文词条转换为拼音,保留了原始中文词条和连接起来的全拼,同时限制了首字母长度并移除重复的词条

3.6 如何使用自定义分词器

自定义分词器创建好了之后,该怎么使用呢

要使用自定义分词器,我们需要在定义索引库字段(Mapping)的时候使用

在这里插入图片描述

PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer"}}}
}

3.7 测试自定义分词器

3.7.1 直接测试

POST /test/_analyze
{"text": ["练习时长两年半"],"analyzer": "my_analyzer"
}

测试结果

在这里插入图片描述

{"tokens" : [{"token" : "练习","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "lianxi","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "lx","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "时长","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "shichang","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "sc","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 1},{"token" : "两年","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "liangnian","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "ln","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "两","start_offset" : 4,"end_offset" : 5,"type" : "COUNT","position" : 3},{"token" : "liang","start_offset" : 4,"end_offset" : 5,"type" : "COUNT","position" : 3},{"token" : "l","start_offset" : 4,"end_offset" : 5,"type" : "COUNT","position" : 3},{"token" : "年半","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 4},{"token" : "nianban","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 4},{"token" : "nb","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 4}]
}

3.7.2 插入文档测试

测试数据如下(狮子和虱子的拼音是一样的

POST /test/_doc/1
{"id": 1,"name": "狮子"
}
POST /test/_doc/2
{"id": 2,"name": "虱子"
}

我们先通过拼音 shizi 来搜索

GET /test/_search
{"query": {"match": {"name": "shizi"}}
}

成功搜索出狮子和虱子

在这里插入图片描述

但如果我们搜索的内容是掉入狮子笼怎么办呢

GET /test/_search
{"query": {"match": {"name": "掉入狮子笼怎么办"}}
}

在这里插入图片描述

从搜索结果中我们可以发现,我们明明搜索的是狮子,怎么虱子也搜索出来了?

这说明我们自定义的分词器有问题,在用拼音搜索时确实没问题,但是在用中文搜索时却搜出了同音词

3.8 使用自定义分词器要注意的事项

拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用


创建倒排索引时

在这里插入图片描述

在这里插入图片描述

用户搜索狮子,搜索结果中居然出现了虱子


所以,我们在创建倒排索引时使用的分词器要和搜索时使用的分词器分开

怎么分开呢,在创建倒排索引时使用 my_analyzer 分词器,搜索时使用 ik_smart 分词器

在这里插入图片描述

PUT /test
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart"}}}
}

我们删除 test 索引库之后,重写创建 test 索引库进行测试

DELETE /test
GET /test/_search
{"query": {"match": {"name": "掉入狮子笼怎么办"}}
}

测试结果如下(可以看到,搜索结果中没有虱子了)

在这里插入图片描述

4. DSL实现自动补全查询

ElasticSearch 提供了 Completion suggester 查询来实现自动补全功能,这个查询会匹配以用户输入内容开头的词条并
返回

4.1 字段的类型的约束

为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  1. 参与补全查询的字段必须是 completion 类型
  2. 字段的内容一般是用来补全的多个词条形成的数组

在这里插入图片描述

4.2 查询语法

在这里插入图片描述

索引库

PUT test2
{"mappings": {"properties": {"title":{"type": "completion"}}}
}

测试数据

POST test2/_doc
{"title": ["Sony", "WH-1000XM3"]
}POST test2/_doc
{"title": ["SK-II", "PITERA"]
}POST test2/_doc
{"title": ["Nintendo", "switch"]
}

执行查询操作

POST /test2/_search
{"suggest": {"title_suggest": {"text": "s","completion": {"field": "title","skip_duplicates": true,"size": 10}}}
}

查询结果(查询结果中包含了文档的原始信息)

在这里插入图片描述

5. 自动补全案例

我们来做一个关于酒店数据的自动补全案例

5.1 准备工作

5.1.1 创建hotel索引库

PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_anlyzer": {"tokenizer": "ik_max_word","filter": "py"},"completion_analyzer": {"tokenizer": "keyword","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id": {"type": "keyword"},"name": {"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart","copy_to": "all"},"address": {"type": "keyword","index": false},"price": {"type": "integer"},"score": {"type": "integer"},"brand": {"type": "keyword","copy_to": "all"},"city": {"type": "keyword"},"starName": {"type": "keyword"},"business": {"type": "keyword","copy_to": "all"},"location": {"type": "geo_point"},"pic": {"type": "keyword","index": false},"all": {"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart"},"suggestion": {"type": "completion","analyzer": "completion_analyzer","search_analyzer": "ik_smart"}}}
}

5.1.2 导入测试工程

测试工程的 Gitee 地址:hotel-demo

5.1.3 导入酒店数据到数据库中

SQL 脚本在测试工程的 doc 目录下

在这里插入图片描述

5.1.4 将数据库中的数据导入到ElasticSearch

导入数据前,更改与连接 ElasticSearch 相关的信息(如果 ElasticSearch 没有设置密码,可以去除 setHttpClientConfigCallback 代码)

在这里插入图片描述

运行 HotelDocumentTest 测试类中的 testBulkRequest 方法,将数据库中的数据导入到 ElasticSearch


在 Kibana 提供的控制台检查数据是否导入成功

GET /hotel/_search
{"query": {"match_all": {}}
}

在这里插入图片描述

5.2 测试自动补全功能

在 Kibana 提供的控制台测试自动补全功能

GET /hotel/_search
{"suggest": {"suggestions": {"text": "s","completion": {"field": "suggestion","skip_duplicates": true,"size": 10}}}
}

测试结果

在这里插入图片描述

6. RestAPI实现自动补全查询

构建请求参数的 API

在这里插入图片描述

结果解析

在这里插入图片描述

import cn.itcast.hotel.service.IHotelService;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;@SpringBootTest
class HotelSuggestionTest {private RestHighLevelClient restHighLevelClient;@Autowiredprivate IHotelService hotelService;@Testvoid testSuggestion() throws IOException {// 1.准备SearchRequestSearchRequest searchRequest = new SearchRequest("hotel");// 2.准备DSLsearchRequest.source().suggest(new SuggestBuilder().addSuggestion("suggestions",SuggestBuilders.completionSuggestion("suggestion").prefix("h").skipDuplicates(true).size(10)));// 3.发送请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 4.解析结果// 4.1.获取suggest对象Suggest suggest = searchResponse.getSuggest();// 4.2.根据名称获取suggestion对象CompletionSuggestion suggestion = suggest.getSuggestion("suggestions");// 4.3.获取optionsList<CompletionSuggestion.Entry.Option> options = suggestion.getOptions();// 4.4.遍历for (CompletionSuggestion.Entry.Option option : options) {System.out.println("option.getText().string() = " + option.getText().string());}}@BeforeEachvoid setUp() {// 用户名和密码String username = "elastic";String password = "tF8RGg2vd0FAzgkK";final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));restHighLevelClient = new RestHighLevelClient(restClientBuilder);}@AfterEachvoid tearDown() throws IOException {restHighLevelClient.close();}}

7. 综合案例:实现搜索框自动补全

测试工程已实现搜索框自动补全,启动测试工程后,在浏览器中查看搜索框的自动补全效果

http://localhost:8089/

在这里插入图片描述


前端源代码的 Gitee 地址:auto-complete

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

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

相关文章

Windows环境 (Ubuntu 24.04.1 LTS ) 国内镜像,用apt-get命令安装RabbitMQ,java代码样例

一、环境 Windows11 WSL(Ubuntu 24.04.1) 二、思路 1 用Windows中的Ubuntu安装RabbitMQ&#xff0c;贴近Linux的线上环境&#xff1b; 2 RabbitMQ用erlang语言编写的&#xff0c;先安装erlang的运行环境&#xff1b; 2 用Linux的apt-get命令安装&#xff0c;解决软件依赖…

医学预测模型的网页应用必要模块设计(重制版)

医学预测模型的网页应用必要模块设计&#xff08;重制版&#xff09; 刘岳鹏 摘要&#xff1a; 网页应用&#xff08;Web APP&#xff09;承载医学临床预测模型并在临床实践中实现与用户的互动&#xff0c;必要的功能模块设计将有助于Web APP更好地在临床实践中发挥其功能。在此…

【他山之石】Leading-Trim: The Future of Digital Typesetting:数字排版的未来 —— Leading-Trim

文章目录 【他山之石】Leading-Trim: The Future of Digital Typesetting&#xff1a;数字排版的未来 —— Leading-TrimHow an emerging CSS standard can fix old problems and raise the bar for web apps1. The problem with text boxes today2. How we got here: a histor…

【k8s集群应用】Kubernetes 容器编排系统

文章目录 Kubernetes 容器编排系统背景与发展Kubernetes 基本概念Kubernetes 集群架构与组件Kubernetes 核心组件Master 组件配置存储中心Node 组件 Kubernetes核心概念1. Pod2. Pod控制器3. Label与Label选择器4. Service5. Ingress6. Volume7. Name与Namespace K8S创建Pod资源…

梳理你的思路(从OOP到架构设计)_简介EIT造形

目录 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码结构 <基类/子类>代码结构的变形 2、 从<基类/子类>结构到EIT造形 3、 EIT造形的基本形与变形 1、 复习<基类 /子类>的扩充(extends)结构 典型的<基类/子类>代码…

Rust vs C: PNG解码器性能之争的启示

在系统编程领域,C语言一直是性能标杆。但最近一个现象引发了广泛讨论:用 Rust 实现的 PNG 解码器性能竟然超越了 C 语言版本。这个看似反直觉的结果背后,折射出现代编程语言发展的新趋势。 让我们深入解析这个有趣的技术现象。PNG解码本质上是把压缩的图像数据还原成像素数据的…

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

MyBatis-Plus 实用工具:SqlHelper

SqlHelper 是MyBatis-Plus的一款SQL 辅助工具类&#xff0c;提供了一些常用的方法&#xff0c;简便我们的操作&#xff0c;提高开发效率。文档 最常用的是SqlHelper.table(Obj.class) 返回的 TableInfo 对象通常包含以下常用方法&#xff1a; 1. getTableName() 获取表名。示例…

游戏无界,RayLink远程控制电脑打造极致游戏体验

在数字化浪潮席卷全球的今天&#xff0c;电子游戏已经成为我们日常生活中不可或缺的娱乐方式。“游戏无界限”的理念正在逐步改变着玩家们的游戏体验。远程操控电脑技术的兴起&#xff0c;仿佛为游戏世界打开了一扇新的大门&#xff0c;打破了时间和空间的限制&#xff0c;让玩…

【LeetCode】2406、将区间分为最少组数

【LeetCode】2406、将区间分为最少组数 文章目录 一、数据结构-堆、贪心1.1 数据结构-堆、贪心1.2 多语言解法 二、扫描线2.1 扫描线 一、数据结构-堆、贪心 1.1 数据结构-堆、贪心 题目已知一些区间, 需要尽量合并, 使 组 最少. 可以用图解画一下 因为尽量合并, 为了紧凑, …

彻底理解如何优化接口性能

作为后端研发&#xff0c;必须要掌握怎么优化接口的性能或者说是响应时间&#xff0c;这样才能提高系统的系能&#xff0c;本文通过如下两个方面进行分析&#xff1a; 一.后端代码 有如下几步&#xff1a; 1.缓存机制 这是最场景的方式&#xff0c;当使用了缓存后&#xff0c;…

Java性能调优 - JVM性能监测及调优

JVM 内存模型概述 堆 堆是JVM内存中最大的一块内存空间&#xff0c;该内存被所有线程共享&#xff0c;几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代&#xff0c;新生代又被进一步划分为Eden和Survivor区&#xff0c;最后Survivor由From Survivor和To Su…

【计算机网络】期末考试预习复习|上

作业讲解 物理层作业 共有4个用户进行CDMA通信。这4个用户的码片序列为&#xff1a; A: (–1 –1 –1 1 1 –1 1 1)&#xff1b;B: (–1 –1 1 –1 1 1 1 –1) C: (–1 1 –1 1 1 1 –1 –1)&#xff1b;D: (–1 1 –1 –1 –1 –1 1 –1) 现收到码片序列&#xff1a;(–1 1 –…

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…

SpringBoot2+Vue2开发工作管理系统

项目介绍 在工作中使用的管理系统&#xff0c;可以随手记录一些笔记、可以汇总一些常用网站的链接、可以管理自己负责的项目、可以记录每日日报和查看历史日报、可以记录加班情况、可以记录报销内容、可以编写文章文档。 系统功能 我的笔记快捷入口项目管理今日日报我的日报…

C语言实现八大排序算法

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题&#xff1a; 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…

SpringCloudAlibaba | Sentinel从基础到进阶

一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件&#xff0c;主要用于解决微服务架构中的高可用性和稳定性问题&#xff08;雪崩问题&#xff09;。 常见的使用场景有&#xff1a; 流量控制舱壁模式&#xff08;线程隔离&#xff09;超时处理熔断降级 二、流量控…

51c嵌入式~单片机~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的…

Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务

解释 在spingboot 集成es客户端后&#xff0c;每当服务启动时&#xff0c;服务默认都会查看es中是否已经创建了对应的索引&#xff0c;如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…

Linux在Ubuntu系统下安装MySQL数据库(全网最详细)

1.在ubuntu下安装MySQL数据库 第一步要先&#xff1a;切换到root用户 以我自己的为例&#xff08;自行输入密码&#xff09; ljwVM-16-16-ubuntu:~$ su - 1.1 查看操作系统版本 rootVM-16-16-ubuntu:~# lsb_release -a 1.2 添加MySQL APT源 1.2.1 访问下载⻚⾯并下载发布包…