ElasticSearch快速开始

目录

全文检索

全文检索的原理

什么是倒排索引

ElasticSearch介绍

ElasticSearch应用场景

ElasticSearch下载安装(windows)

客户端Kibana安装

Elasticsearch安装分词插件

ElasticSearch快速开始

ElasticSearch索引操作

创建索引

查询索引

删除索引

设置Settings

设置文档映射Mapping

动态映射

静态映射

使用ReIndex重建索引

ElasticSearch文档操作


全文检索

       全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子邮件客户端、新闻聚合网站等。它可以帮助用户快速定位所需信息,提高检索效率和准确性。

查询:有明确的搜索条件边界。比如,年龄 15~25 岁,颜色 = 红色,价格 < 3000,这里的 15、25、红色、3000 都是条件边界。即有明确的范围界定。

检索:即全文检索,无搜索条件边界,召回结果取决于相关性,其相关性计算无明确边界性条件,如同义词、谐音、别名、错别字、混淆词、网络热梗等均可成为其相关性判断依据。


全文检索的原理

       在全文检索中,首先需要对文本数据进行处理,包括分词、去除停用词等。然后,对处理后的文本数据建立索引,索引会记录每个单词在文档中的位置信息以及其他相关的元数据,如词频、权重等。这个过程通常使用倒排索引(inverted index)来实现,倒排索引将单词映射到包含该单词的文档列表中,以便快速定位相关文档。

       当用户发起搜索请求时,搜索引擎会根据用户提供的关键词或短语,在建立好的索引中查找匹配的文档。搜索引擎会根据索引中的信息计算文档的相关性,并按照相关性排序返回搜索结果。用户可以通过不同的搜索策略和过滤条件来精确控制搜索结果的质量和范围。


什么是倒排索引

       正排索引(Forward Index)和倒排索引(Inverted Index)是全文检索中常用的两种索引结构,它们在索引和搜索的过程中扮演不同的角色。

正排索引(正向索引)

正排索引是将文档按顺序排列并进行编号的索引结构。每个文档都包含了完整的文本内容,以及其他相关的属性或元数据,如标题、作者、发布日期等。在正排索引中,可以根据文档编号或其他属性快速定位和访问文档的内容。正排索引适合用于需要对文档进行整体检索和展示的场景,但对于包含大量文本内容的数据集来说,正排索引的存储和查询效率可能会受到限制。

在MySQL 中通过 ID 查找就是一种正排索引的应用。

倒排索引(反向索引)

       倒排索引是根据单词或短语建立的索引结构。它将每个单词映射到包含该单词的文档列表中。倒排索引的建立过程是先对文档进行分词处理,然后记录每个单词在哪些文档中出现,以及出现的位置信息。通过倒排索引,可以根据关键词或短语快速找到包含这些词语的文档,并确定它们的相关性。倒排索引适用于在大规模文本数据中进行关键词搜索和相关性排序的场景,它能够快速定位文档,提高搜索效率。

      我们在创建文章的时候,建立一个关键词与文章的对应关系表,就可以称之为倒排索引。如下图所示:

                      


ElasticSearch介绍

        ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。

Elasticsearch 的特点和优势:

1. 分布式架构:Elasticsearch 是一个分布式系统,可以轻松地水平扩展,处理大规模的数据集和高并发的查询请求。

2. 全文检索功能:Elasticsearch 提供了强大的全文检索功能,包括分词、词项查询、模糊匹配、多字段搜索等,并支持丰富的查询语法和过滤器。

3. 多语言支持:Elasticsearch 支持多种语言的分词器和语言处理器,可以很好地处理不同语言的文本数据。

4. 高性能:Elasticsearch 使用倒排索引和缓存等技术,具有快速的搜索速度和高效的查询性能。

5. 实时性:Elasticsearch 支持实时索引和搜索,可以几乎实时地将文档添加到索引中,并立即可见。

