Elasticsearch(ES)概述

文章目录

  • 一.什么是Elasticsearch?
    • 1.正向索引和倒排索引
    • 2.Mysql和ES的概念对比
    • 3.安装elasticsearch、kibana
  • 二.IK分词器
  • 三.索引库操作
  • 四.文档操作
  • 五.RestClient操作索引库
    • 1.初始化RestClient
    • 2.创建索引库
    • 3.删除索引库
    • 4.判断索引库是否存在
  • 六.RestClient操作文档
    • 1.新增文档
    • 2.查询数据
    • 3.修改数据
    • 4.删除数据
    • 5.批量插入数据
  • 七.DSL查询文档
  • 八.RestClient检索查询文档


一.什么是Elasticsearch?

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。

Elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。

Elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。

Elasticsearch是elastic stack的核心(不可替换),负责存储、搜索、分析数据。

在这里插入图片描述


1.正向索引和倒排索引

文档(document):每条数据就是一个文档

词条(term):文档按照语义分成的词语


正向索引(Forward Index):
定义: 正向索引是根据文档-词项对的方式建立的索引。每个文档都有一个记录,其中包含了文档中的所有词项及其位置信息。

例如Mysql就是使用的正向索引,根据id检索一个文档非常快,但是根据文档中某个字段检索文档只能逐条检索


倒排索引(Inverted Index):
定义: 倒排索引是根据词项-文档对的方式建立的索引。每个词项都有一个记录,其中包含了包含该词项的所有文档及其位置信息。即对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档

Elasticsearch就使用了倒排索引,将文档按照语义分成词条,根据词条建立词条表,这样就形成了词条-文档的结构,导致检索字段时非常快

倒排索引中包含两部分内容:

  • 词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率

  • 倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息

    • 文档id:用于快速获取文档

    • 词条频率(TF):文档在词条出现的次数,用于评分

在这里插入图片描述

文档:

elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。
文档数据会被序列化为json格式后存储在elasticsearch中。

索引:

相同类型的文档的集合

映射

索引中文档的字段约束信息,类似表的结构约束

在这里插入图片描述


2.Mysql和ES的概念对比

在这里插入图片描述

Mysql:擅长事务类型(ACID特性)操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

总而言之:

  • 正向索引适合于文档级别的查询,因为它直接提供了文档中的词项信息。

  • 倒排索引适合于词项级别的查询,因为它直接提供了包含某个词项的文档信息。

3.安装elasticsearch、kibana

通过Dokcer拉取镜像安装即可

二.IK分词器

ES在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。故需要更好的分词策略:IK分词器

安装(安装到es-plugins/_data即可):IK分词器官方地址,重启es后IK分词器生效

ik分词器包含两种模式:

  • ik_smart:最少切分,粗粒度
  • ik_max_word:最细切分,细粒度

IK分词器-拓展词库

IK分词器虽然说按照字典查找词语进行组合,但是随着网络文化发展和新词的逐渐产生,IK分词器不可能马上更新这些词汇,这时候就需要进行拓展词汇库和增加禁用词汇

要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:
在这里插入图片描述

在ext.dic文件中添加拓展词汇

在这里插入图片描述

在stopword.dic文件下添加禁用词汇

在这里插入图片描述

三.索引库操作

mapping属性

mapping是对索引库中文档的约束,常见的mapping属性包括:

  • type:字段数据类型,常见的简单类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

    • 数值:long、integer、short、byte、double、float

    • 布尔:boolean

    • 日期:date

    • 对象:object

  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段


创建索引库

PUT /索引库名称
{"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}

查看索引库语法:

GET /索引库名 

删除索引库的语法:

DELETE /索引库名 

修改索引库

索引库和mapping一旦创建无法修改,但是可以添加新的字段,语法如下:

PUT /索引库名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}

四.文档操作

添加文档

POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2","字段3": {"子属性1": "值3","子属性2": "值4"},// ...
}

