Elasticsearch 入门

基本概念

The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为 ES,

  • ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。
  • 它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

常规全文搜索性能较差场景

  • 搜索的数据对象是大量的非结构化的文本数据
  • 文件记录量达到数十万或数百万个甚至更多。
  • 支持大量基于交互式文本的查询。
  • 需求非常灵活的全文搜索查询。
  • 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足
  • 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
  • 为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎 。

官方网址

  • 官方网址
  • 官方文档

直接下载,然后解压缩即可,文件目录如下:

目录 含义
bin 可执行脚本目录
config 配置目录
jdk 内置 JDK 目录
lib 类库
logs 日志目录
modules 模块目录
plugins 插件目录
  • 解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。
  • 注意: 9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 http协议 RESTful 端口。
  • 注意 elasticsearch 的文件路径不能有中文,否则会报错!!

Elasticsearch 基本操作

RESTful

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是:

  • 客户端和服务器之间的交互在请求之间是无状态的。
  • 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。
  • 如果服务器在请求之间的任何时间点重启,客户端不会得到通知。
  • 此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在 REST 样式的 Web 服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。

  • 这些方法都是标准方法,包括 HTTP GET、 POST、PUT、 DELETE,还可能包括 HEAD 和 OPTIONS。
  • 简单的理解就是,如果想要访问互联网上的资源,就必须向资源所在的服务器发出请求,请求体中必须包含资源的网络路径, 以及对资源进行的操作(增删改查)。
  • REST 样式的 Web 服务若有返回结果,大多数以JSON字符串形式返回。
  • 可以使用 Postman 进行不同HTTP请求的模拟。可以通过该软件提交表单并且附带任意类型的请求体。

数据格式-倒排索引

  • 正排索引(传统):

    id content
    1001 my name is zhang san
    1002 my name is li si
  • 倒排索引

    keyword id
    name 1001, 1002
    zhang 1001

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。 为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比

HTTP-索引-创建-查询&删除

创建索引

对比关系型数据库,创建索引就等同于创建数据库。
在 Postman 中,向 ES 服务器发 PUT 请求http://127.0.0.1:9200/shopping
请求后,服务器返回响应:

  • 相当于说 PUT 请求用于创建索引

    {"acknowledged": true,//响应结果"shards_acknowledged": true,//分片结果"index": "shopping"//索引名称
    }
    

后台日志:

[2021-04-08T13:57:06,954][INFO ][o.e.c.m.MetadataCreateIndexService] [DESKTOP-LNJQ0VF] [shopping] creating index, cause [api], templates [], shards [1]/[1], mappings []

如果重复发 PUT 请求 : http://127.0.0.1:9200/shopping 添加索引,会返回错误信息 :

{"error": {"root_cause": [{"type": "resource_already_exists_exception","reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists","index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ","index": "shopping"}],"type": "resource_already_exists_exception","reason": "index [shopping/J0WlEhh4R7aDrfIc3AkwWQ] already exists","index_uuid": "J0WlEhh4R7aDrfIc3AkwWQ","index": "shopping"},"status": 400
}

查看全部索引

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/_cat/indices?v

  • 这里请求路径中的_cat 表示查看的意思, indices 表示索引,所以整体含义就是查看当前 ES服务器中的所有索引,就好像 MySQL 中的 show tables的感觉,服务器响应结果如下 :

    health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    yellow open   shopping J0WlEhh4R7aDrfIc3AkwWQ   1   1          0            0       208b           208b
    
    含义
    ealth 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
    tatus 索引打开、关闭状态
    ndex 索引名
    uid 索引统一编号
    ri 主分片数量
    ep 副本数量
    ocs.count 可用文档数量
    ocs.deleted 文档删除状态(逻辑删除)
    tore.size 主分片和副分片整体占空间大小
    ri.store.size 主分片占空间大小