6. 易用性:Elasticsearch 提供了简单易用的 RESTful API,方便进行索引管理、查询操作和数据分析。


ElasticSearch应用场景

       只要用到搜索的场景,ES几乎都可以是最好的选择。国内现在有大量的公司都在使用 Elasticsearch,包括携程、滴滴、今日头条、饿了么、360安全、小米、vivo等诸多知名公司。除了搜索之外,结合Kibana、Logstash、Beats,Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。


ElasticSearch下载安装(windows)

下载地址: https://www.elastic.co/cn/downloads/past-releases#elasticsearch

选择版本:7.17.3

 ElasticSearch文件目录结构

设置ES_JAVA_HOME和ES_HOME的环境变量

启动ElasticSearch服务

进入bin目录,直接运行elasticsearch.bat

浏览器中访问:http://localhost:9200/


客户端Kibana安装

Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。

下载并解压缩Kibana

下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana

选择版本:7.17.3

修改Kibana.yml,路径config/kibana.yml

server.port: 5601   #指定Kibana服务器监听的端口号
server.host: "localhost"  #指定Kibana服务器绑定的主机地址
elasticsearch.hosts: ["http://localhost:9200"]  #指定Kibana连接到的Elasticsearch实例的访问地址
i18n.locale: "zh-CN"   #将 Kibana 的界面语言设置为简体中文

运行Kibana:直接执行kibana.bat

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

cat API

       cat API 是 Elasticsearch 提供的一个用于查看和显示集群信息的 RESTful API。它可以用于获取关于索引、节点、分片、健康状态等各种集群相关的信息。

/_cat/allocation         #查看单节点的shard分配整体情况
/_cat/shards          #查看各shard的详细情况
/_cat/shards/{index}     #查看指定分片的详细情况
/_cat/master          #查看master节点信息
/_cat/nodes           #查看所有节点信息
/_cat/indices         #查看集群中所有index的详细信息
/_cat/indices/{index}      #查看集群中指定index的详细信息
/_cat/segments        #查看各index的segment详细信息,包括segment名, 所属shard, 内存(磁盘)占用大小, 是否刷盘
/_cat/segments/{index}#查看指定index的segment详细信息
/_cat/count           #查看当前集群的doc数量
/_cat/count/{index}   #查看指定索引的doc数量
/_cat/recovery        #查看集群内每个shard的recovery过程.调整replica。
/_cat/recovery/{index}#查看指定索引shard的recovery过程
/_cat/health          #查看集群当前状态:红、黄、绿
/_cat/pending_tasks   #查看当前集群的pending task
/_cat/aliases         #查看集群中所有alias信息,路由配置等
/_cat/aliases/{alias} #查看指定索引的alias信息
/_cat/thread_pool     #查看集群各节点内部不同类型的threadpool的统计信息,
/_cat/plugins         #查看集群各个节点上的plugin信息
/_cat/fielddata       #查看当前集群各个节点的fielddata内存使用情况
/_cat/fielddata/{fields}     #查看指定field的内存使用情况,里面传field属性对应的值
/_cat/nodeattrs              #查看单节点的自定义属性
/_cat/repositories           #输出集群中注册快照存储库
/_cat/templates              #输出当前正在存在的模板信息

Elasticsearch安装分词插件

http://127.0.0.1:5601/app/dev_tools#/console在线安装analysis-icu分词插件

#查看已安装插件
bin/elasticsearch-plugin list
#安装插件
bin/elasticsearch-plugin install analysis-icu
#删除插件
bin/elasticsearch-plugin remove analysis-icu

注意:安装和删除完插件后,需要重启ES服务才能生效。

测试分词效果

# _analyzer API可以用来查看指定分词器的分词结果
POST _analyze
{"analyzer":"icu_analyzer","text":"中华人民共和国"
}

        