查看文档语法:

GET /索引库名/_doc/文档id 

删除文档:

DELETE /索引库名/_doc/文档id 

修改文档

方式一:全量修改,会删除旧文档,添加新文档

PUT /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 略
}

方式二:增量修改,修改指定字段值

POST /索引库名/_update/文档id
{"doc": {"字段名": "新的值",}
}

文档操作-动态映射

当我们向ES中插入文档时,如果文档中字段没有对应的mapping,ES会帮助我们字段设置mapping,规则如下:

在这里插入图片描述

五.RestClient操作索引库

什么是RestClient
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。

使用:

1.初始化RestClient

1.引入es的RestHighLevelClient依赖:

		<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>

2.可以发现客户端的版本号,引入的依赖版本必须和客户端一致(不一致则需修改)

在这里插入图片描述

修改版本号

	<properties><java.version>1.8</java.version><elasticsearch.version>客户端版本号</elasticsearch.version></properties>

3.初始化RestHighLevelClient:

	private RestHighLevelClient client;//测试类中使用@BeforeEach注解来标记一个方法,该方法将在每个测试方法执行之前执行(@AfterEach同理)@BeforeEachvoid setUp(){this.client=new RestHighLevelClient(RestClient.builder(HttpHost.create("自己的Linux局域网ip地址:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}

2.创建索引库

	@Testvoid testCreateHotelIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("索引库名");request.source("DSL语句", XContentType.JSON);client.indices().create(request, RequestOptions.DEFAULT);}

其中:indices()包含了所有操作索引库的API

3.删除索引库

	@Testvoid testDeleteHotelIndex() throws IOException {   // 1.创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("索引库名");// 2.发起请求client.indices().delete(request, RequestOptions.DEFAULT);
}

4.判断索引库是否存在

	@Testvoid testExistsHotelIndex() throws IOException {    // 1.创建Request对象    GetIndexRequest request = new GetIndexRequest("索引库名");    // 2.发起请求     boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);    // 3.输出    System.out.println(exists);
}

六.RestClient操作文档

1.新增文档

IndexRequest request = new IndexRequest("索引库名").id(设置id);request.source(JSON文档, XContentType.JSON);client.index(request, RequestOptions.DEFAULT);

2.查询数据

GetRequest request = new GetRequest(索引库名, id);    GetResponse response = client.get(request, RequestOptions.DEFAULT);   String json = response.getSourceAsString();

3.修改数据

UpdateRequest request = new UpdateRequest(索引库名,id);request.doc("键1","值1","键2","值2"...);client.update(request, RequestOptions.DEFAULT);

4.删除数据

DeleteRequest request = new DeleteRequest(索引库名,id);client.delete(request, RequestOptions.DEFAULT);

5.批量插入数据

request.add(new IndexRequest(索引库名).id(id1).source(JSON文档1, XContentType.JSON));
request.add(new IndexRequest(索引库名).id(id2).source(JSON文档2, XContentType.JSON));
request.add(new IndexRequest(索引库名).id(id3).source(JSON文档3, XContentType.JSON));
//request可以添加多个IndexRequest
client.bulk(request, RequestOptions.DEFAULT);

七.DSL查询文档

DSL Query的分类

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:

  • 查询所有:查询出所有数据,一般测试用。例如:match_all
  • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
    • match_query
    • multi_match_query
  • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
    • ids
    • range
    • term
  • 地理(geo)查询:根据经纬度查询。例如:
    • geo_distance
    • geo_bounding_box
  • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
    • bool
    • function_score

查询的基本语法如下:

GET /indexName/_search
{"query": {"查询类型": {"查询条件": "条件值"}}
}

全文检索查询

match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:

GET /indexName/_search
{"query": {"match": {"FIELD": "TEXT"}}
}

multi_match:与match查询类似,只不过允许同时查询多个字段,语法:

GET /indexName/_search
{"query": {"multi_match": {"query": "TEXT","fields": ["FIELD1", " FIELD12"]}}
}