查看单个索引:

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping

    {"shopping": {//索引名"aliases": {},//别名"mappings": {},//映射"settings": {//设置"index": {//设置 - 索引"creation_date": "1617861426847",//设置 - 索引 - 创建时间"number_of_shards": "1",//设置 - 索引 - 主分片数量"number_of_replicas": "1",//设置 - 索引 - 主分片数量"uuid": "J0WlEhh4R7aDrfIc3AkwWQ",//设置 - 索引 - 主分片数量"version": {//设置 - 索引 - 主分片数量"created": "7080099"},"provided_name": "shopping"//设置 - 索引 - 主分片数量}}}
    }
    

删除某个索引

  • 在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping
    返回结果如下:

    {"acknowledged": true
    }
    
  • 再次查看所有索引,GET http://127.0.0.1:9200/_cat/indices?v,返回结果如下:

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
    

    成功删除。

HTTP-文档操作

利用 Put & Post 创建文档

假设索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone,请求体 JSON 内容为:

    {"title":"小米手机","category":"小米","images":"http://www.gulixueyuan.com/xm.jpg","price":3999.00
    }
    

    注意: 此处发送请求的方式必须为 POST,不能是 PUT,否则会发生错误 。
    返回结果:

    {"_index": "shopping", 【索引】"_type": "phone",【文档类型】"_id": "_KEi-XwBo-TVi9pGGySn",【如果没有指定id,会随机产生一个唯一标识】"_version": 1,【版本】"result": "created",【这里的 create 表示创建成功】"_shards": {【分片】"total": 2,【分片总数】"successful": 1,【分片-成功】"failed": 0【分片-失败】},"_seq_no": 3,"_primary_term": 2
    }
    
  • 如果指定利用POST请求时指定标志,http://127.0.0.1:9200/shopping/phone/1
    body为:

    {"title":"小米手机","category":"小米","images":"http://www.gulixueyuan.com/xm.jpg","price":3999.00
    }

    结果如下:

     {"_index": "shopping","_type": "phone","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 4,"_primary_term": 2
    }
    

主键查询 & 全查询

查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询。

主键查询:

  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/phone/1。返回结果如下:

    {"_index": "shopping","_type": "phone","_id": "1","_version": 1,"_seq_no": 4,"_primary_term": 2,"found": true,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}
    }
    
  • 如果查找的id不存在,如http://127.0.0.1:9200/shopping/phone/1001 ,则返回的结果如下:
    {"_index": "shopping","_type": "_doc","_id": "1001","found": false
    }
    

全查询:

  • 查看索引下所有数据,向 ES 服务器发 GET 请求(关键字_search) : http://127.0.0.1:9200/shopping/_search

全量修改 & 局部修改 & 删除

全量修改

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖。 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone/1

请求体JSON内容改为想要修改的内容即可:

{"title":"华为手机","category":"华为","images":"http://www.gulixueyuan.com/hw.jpg","price":1999.00
}

修改成功后,服务器响应结果:

{"_index": "shopping","_type": "_doc","_id": "1","_version": 2,"result": "updated",//<-----------updated 表示数据被更新"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 2,"_primary_term": 1
}

局部修改

修改数据时,使用 _update 修改某一给条数据的局部信息

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/phone/1。请求体的内容不写全即可:

    {"phone": {"title":"小米手机","category":"小米"}
    }
    
  • 返回结果如下:
    {"_index": "shopping","_type": "phone","_id": "1","_version": 3,"result": "updated",//<-----------updated 表示数据被更新"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 3,"_primary_term": 1
    }
  • 在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/phone/1,查看修改内容:
    {"_index": "shopping","_type": "phone","_id": "1","_version": 3,"_seq_no": 3,"_primary_term": 1,"found": true,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/hw.jpg","price": 1999}
    }

文档的删除

传统删除文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。

  • 在 Postman 中,向 ES 服务器发 DELETE 请求 : http://127.0.0.1:9200/shopping/phone/1
  • 结果返回:
    {"_index": "shopping","_type": "_doc","_id": "1","_version": 4,"result": "deleted",//<---删除成功"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 4,"_primary_term": 1
    }
    
  • 在 Postman 中,向 ES 服务器发 GET 请求 : http://127.0.0.1:9200/shopping/phone/1,查看是否删除成功:
    {"_index": "shopping","_type": "_doc","_id": "1","found": false
    }
    

条件删除文档

  • 一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除。注意此时使用的是POST
    命令为 http://127.0.0.1:9200/shopping/_delete_by_query

    {"query":{"match":{"price":4000.00}}
    }
    
  • 结果如下:

条件查询

传统条件查询