#ES的默认分词设置是standard,会单字拆分
POST _analyze
{"analyzer":"standard","text":"中华人民共和国"
}#ik_smart:会做最粗粒度的拆
POST _analyze
{"analyzer": "ik_smart","text": "中华人民共和国"}#ik_max_word:会将文本做最细粒度的拆分
POST _analyze
{"analyzer":"ik_max_word","text":"中华人民共和国"
}

ElasticSearch快速开始

节点:Node

一个节点就是一个Elasticsearch的实例,可以理解为一个 ES 的进程。

注意:一个节点 ≠ 一台服务器

角色:Roles

ES的角色分类:

1. 主节点(active master):一般指活跃的主节点,一个集群中只能有一个,主要作用是对集群的管理。

2. 候选节点(master-eligible):当主节点发生故障时,参与选举,也就是主节点的替代节点。

3. 数据节点(data node):数据节点保存包含已编入索引的文档的分片。数据节点处理数据相关操作,如 CRUD、搜索和聚合。这些操作是 I/O 密集型、内存密集型和 CPU 密集型的。监控这些资源并在它们过载时添加更多数据节点非常重要。

4. 预处理节点(ingest node):预处理节点有点类似于logstash的消息管道,所以也叫ingest pipeline,常用于一些数据写入之前的预处理操作。

注意:如果 node.roles 为缺省配置,那么当前节点具备所有角色。

索引:Index

在 ES 中,索引在不同的特定条件下可以表示三种不同的意思:

1. 表示源文件数据:当做数据的载体,即类比为数据表,通常称作 index。例如:通常说集群中有 product 索引,即表述当前 ES 的服务中存储了 product 这样一张“表”。

2. 表示索引文件:以加速查询检索为目的而设计和创建的数据文件,通常承载于某些特定的数据结构,如哈希、FST 等。例如:通常所说的正排索引和倒排索引(也叫正向索引和反向索引)。就是当前这个表述,索引文件和源数据是完全独立的,索引文件存在的目的仅仅是为了加快数据的检索,不会对源数据造成任何影响,

3. 表示创建数据的动作:通常说创建或添加一条数据,在 ES 的表述为索引一条数据或索引一条文档,或者 index 一个 doc 进去。此时索引一条文档的含义为向索引中添加数据。

索引的组成部分:

alias:索引别名

settings:索引设置,常见设置如分片和副本的数量等。

mapping:映射,定义了索引中包含哪些字段,以及字段的类型、长度、分词器等。

                       

类型:Type(ES 7.x 之后版本已删除此概念)

ES 8.x不再支持在请求中指定类型。该include_type_name参数被删除。

文档:Document

       文档是ES中的最小数据单元。它是一个具有结构化JSON格式的记录。文档可以被索引并进行搜索、更新和删除操作。

    

文档元数据,所有字段均以下划线开头,为系统字段,用于标注文档的相关信息:

_index:文档所属的索引名。

_type:文档所属的类型名。

_id:文档唯一id。

_source: 文档的原始Json数据。

_version: 文档的版本号,修改删除操作_version都会自增1。

_seq_no: 和_version一样,一旦数据发生更改,数据也一直是累计的。Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。

_primary_term: _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,避免Primary Shard上的写入被覆盖。每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。


ElasticSearch索引操作

创建索引

格式: PUT /索引名称

索引命名规范:

1. 以小写英文字母命名索引

2. 不要使用驼峰命名法则

3. 如过出现多个单词的索引名称,以全小写 + 下划线分隔的方式:如test_index。

ES 索引创建成功之后,以下属性将不可修改:

1. 索引名称

2. 主分片数量

3. 字段类型

#创建索引
PUT /索引名

查询索引

格式: GET /索引名称

#查询索引
GET /test#test是否存在
HEAD /test

删除索引

格式: DELETE /索引名称

DELETE /test

设置Settings

创建索引的时候指定 settings

创建索引时可以设置分片数和副本数。

#创建索引test,指定其主分片数量为 3,每个主分片的副本数量为 2
PUT /test
{"settings" : {"number_of_shards" : 3,"number_of_replicas" : 2}
}