需要注意的是:根据多个字段查询,参与查询字段越多,查询性能越差,建议使用多个字段拷贝到一个字段进行多字段的查询

精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

  • term:根据词条精确值查询
  • range:根据的范围查询

term查询:

// term查询
GET /indexName/_search
{"query": {"term": {"FIELD": {"value": "VALUE"}}}
}

range查询:

// range查询
GET /indexName/_search
{"query": {"range": {"FIELD": {"gte": 10,"lte": 20}}}
}

地理查询

geo_bounding_box(不常用):查询geo_point值落在某个矩形范围的所有文档

// geo_bounding_box查询
GET /indexName/_search
{"query": {"geo_bounding_box": {"FIELD": {"top_left": {"lat": 31.1,"lon": 121.5},"bottom_right": {"lat": 30.9,"lon": 121.7}}}}
}

geo_distance(常用):查询到指定中心点小于某个距离值的所有文档

// geo_distance 查询
GET /indexName/_search
{"query": {"geo_distance": {"distance": "15km","FIELD": "31.21,121.5"}}
}

复合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:

fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价

当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。

常见的三个算分函数:

在这里插入图片描述

TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大

BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平

Function Score Query

使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。

在这里插入图片描述
function score query定义的三要素:

  • 过滤条件:哪些文档要加分
  • 算分函数:如何计算function score
  • 加权方式:function score 与 query score如何运算

复合查询 Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

  • must:必须匹配每个子查询,类似“与”
  • should:选择性匹配子查询,类似“或”
  • must_not:必须不匹配,不参与算分,类似“非”
  • filter:必须匹配,不参与算分

例子:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。

GET /hotel/_search
{"query": {"bool": {"must": [{"match": {"name": "如家"}}],"must_not": [{"range": { "price": {"gt": 400}}}],"filter": [{"geo_distance": {"distance": "10km", "location": {"lat": 31.21, "lon": 121.5}}}]}}
}

搜索结果处理

1.排序
elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"FIELD": "desc"  // 排序字段和排序方式ASC、DESC}]
}
GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance" : {"FIELD" : "纬度,经度","order" : "asc","unit" : "km"}}]
}

2.分页
elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。

elasticsearch中通过修改from、size参数来控制要返回的分页结果:

GET /hotel/_search
{"query": {"match_all": {}},"from": 990, // 分页开始的位置,默认为0"size": 10, // 期望获取的文档总数"sort": [{"price": "asc"}]
}

深度分页问题(ES设定结果集查询的上限是10000)

针对深度分页,ES提供了两种解决方案:

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
  • scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用。

3.高亮
高亮:就是在搜索结果中把搜索关键字突出显示。

原理是这样的:

将搜索结果中的关键字用标签标记出来

在页面中给标签添加css样式

语法:

GET /hotel/_search
{"query": {"match": {"FIELD": "TEXT"}},"highlight": {"fields": { "FIELD": {// 指定要高亮的字段"pre_tags": "<em>",  // 用来标记高亮字段的前置标签"post_tags": "</em>" // 用来标记高亮字段的后置标签}}}
}

八.RestClient检索查询文档

需要说明的是,这里的RestClient查询文档不同于上面使用的GetRequest查询,GetRequest查询是简单查询,传入的参数只限制以下几个:

在这里插入图片描述

1.match_all查询

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

	@Test
void testMatchAll() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchAllQuery());SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = response.getHits();long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println("hotelDoc=" + hotelDoc);}}

可以把request.source()理解为查询的整体,在source()下又有sort(),highlighter(),size(),from(),query()等等,这些方法均是已经学习过的DSL查询的query()的平级,即RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,其中包含了查询、排序、分页、高亮等所有功能

RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法

在这里插入图片描述

2.全文检索查询

全文检索的match和multi_match查询与match_all的API基本一致。==差别是查询条件,也就是query的部分。==同样是利用QueryBuilders提供的方法:
在这里插入图片描述