条件查询使用 _search?关键词 的筛选方式

  • 不带参数时,即为全查询: 在 Postman 中,向 ES 服务器发 GET请求 :http://127.0.0.1:9200/shopping/_search):

    {"took": 5, 【划分时间,单位毫秒】"timed_out": false,【是否超时】"_shards": {【分片信息】"total": 1,【总数】"successful": 1,【成功】"skipped": 0,【忽略】"failed": 0【失败】},"hits": {"total": {"value": 6,"relation": "eq"},"max_score": 1,"hits": [{"_index": "shopping","_type": "_doc","_id": "ANQqsHgBaKNfVnMbhZYU","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}},{"_index": "shopping","_type": "_doc","_id": "A9R5sHgBaKNfVnMb25Ya","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999}},{"_index": "shopping","_type": "_doc","_id": "BNR5sHgBaKNfVnMb7pal","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999}},{"_index": "shopping","_type": "_doc","_id": "BtR6sHgBaKNfVnMbX5Y5","_score": 1,"_source": {"title": "华为手机","category": "华为","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999}},{"_index": "shopping","_type": "_doc","_id": "B9R6sHgBaKNfVnMbZpZ6","_score": 1,"_source": {"title": "华为手机","category": "华为","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999}},{"_index": "shopping","_type": "_doc","_id": "CdR7sHgBaKNfVnMbsJb9","_score": 1,"_source": {"title": "华为手机","category": "华为","images": "http://www.gulixueyuan.com/xm.jpg","price": 1999}}]}
    }
    
  • URL带参查询:
    查找 category 为小米的文档,在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search?q=category:小米,(其中 q 表示 query 的意思)。返回结果如下:

    {"took": 3,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 5,"relation": "eq"},"max_score": 0.17402273,"hits": [{"_index": "shopping","_type": "phone","_id": "-aEc-XwBo-TVi9pGjSRH","_score": 0.17402273,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}},{"_index": "shopping","_type": "phone","_id": "-6Eh-XwBo-TVi9pGliRB","_score": 0.17402273,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}}]}
    }
    
  • 请求体带参查询
    由于编码以及安全问题,一般不会在url中直接带参,可以使用body传递条件. 在 Postman 中,向 ES 服务器发 POST请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {"query":{"match":{"category":"小米"}}
    }
    

    返回结果如下(注意,由于此时GET无法传递body,因此所有传递body的请求都因为POST请求。然后根据索引后面的关键词判断请求类型):

  • 请求体带参查找所有文档内容
    查找所有文档内容,也可以这样,在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {"query":{"match_all":{}}
    }
    
  • 请求体带参查询指定字段的数据:
    如果你想查询指定字段,在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带 JSON 体如下:

    {"query":{"match_all":{}},"_source":["title"]
    }
    

分页查询:

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {"query":{"match_all":{}},"from":0,//"size":2
    }
    


    此时结果只显示了两条,即from 和 to 可以理解为第几条

查询排序

  • 在body中添加 order 关键词

    {"query":{"match_all":{}},"sort":{"price":{"order":"asc"}}
    }
    
  • 结果如下:

多条件查询

且逻辑查询:must

  • 假设想找出小米牌子,价格为3999元的, 使用 must 关键词来连接,must相当于数据库的&&
  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
    {"query":{"bool":{"must":[{"match":{"category":"小米"}},{"match":{"price":3999.00}}]}}
    }
    

    结果如下:

或逻辑查询:should

  • 假设想找出小米和华为的牌子。should相当于数据库的||

  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

      {"query":{"bool":{"should":[{"match":{"category":"小米"}},{"match":{"category":"华为"}}]}}
    }
    

范围查询

  • 范围查询使用 filter[range] 关键词
  • 假设想找出小米和华为的牌子,价格大于2000元的手机。
  • 在 Postman 中,向 ES 服务器发 POST 请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:
    {"query":{"bool":{"should":[{"match":{"category":"小米"}},{"match":{"category":"华为"}}],"filter":{"range":{"price":{"gt":2000}}}}}
    }

全文检索

  • 即搜索除最相关的数据,比如关键词为 “小华” 则会输出小米和华为。如果关键词为“米华”,则输出小米,华为和红米
  • 全文检索直接使用 _search 关键词就可以完成,http://127.0.0.1:9200/shopping/_search
{"query":{"match":{"category" : "小华"}}
}