创建索引时可以指定IK分词器作为默认分词器

PUT /test
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}

 

设置文档映射Mapping

ES中Mapping可以分为动态映射和静态映射。

查看完整的索引 mapping
GET /<index_name>/_mappings查看索引中指定字段的 mapping
GET /<index_name>/_mappings/field/<field_name>

mapping的使用禁忌:

ES 没有隐式类型转换

ES 不支持类型修改

生产环境尽可能的避免使用动态映射(dynamic mapping)

动态映射

       在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

自动类型推断规则

#创建文档(ES根据数据类型, 会自动创建映射)
PUT /user/_doc/1
{"name":"zhagsan","age":18,"address":"北京"
}#获取文档映射
GET /user/_mapping

静态映射

在索引文档写入之前,人为创建索引并且指定索引中每个字段类型、分词器等参数。

PUT /user
{"settings": {"number_of_shards": "1","number_of_replicas": "1"},"mappings": {"properties": {"name": {"type": "keyword"},"age" : {"type" : "long"},"address" : {"type" : "text"}}}
}

使用ReIndex重建索引

具体方法:

1)如果要推倒现有的映射,你得重新建立一个静态索引。

2)然后把之前索引里的数据导入到新的索引里。

3)删除原创建的索引。

4)为新索引起个别名,为原索引名。

通过这几个步骤可以实现了索引的平滑过渡,并且是零停机。

PUT /user2
{"mappings": {"properties": {"name": {"type": "text"},"address": {"type": "text","analyzer": "ik_max_word"}}}
}
# 2. 把之前索引里的数据导入到新的索引里    
POST _reindex
{
"source": {
"index": "user"
},
"dest": {
"index": "user2"
}
}
# 3. 删除原创建的索引        
DELETE /user
# 4. 为新索引起个别名, 为原索引名
PUT /user2/_alias/userGET /user

ElasticSearch文档操作

索引文档

格式: [PUT | POST] /索引名称/[_doc | _create ]/id

# 创建文档,指定id
# 如果id不存在,创建新的文档,否则先删除现有文档,再创建新的文档,版本会增加
PUT /user/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "北京",
"remark": "java"
}    #创建文档,ES生成id
POST /user/_doc
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "北京",
"remark": "java"
}

       注意:POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新。

简单查询文档

根据id查询文档,格式: GET /索引名称/_doc/id

GET /user/_doc/1

 条件查询 _search,格式: /索引名称/_doc/_search

GET /test/_doc/_search

修改文档

        全量更新,整个json都会替换,格式: [PUT | POST] /索引名称/_doc/id,如果文档存在,现有文档会被删除,新的文档会被索引。

# 全量更新,替换整个json
PUT /user/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25
}#查询文档
GET /user/_doc/1

       使用_update部分更新,格式: POST /索引名称/_update/id,update不会删除原来的文档,而是实现真正的数据更新。

# 部分更新:在原有文档上更新
# Update -文档必须已经存在,更新只会对相应字段做增量修改
POST /user/_update/1
{"doc": {"age": 28}
}#查询文档
GET /user/_doc/1

使用 _update_by_query 更新文档

POST /test/_update_by_query
{"query": { "match": {"_id": 1}},"script": {"source": "ctx._source.age = 30"}
}

并发场景下修改文档

        _seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新:

POST /user/_doc/2?if_seq_no=21&if_primary_term=6
{"name": "李四xxx"
}

删除文档

格式: DELETE /索引名称/_doc/id

DELETE /test/_doc/1

批量写入

批量对文档进行写操作是通过_bulk的API来实现的