其实就是query里面的参数不同,对应到java代码中就是QueryBuilders调用的API不同而已

// 单字段查询
QueryBuilders.matchQuery("字段", "字符串");
// 多字段查询
QueryBuilders.multiMatchQuery("字符串", "字段1", "字段2");

3.精确查询

精确查询常见的有term查询和range查询

// 词条查询
QueryBuilders.termQuery("字段", "字符串"); 
// 范围查询
QueryBuilders.rangeQuery("字段").gte(xxx).lte(xxx);

4.复合查询-boolean query
精确查询常见的有term查询和range查询,由于在DSL语句中bool包含了多个属性,故需要先创建一个BoolQueryBuilder对象,依次向对象中添加条件属性

// 创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加must条件
boolQuery.must(QueryBuilders.termQuery("字段", "字符串")); 
// 添加filter条件
boolQuery.filter(QueryBuilders.rangeQuery("字段").lte(xxx));
//添加must_not条件
boolQuery.mustNot((QueryBuilders.xxx);

5.排序和分页
搜索结果的排序和分页是与query同级的参数,故改变source()调用的API即可

request.source().from(起始页码).size(每页显示条数);request.source().sort("字段", SortOrder.ASC);//升序

6.高亮

request.source().highlighter(new HighlightBuilder()        .field("字段")        // 是否需要与查询字段匹配        .requireFieldMatch(false)//不填写pre_tags和post_tags属性默认为<em>标签
);

高亮的结果处理(其实就是获取每一个hit里面的highlight值,就可以取出高亮字段中的值了):
在这里插入图片描述

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

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

相关文章

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为&#xff1a;8 个 node 节点&#xff0c;16 核 32G&#xff0c;索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高&#xff0c;search 没有慢查询的状态。 2、集群压测性能不能上去&#xff0c;cpu 使用未打…

Nat. Rev. Chem. | 一份关于用机器学习研究化学问题的评估指导

今天为大家介绍的是来自Tiago Rodrigues团队的一篇论文。机器学习&#xff08;ML&#xff09;有望解决化学领域的重大挑战。尽管ML工作流程的适用性极广&#xff0c;但人们通常发现评估研究设计多种多样。目前评估技术和指标的异质性导致难以&#xff08;或不可能&#xff09;比…

java设计模式学习之【单例模式】

文章目录 引言单例模式简介定义与用途实现方式&#xff1a;饿汉式懒汉式 UML 使用场景优势与劣势单例模式在spring中的应用饿汉式实现懒汉式实现数据库连接示例代码地址 引言 单例模式是一种常用的设计模式&#xff0c;用于确保在一个程序中一个类只有一个实例&#xff0c;并且…

计算机组成学习-数据的表示和运算总结

1、进制与编码 1.1 进位计数法 常用的进位计数法有十进制、二进制、八进制、十六进制等。十六进制每个 数位可取0〜9、A、B、C、D、E、F中的任意一个&#xff0c;其中A、B、C、D、E、F分别表示 10〜15。 八进制数字通常以前缀 "0"&#xff08;零&#xff09;加上数…

Ubuntu 2204 安装libimobiledevice

libimobiledevice是一个开源的软件&#xff0c;它可以直接使用系统原生协议和IOS设备进行通信&#xff0c;类似iMazing&#xff0c;iTunes&#xff0c;libimobiledevice不依赖IOS的私有库&#xff0c;并且连接IOS设备时用的都是原生协议&#xff0c;IOS无需越狱就能实现设备信息…

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器&#xff0c;然后再读取出来&#xff1a;

Echarts 设备状态 甘特图

在做工厂智能化生产看板时&#xff0c;绝对会有设备状态看板&#xff0c;展示设备当天或者当前状态&#xff0c;设备状态数据一般是有mes 系统设备管理模块对设备信息进行采集&#xff0c;一般包括过站数据&#xff0c;设备当前状态&#xff0c;是否在线是否故障、检修、待生产…

Linux CentOS7 联网配置 | 安装中文输入法

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络&#xff1a;解决上网问题 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd …

css如何设置文本添加下划线

css文本添加下划线 text-decoration: underline;text-decoration相关属性参数 参数描述none默认。定义标准的文本。underline定义文本下的一条线。overline定义文本上的一条线。line-through定义穿过文本下的一条线。blink定义闪烁的文本。inherit规定应该从父元素继承 text-…

blue beacon rssi 指纹室内定位数据集

数据集是开展实验的基础&#xff0c;搜集并分享。如果你有关于室内定位的问题&#xff0c;请联系博主。 namedatesetpapercommentBLEBeacon: A Real-Subject Trial Dataset from Mobile Bluetooth Low Energy Beaconshttps://github.com/dimisik/BLEBeacon-Datasethttps://arxi…

matlab基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪

1、内容简介 略 可以交流、咨询、答疑 2、内容说明 基于线性二次调节器(LQR)法实现机器人路径规划可变轨迹跟踪 3、仿真分析 略 load path.mat %% 轨迹处理 % 定义参考轨迹 refPos_x path(:,1); refPos_y path(:,2); refPos [refPos_x, refPos_y];% 计算航向角和曲率 …

Elasticsearch:ES|QL 函数及操作符

如果你对 ES|QL 还不是很熟悉的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;ES|QL 查询语言简介​​​​​​​”。ES|QL 提供了一整套用于处理数据的函数和运算符。 功能分为以下几类&#xff1a; 目录 ES|QL 聚合函数 AVG COUNT COUNT_DISTINCT 计数为近…

G1264 0.85 V 启动,12uA,同步 DC/DC 变换器

G1264 0.85 V 启动&#xff0c;12uA&#xff0c;同步 DC/DC 变换器 概述&#xff1a; G1264集成 PFM 模式同步升压变换器&#xff0c;只需要一个电感和两个电容。由于升压专有设计&#xff0c;它启动在非常低的输入电压下降到850毫伏&#xff0c;使其成为单电池碱性/镍氢电池操…

Flink Flink中的合流

一、Flink中的基本合流操作 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍&#xff0c;对应的 API 也更加丰富。 二、联合&#xff08;Union&#xff09; 最简单的合流操作&#xf…

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

io基础入门

压缩的封装 参考&#xff1a;https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…

6 新建工程——寄存器

文章目录 6.1 本地新建工程文件夹6.2 新建工程6.2.1 选择CPU型号6.2.2 在线添加库文件6.2.3 添加文件6.2.4 复制存储器分配文件6.2.5 配置选项卡6.2.5.1 Linker6.2.5.2 Target6.2.5.3 Output 选项卡6.2.5.4 Listing 选项卡6.2.6 下载器配置 版本说明&#xff1a;MDK5.24 6.1 本…

数据结构(三)——算法和算法分析

&#x1f600;前言 数据结构和算法是计算机科学领域中至关重要的概念。它们为解决实际问题提供了有效的方法和步骤。算法作为解决问题的方法和步骤&#xff0c;在计算机中以指令的有限序列的形式表达。本文将介绍算法的定义、描述和程序设计等方面的内容&#xff0c;帮助您深入…

【Redisson】基于自定义注解的Redisson分布式锁实现

前言 在项目中&#xff0c;经常需要使用Redisson分布式锁来保证并发操作的安全性。在未引入基于注解的分布式锁之前&#xff0c;我们需要手动编写获取锁、判断锁、释放锁的逻辑&#xff0c;导致代码重复且冗长。为了简化这一过程&#xff0c;我们引入了基于注解的分布式锁&…

目标检测——Faster R-CNN算法解读

论文&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 链接&#xff1a;https://arxiv.org/abs/1506.01497 代码&#xff1a;https://github.com/rbgirsh…