完全匹配

  • 使用 match_phrase 完成完全匹配,词中的每一字都能够得到匹配
  • 代码如下:
{"query":{"match_phrase":{"category" : "为"}}
}

高亮查询

  • 即搜索出来的结果某个字段或某些字与其他字的颜色不同

  • 我们可以使用 highlight"->"fields" 实现高亮设置:

    {"query":{"match_phrase":{"category" : "为"}},"highlight":{"fields":{"category":{}//<----高亮这字段}}
    }

    结果如下:

      {"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1.2039728,"hits": [{"_index": "shopping","_type": "phone","_id": "DaGU-XwBo-TVi9pGESXa","_score": 1.2039728,"_source": {"title": "华为手机","category": "华为","images": "http://www.gulixueyuan.com/xm.jpg","price": 2000},"highlight": {"category": ["华<em>为</em>"]}}]}
    }
    

聚合查询

聚合查询允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值max、平均值avg等等。

  • 按 price 字段进行分组: 使用 agg 指明分组操作,使用 terms 指定分组字段
    在 Postman 中,向 ES 服务器发 GET请求 : http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

    {"aggs":{//聚合操作"price_group":{//名称,随意起名"terms":{//分组"field":"price"//分组字段}}}
    }
    

    结果如下:

    {"took": 15,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 5,"relation": "eq"},"max_score": 1,"hits": [{"_index": "shopping","_type": "phone","_id": "BaGP-XwBo-TVi9pG-SVQ","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}},{"_index": "shopping","_type": "phone","_id": "BqGP-XwBo-TVi9pG_CVf","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}},{"_index": "shopping","_type": "phone","_id": "B6GP-XwBo-TVi9pG_iWO","_score": 1,"_source": {"title": "小米手机","category": "小米","images": "http://www.gulixueyuan.com/xm.jpg","price": 3999}},{"_index": "shopping","_type": "phone","_id": "DaGU-XwBo-TVi9pGESXa","_score": 1,"_source": {"title": "华为手机","category": "华为","images": "http://www.gulixueyuan.com/xm.jpg","price": 2000}},{"_index": "shopping","_type": "phone","_id": "1","_score": 1,"_source": {"phone": {"title": "小米手机","category": "小米"}}}]},"aggregations": {"price_group": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": 3999,"doc_count": 3},{"key": 2000,"doc_count": 1}]}}
    }
    
  • 上面返回结果会附带原始数据的。
    若不想要不附带原始数据的结果,在 Postman 中,向 ES 服务器发 GET请求 :http://127.0.0.1:9200/shopping/_search,附带JSON体如下:

{"aggs":{"price_group":{"terms":{"field":"price"}}},"size":0
}
  • 若想对所有手机价格求平均值。

    {"aggs":{"price_avg":{//名称,随意起名"avg":{//求平均"field":"price"}}},"size":0
    }

    结果如下:

    {"took": 4,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 5,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"price_avg": {"value": 3499.25}}
    }
    
  • 混合聚合:先分组再求求和
    {"aggs":{"price_group":{"terms":{"field":"price"},"aggs": { // 通过嵌套聚合查询,设置桶内指标聚合条件"sum_price": { // 聚合查询名字"sum": { // 聚合类型为: avg指标聚合"field": "price" // 根据price字段计算平均值}}}}},"size":0
    }
    

    结果如下:

Elasticsearch 入门(1):基本概念,安装教程,索引的创建,查询,删除,主键查询,修改,添加,聚合查询,条件查询相关推荐

  1. Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

    了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点.除了主键索引外,普通索引和唯一键索引也是如此, ...

  2. SpringCloud学习笔记024---SpringBoot集成Lucene实现全文检索_分词_索引_更新_删除文档_词条搜索_多条件查询

    JAVA技术交流QQ群:170933152 先看代码实现,下面有lucene介绍: 测试用例 Github 代码 代码我已放到 Github ,导入spring-boot-lucene-demo 项目 ...

  3. ES(Elasticsearch)7.6.1安装教程

    Es(elasticsearch)7.6.1安装教程 注意:除了最后启动ES的时候在es账户下执行,其他都是在root 下执行的.相关文件的下载,我这里都有,百度网盘链接:https://pan.ba ...

  4. 虚拟机安装Ubuntu操作系统(详细安装教程)以及快照创建使用

    虚拟机安装Ubuntu操作系统(详细安装教程)以及快照创建使用 1. 整体介绍 1.1 应用 [系统名称]:Linux-Ubuntu [安装环境]:VMware16.1(虚拟机) 1.2 系统 Ubu ...

  5. mysql索引 删除和创建_mysql索引和唯一索引的创建和删除

    一.本机环境 二.索引的创建删除 三.唯一索引的创建和删除 一.本机环境 系统环境:linux centos 7.2 mysql版本:mysql-5.7.9 安装目录:/application/mys ...

  6. MySQL基础教程系列-约束(一)主键约束

    主键是数据库中十分重要的概念,必须要掌握.合理的主键设置十分重要,直接决定着我们整个模型设计的合理性,如果前期设计不合理,在项目后期更改主键,将会带来灾难性的影响. 什么是主键,如何选取主键,主键的特 ...

  7. oracle删除unique key,【PK】Oracle 10g删除主键约束后无法删除唯一约束索引问题的模拟与分析...

    当先创建唯一约束后再创建主键约束的情况下,如果使用普通方法删除主键约束后,唯一约束索引不会被删除,这是Oracle 10g的一个PROBLEM.本文通过一个实验给大家演示一下这个问题的出现过程及处理方 ...

  8. oracle 唯一索引,唯一约束,主键之间的联系

    主键(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录,在两个表的关系中,主键用来在一个表中引用来自于另一个表中的特定记录,,主键时一种唯一关键字,表定义的一部分. ...

  9. mysql索引的创建及删除

    mysql8 索引 创建索引 创建主键索引 创建唯一键索引 创建普通索引 创建全文索引 删除索引 索引创建原则 创建索引 创建主键索引 create table [表名](列1 数据类型1, 列2 数 ...

  10. 安装ubuntu 创建分区_安装Ubuntu后如何创建单独的主分区

    安装ubuntu 创建分区 Ubuntu doesn't use a separate /home partition by default, although many Linux users pr ...

最新文章

  1. 取余运算怎么算_TensorFlow2.0(2):数学运算
  2. 微软开源 Quantum Katas,领先的量子编程解决方案
  3. oracle如何降低逻辑读,如何降低该SQL的逻辑读
  4. QA测试工程师思维导图
  5. 【数据结构与算法】之深入解析“最小高度树”的求解思路与算法示例
  6. linux cal 命令详解
  7. 不能输入_为什么稳压器输入端不能配漏电保护器
  8. Linux 命令之 sudo -- 以其他用户身份来执行命令
  9. 【牛客 - 551D】CSL 的字符串(单调栈,思维)
  10. 解决虚拟机打开不了?提示VMware Workstation cannot connect to the virtual machine的问题
  11. 迷你世界电锯机器人_迷你世界:石像机器人升级版,制作如此简单!
  12. 多模态AI开发套件HiLens Kit:超强算力彰显云上实力
  13. 非常实用,IDEA 搭建JDK源码学习环境(可修改+断点+笔记)
  14. JEECGJWT异常捕获强化处理
  15. pandas输出到excel_精通Pandas,从零基础到中级运用,看这一篇就够了
  16. UEFI 文件类型.efi
  17. 万字长文:AWS如何跨越“鸿沟”
  18. 终于搞定电子专利网上申请了
  19. DefCamp CTF 2122 Rsa-factory 复现笔记
  20. 项目管理中的变更管理是什么?

热门文章

  1. 如何进行PDF页码删除操作 删除页面的技巧有那些
  2. 最简单深度学习Python实现(二分类问题)
  3. 车牌识别EasyPR--开发详解
  4. 【小样本基础】深度学习中的元学习:元学习的理解、经典MAML算法、用元学习解决具体问题的思路、元学习的分类
  5. Clickhouse基本函数( 转载)
  6. 经济基础知识(中级)【2】
  7. 微信小程序中时间戳和日期的相互转换
  8. Jetson TX2 安装 D435i ROS驱动
  9. 苹果6访问限制密码4位_破解6位密码只需4秒!3步设置密码挡住黑客
  10. 企业利用进销存软件可优化库存管理