{"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
{"field1":"value1", "field2":"value2"}

actionName:表示操作类型,主要有create,index,delete和update

批量创建文档create

POST _bulk
{"create":{"_index":"article", "_type":"_doc", "_id":3}}
{"id":3,"title":"zhangsan","content":"666","tags":["java", "面向对象"]}
{"create":{"_index":"article", "_type":"_doc", "_id":4}}
{"id":4,"title":"lisi","content":"777","tags":["java", "面向对象"]}

如果原文档不存在,则是创建

如果原文档存在,则是替换(全量修改原文档)

批量删除delete

POST _bulk
{"delete":{"_index":"article", "_type":"_doc", "_id":3}}
{"delete":{"_index":"article", "_type":"_doc", "_id":4}}

批量修改update

POST _bulk
{"update":{"_index":"article", "_type":"_doc", "_id":3}}
{"doc":{"title":"888"}}
{"update":{"_index":"article", "_type":"_doc", "_id":4}}
{"doc":{"title":"999"}}

批量读取

        es的批量查询可以使用mget和msearch两种。其中mget是需要我们知道它的id,可以指定不同的index,也可以指定返回值source。msearch可以通过字段查询来进行一个批量的查找。

_mget

#可以通过ID批量获取不同index和type的数据
GET _mget
{
"docs": [
{
"_index": "user",
"_id": 1
},
{
"_index": "test",
"_id": 4
}
]
}#可以通过ID批量获取es_db的数据
GET /user/_mget
{
"docs": [
{
"_id": 1
},
{
"_id": 4
}
]
}
#简化后
GET /user/_mget 
{"ids":["1","2"]  }

_msearch

           在_msearch中,请求格式和bulk类似。查询一条数据需要两个对象,第一个设置index和type,第二个设置查询语句。查询语句和search相同。如果只是查询一个index,我们可以在url中带上index,这样,如果查该index可以直接用空对象表示。

GET /test/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 2}
{"index" : "user"}
{"query" : {"match_all" : {}}}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

模拟串口LV2,解决硬件串口资源不足问题!!!!

模拟串口通信 2.0 版本&#xff01;&#xff01; 我在前面的文章里面有写了 虚拟串口通信&#xff0c;虽然说能用&#xff0c;但是用过的小伙伴都说 “好!” 优缺点: 先说一点&#xff0c;2.0版本并不适用于同硬件串口的所有场合&#xff0c;仅仅针对自己开发的电子垃圾的主…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…

python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

【C语言——打印乘法口诀表】

乘法表&#xff1a; 我们可以定义一个i控制行的变化&#xff0c;外加看上图的表得知我们需要用到循环结构&#xff0c;i是行需要不停的加加&#xff0c;因此&#xff0c;for循环比较好用&#xff0c;可以用两个嵌套的循环&#xff0c;外层循环即用到的i表示的是每一行的打印&am…

阿里云游戏服务器多少钱一年?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

《计算思维导论》笔记:10.4 关系模型-关系运算

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.4 关系模型-关系运算》 一、引言 本章介绍数据库的基本数据模型&#xff1a;关系模型-关系运算。 二、什么是关系运算 在数据库理论中&#xff0c;关系运算&#xff08;Relational Operatio…

PKI - 借助Nginx 实现Https_使用CA签发证书

文章目录 Pre概述操作步骤1. 生成 CA 密钥对2. 生成自签名的 CA 证书3. 生成服务器密钥对和证书签名请求 (CSR)4. 使用 CA 签署服务器证书 Nginx Https 自签证书1. 生成自签名证书和私钥2. 配置 Nginx 使用 CA签发的 HTTPS 证书3. 重启 Nginx 服务4. 直接访问5. 不验证证书直接…

代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)

102.二叉树的层序遍历 题目&#xff1a;给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 接下来我们再来介绍二叉树的另一种遍历方式&#xff1a;层序遍历。 层序遍历一个二叉树。就是…

Centos7之忘记Root用户密码的处理方式

Centos7之忘记Root用户密码的处理方式 文章目录 Centos7之忘记Root用户密码的处理方式1.场景描述2. 重置密码1. 重启系统进入编辑界面2. 按方向键下键↓&#xff0c;找到设置语言的地方3. 进入bash界面后&#xff0c;可以输入passwd命令重新设置root密码 1.场景描述 长时间未使…

前后端分离nodejs+vue流浪狗宠物领养公益网站

1.发现公益&#xff1a;主要是根据社会上的调研&#xff0c;来收集的社会上有关流浪狗的公益活动&#xff0c;发布在公益网站上能被更多人发现&#xff0c;主要让更多人能参与到公益活动中来&#xff0c;并调动群众的同情心和爱心&#xff0c;借此希望在养宠物的主人能避免自己…

vue3 之 商城项目—项目搭建起步

1.创建项目 1️⃣ npm init vuelatest2️⃣ npm install3️⃣ npm run dev4️⃣目录调整 2.git管理项目 基于creact-vue创建出来的项目默认没有初始化git仓库&#xff0c;需要我们手动初始化 执行命令 git init git add. git commit -m init3.项目起步—配置别名路径联…

前端开发_AJAX基本使用

AJAX概念 AJAX是异步的JavaScript和XML(Asynchronous JavaScript And XML)。 简单点说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。 它可以使用JSON&#xff0c;XML&#xff0c;HTML和text文本等格式发送和接收数据。 AJAX最吸引人的就是它的“异步"特性&am…

顶级思维方式——对优秀人才的定义

目录 1、乔布斯对优秀人才的定义 2、 乔布斯对优秀人才的管理 3、感到压力焦虑的时候怎么办 注&#xff1a; 以下内容均来自乔布斯、贝索斯的采访视频摘录 1、乔布斯对优秀人才的定义 乔布斯&#xff1a; 公司规模变大之后&#xff0c;就会变得循规蹈矩。他们觉得只要遵守流…

MySQL数据库-索引概念及其数据结构、覆盖索引与回表查询关联、超大分页解决思路

索引是帮助mysql高效获取数据的数据结构,主要用来提高检索的效率,降低数据库的IO成本(输入输出成本&#xff08;Input-Output Cost&#xff09;),同时通过索引对数据进行排序也能降低数据排序的成本,降低了CPU的消耗。 Mysql的默认存储引擎InnoDB&#xff0c;InnoDB采用的B树的…

肯尼斯·里科《C和指针》第12章 使用结构和指针(2)双链表

12.3 双链表 单链表的替代方案就是双链表。在一个双链表中&#xff0c;每个节点都包含两个指针——指向前一个节点的指针和指向后一个节点的指针。这可以使我们以任何方向遍历双链表&#xff0c;甚至可以随意在双链表中访问。下面的图展示了一个双链表。 下面是节点类型的声明&…

算法刷题:移动零

移动零 .题目链接详解curdesc算法原理 答案 . 题目链接 移动零 详解 题目要求我们要把数组中所有的零都移动到数组的末尾,且要求其余数字顺序不改变.这道题,我们使用到的是双指针算法: 利用两个指针,将数组分为三个部分, 三个区间分别为 [0,desc][desc1,cur-1][cur,n-1] 在…

算法学习——LeetCode力扣二叉树篇1

算法学习——LeetCode力扣二叉树篇1 144. 二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&a…

电子电器架构 —— 区域控制器是未来架构的正解吗?

电子电器架构 —— 区域控制器是未来架构的正解吗? 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶…

C++ //练习 5.5 写一段自己的程序,使用if else语句实现把数字成绩转换成字母成绩的要求。

C Primer&#xff08;第5版&#xff09; 练习 5.5 练习 5.5 写一段自己的程序&#xff0c;使用if else语句实现把数字成绩转换成字母成绩的要求。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***************************…

视觉开发板—K210自学笔记(四)

在点灯之后&#xff0c;我们就需要饿补一下相关的编程基础知识&#xff0c;了解基本语法&#xff0c;加深底蕴才能编写出更好的程序来。由于 MaixPy 是基于 MicroPython 之上进行开发构建的&#xff0c;提供给用户最终的接口是 Micropython &#xff0c;所以在使用 MaixPy 开发…