Elasticsearch搜索引擎(初级篇)

1.1 初识ElasticSearch | 《ElasticSearch入门到实战》电子书 (chaosopen.cn) 

目录

第一章 入门

1.1  ElasticSearch需求背景

1.2 ElasticSearch 和关系型数据库的对比

1.3 基础概念

文档和字段

索引和映射 

第二章  索引操作

2.0 Mapping映射属性

2.1 创建索引 

DSL语法 

 Java API

 2.2 删除索引

DSL语法 

 Java API

 2.3 判断索引存在

DSL语法 

Java API 

2.4 开启/关闭索引 

关闭索引 

 DSL语法

 Java API

 开启索引

DSL语法 

 Java API

 2.5 索引别名

添加别名 

DSL语法 

 Java API

 删除别名

DSL语法

 Java API

 切换别名

 DSL语法

 Java API语法

 查看别名

 DSL语法

 Java API语法

 第三章 映射操作

3.1 查看映射 

 DSL语法

Java API

 3.2 新增映射

DSL语法 

Java API 

 第四章 文档数据操作(crud)

 4.1 单条插入文档

 4.2 批量插入文档

 4.3 通过ID查询文档

4.4 条件查询文档

4.5 单条更新文档 

4.6 批量更新文档 

4.7 条件更新文档 

4.8 单条删除文档 

4.9 条件删除文档 

第五章 字段类型介绍 

 5.1 索引方式

正向索引 

倒排索引

​第六章 分词操作

6.1 IK分词器

 6.2 拓展词典

 


第一章 入门

ElasticSearch结合Kibana、Logstash、Beats,是一整套技术栈,被叫做ELK,因此下载时版本要对应一致。 

1.1  ElasticSearch需求背景

假设一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。

首先,查询效率较低。

由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。

需要注意的是,数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。目前仅10万不到的数据量差距就如此明显,如果数据量达到百万、千万、甚至上亿级别,这个性能差距会非常夸张。

其次,功能单一

数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。

综上,在面临海量数据的搜索,或者有一些复杂搜索需求的时候,推荐使用专门的搜索引擎来实现搜索功能。

1.2 ElasticSearch 和关系型数据库的对比

 在Elasticsearch 7.x中,Type的概念已经被删除了,就是一个索引下面只能有一种类型。

1.3 基础概念

文档和字段

对标数据库,行为文档,列为字段 。

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

索引和映射 

对标数据库,表为索引,索引中文档的字段约束为映射。

随着业务发展,需要在es中存储的文档也会越来越多,比如有商品的文档、用户的文档、订单文档等等: 

所有文档都散乱存放显然非常混乱,也不方便管理。

因此,我们要将类型相同的文档集中在一起管理,称为索引(Index)。例如:

 

第二章  索引操作

ES索引是存储数据的容器,类似于数据库的表。

2.0 Mapping映射属性

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

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

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

    • 数值:longintegershortbytedoublefloat

    • 布尔:boolean

    • 日期:date

    • 对象:object

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

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

2.1 创建索引 

DSL语法 

PUT indexname
{"settings": {"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"properties": {"name1":{"type": "text"},"name2":{"type": "integer"}}}
}

 参数说明:

settings:索引信息设置

number_of_shards:每个索引的主分片数,这个配置在索引创建后不能修改

number_of_replicas:每个主分片的副本数,这个配置可以随时修改。

mappings:索引映射定义

properties:字段定义 properties里是json配置,key为字段名称(自定义名称),value是个嵌套json,type是指定字段的类型。

 Java API

    //从Spring容器获取client对象@Autowiredprivate RestHighLevelClient client;@RequestMapping("/createIndex")public Boolean createIndex(String indexName) {//创建索引请求类,构造函数参数为索引名称CreateIndexRequest request = new CreateIndexRequest(indexName);//设置source映射字符串,直接把语句复制里面request.source("{\n" +"  \"settings\": {\n" +"    \"number_of_shards\": 1,\n" +"    \"number_of_replicas\": 1\n" +"  },\n" +"  \"mappings\": {\n" +"    \"properties\": {\n" +"      \"name1\":{\n" +"         \"type\": \"text\"\n" +"      },\n" +"      \"name2\":{\n" +"        \"type\": \"integer\"\n" +"      }\n" +"    }\n" +"  }\n" +"}",XContentType.JSON);try {//调用创建索引语法client.indices().create(request, RequestOptions.DEFAULT);return true;} catch (IOException e) {e.printStackTrace();}return false;}

 2.2 删除索引

DSL语法 
DELETE indexname
 Java API
    //从Spring容器获取client对象@Autowiredprivate RestHighLevelClient client;@RequestMapping("/deleteIndex")public Boolean deleteIndex(String indexName) {//删除索引请求类,构造函数参数为索引名称DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);try {//调用删除索引语法client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);return true;} catch (IOException e) {e.printStackTrace();}return false;}

 2.3 判断索引存在

DSL语法 
HEAD indexname

如果索引存在,服务器将返回200状态码;如果索引不存在,服务器将返回404状态码。 

200 - OK

Java API 

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/existsIndex")public Boolean existsIndex(String indexName) {GetIndexRequest request = new GetIndexRequest(indexName);try {return client.indices().exists(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return false;}

2.4 开启/关闭索引 

什么是 Elasticsearch 打开/关闭索引?

一旦索引被关闭,那么这个索引只能显示元数据信息,不能够进行读写操作。 再说说打开索引就好理解了。就是打开被关闭的索引,允许进行读写操作。

关闭索引 

 DSL语法
POST indexname/_close

调用执行,以下返回结果为成功 

{ - "acknowledged": true,"shards_acknowledged": true,"indices": { - "indexname": { - "closed": true}}
}
 Java API
    @RequestMapping("/closeIndex")public Boolean closeIndex(String indexName) {CloseIndexRequest closeIndexRequest = new CloseIndexRequest(indexName);try {client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return true;}

 开启索引

DSL语法 
POST indexname/_open

调用执行,以下返回结果为成功 

{ - "acknowledged": true,"shards_acknowledged": true
}
 Java API
    @RequestMapping("/openIndex")public Boolean openIndex(String indexName) {OpenIndexRequest openIndexRequest = new OpenIndexRequest(indexName);try {client.indices().open(openIndexRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return true;}

 2.5 索引别名

 索引别名概述:

  1. 给多个索引设置一个别名,可以使用这个别名同时查询多个索引的数据。

  2. 例如一个项目场景,每天要建立一个新的索引,程序要查询新的索引数据,程序必然要改变访问的索引名称,如果实现用户无感知切换,那么代码复杂度较高,很容易会对服务的使用者产生一定的影响,过程越复杂,BUG就越容易出现。
    那么有了别名后,可以一开始就给索引加上这个别名,程序只关注访问这个别名,建立新索引后,把别名切换到新索引,程序不用变更,但是后续访问到了新的索引,并且无需停止应用的运行。当然这只是一个场景,在项目开发中,别名还有很多的用途,在后续项目讲解中我们会更多的介绍索引。

添加别名 

创建索引别名,将别名indexname_alias与索引indexname关联。 

DSL语法 
  1. 请求方式1
PUT indexname/_alias/indexname_alias

     2.请求方式2 

POST _aliases
{"actions": [{"add": {"index": "indexname","alias": "indexname_alias"}}]
}
 Java API
    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/addAlias")public Boolean addAlias(String indexName, String aliasName) {IndicesAliasesRequest indicesAliasesRequest = new IndicesAliasesRequest();IndicesAliasesRequest.AliasActions aliasActions = new IndicesAliasesRequest.AliasActions(IndicesAliasesRequest.AliasActions.Type.ADD);aliasActions.index(indexName).alias(aliasName);indicesAliasesRequest.addAliasAction(aliasActions);try {client.indices().updateAliases(indicesAliasesRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return true;}

 删除别名

删除索引别名:解除别名indexname_alias与索引indexname的关联。

DSL语法
  1. 请求方式1
DELETE indexname/_alias/indexname_alias

    2.请求方式2

POST _aliases
{"actions": [{"remove": {"index": "indexname","alias": "indexname_alias"}}]
}
 Java API
    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/removeAlias")public Boolean removeAlias(String indexName, String aliasName) {IndicesAliasesRequest indicesAliasesRequest = new IndicesAliasesRequest();IndicesAliasesRequest.AliasActions aliasActions = new IndicesAliasesRequest.AliasActions(IndicesAliasesRequest.AliasActions.Type.REMOVE);aliasActions.index(indexName).alias(aliasName);indicesAliasesRequest.addAliasAction(aliasActions);try {client.indices().updateAliases(indicesAliasesRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return true;}

 切换别名

切换一个别名是在同一个API中执行添加、删除操作。 

 DSL语法
POST _aliases
{"actions": [{"add": {"index": "indexname1","alias": "indexname_alias"}},{"remove": {"index": "indexname2","alias": "indexname_alias"}}]
}
 Java API语法
    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/changeAlias")public Boolean changeAlias() {String aliasName = "indexname_alias";IndicesAliasesRequest indicesAliasesRequest = new IndicesAliasesRequest();IndicesAliasesRequest.AliasActions addAliasActions = new IndicesAliasesRequest.AliasActions(IndicesAliasesRequest.AliasActions.Type.ADD);addAliasActions.index("indexname1").alias(aliasName);IndicesAliasesRequest.AliasActions removeAliasActions = new IndicesAliasesRequest.AliasActions(IndicesAliasesRequest.AliasActions.Type.REMOVE);removeAliasActions.index("indexname2").alias(aliasName);indicesAliasesRequest.addAliasAction(addAliasActions);indicesAliasesRequest.addAliasAction(removeAliasActions);try {client.indices().updateAliases(indicesAliasesRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return true;}

 查看别名

在 more 里选择 aliases 看所有索引的别名情况,这里也可以修改,功能非常的全面。

 DSL语法
  1. 通过别名查询索引
GET _alias/indexname_alias

 根据返回结果所示,indexname 索引下有这个别名

{ - "indexname": { - "aliases": { - "indexname_alias": { - }}}
}

     2.通过索引查询别名

GET indexname/_alias

    3.查看别名是否存在索引中

GET indexname/_alias/indexname_alias
 Java API语法

1.通过别名查询索引

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/selectIndexByAlias")public Map selectIndexByAlias(String aliasName) {GetAliasesRequest getAliasesRequest = new GetAliasesRequest(aliasName);try {GetAliasesResponse response = client.indices().getAlias(getAliasesRequest,RequestOptions.DEFAULT);Map<String, Set<AliasMetadata>> aliases;aliases = response.getAliases();return aliases;} catch (IOException e) {e.printStackTrace();}return null;}

 2.通过索引查询别名

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/selectAliasByIndex")public Map selectAliasByIndex(String indexName) {GetAliasesRequest getAliasesRequest = new GetAliasesRequest();// 指定查看某一个索引的别名 不指定,则会搜索所有的别名getAliasesRequest.indices(indexName);try {GetAliasesResponse response = client.indices().getAlias(getAliasesRequest,RequestOptions.DEFAULT);Map<String, Set<AliasMetadata>> aliases;aliases = response.getAliases();return aliases;} catch (IOException e) {e.printStackTrace();}return null;}

 3.查看别名是否存在索引中

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/getAliasExist")public Boolean getAliasExist(String indexName, String aliasName) {GetAliasesRequest getAliasesRequest = new GetAliasesRequest(aliasName);getAliasesRequest.indices(indexName);try {return client.indices().existsAlias(getAliasesRequest, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();}return false;}

 第三章 映射操作

映射信息会有索引的字段信息。 

3.1 查看映射 

新建索引后,后续开发中会需要看下有哪些字段,那么我们可以在客户端工具查看,也可以用命令查看。 

1.在客户端中,选择 overview 找到要查看的索引,点击索引名,出现下拉框,选择 show mappings 就可以看到索引映射的字段信息了 

 

 DSL语法

GET indexname/_mapping

 请求返回结果如下:

{ - "indexname": { - "mappings": { - "properties": { - "name1": { - "type": "text"},"name2": { - "type": "integer"}}}}
}

 返回的信息和建立该索引时的信息是一致的。

Java API

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/getMapping")public Map getMapping(String indexName) throws IOException {GetMappingsRequest request = new GetMappingsRequest();request.indices(indexName);GetMappingsResponse mappingsResponse = client.indices().getMapping(request, RequestOptions.DEFAULT);Map<String, MappingMetadata> allMappings = mappingsResponse.mappings();MappingMetadata indexMapping = allMappings.get(indexName);Map<String, Object> mapping = indexMapping.sourceAsMap();return mapping;}

 3.2 新增映射

映射一般情况下是创建索引的时候就已经指定好的,但是在实际开发情况下,我们需要新增字段,那么就需要新增一个字段映射,需要注意的是字段映射只能增加,不能更改删除。 

DSL语法 
POST indexname/_mapping
{"properties":{"name3":{"type":"keyword"}}
}

 新增字段 name3 类型设置 keyword

返回以下结果说明成功: 

{ - "acknowledged": true
}

 查询索引映射,返回结果如下:

{ - "indexname": { - "mappings": { - "properties": { - "name1": { - "type": "text"},"name2": { - "type": "integer"},"name3": { - "type": "keyword"}}}}
}

 从返回结果可见,新字段映射已经添加成功。

Java API 

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/addMapping")public Boolean addMapping(String indexName) {PutMappingRequest request = new PutMappingRequest(indexName);request.source("{\n" +"  \"properties\":{\n" +"    \"name3\":{\n" +"      \"type\":\"keyword\"\n" +"    }\n" +"  }\n" +"}", XContentType.JSON);try {client.indices().putMapping(request, RequestOptions.DEFAULT);return true;} catch (IOException e) {e.printStackTrace();}return false;}

 第四章 文档数据操作(crud)

本章节我们讲对于ES数据的基本操作。

先创建一个索引,便于后续演示

PUT index_operation
{"settings": {"number_of_shards": 1,"number_of_replicas": 1},"mappings": {"properties": {"name":{"type": "keyword"},"age":{"type": "integer"},"description":{"type": "text"}}}
}

 4.1 单条插入文档

指定ID插入数据时,ES会先拿着指定的id去对比一遍所有数据,如果没有新增,有则覆盖。 

DSL语法 

PUT index_operation/_doc/1
{"name":"张三","age":18,"description":"一个学习ES的学生"
}

添加一条指定ID为1的数据

ID可以手动指定,也可以自动生成

 随机ID插入数据如下所示:

POST index_operation/_doc
{"name":"李四","age":21,"description":"一个学习Java的学生"
}

 返回以下结果说明成功

{ - "_index": "index_operation","_type": "_doc","_id": "TKc8a4sBNugPcqcoa9uX","_version": 1,"result": "created","_shards": { - "total": 2,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}

 我们发现ID变成了TKc8a4sBNugPcqcoa9uX,这是ES自动生产的ID

 Java API

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/addDoc")public Boolean addDoc() throws IOException {IndexRequest request = new IndexRequest().index("index_operation");// 指定ID,也可以不指定随机生成request.id("21");// 这里用Map,也可以创建Java对象操作HashMap<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", 18);map.put("description", "一个学习ES的学生");// map转换json字符串request.source(JSON.toJSONString(map), XContentType.JSON);// 请求esclient.index(request, RequestOptions.DEFAULT);return true;}

 4.2 批量插入文档

一般情况是用程序读取数据库执行插入,手动插入情况比较少见。 

DSL语法 

POST _bulk
{"create":{"_index":"index_operation","_id":4}}
{"name":"张三4","age":18,"description":"测试4"}
{"create":{"_index":"index_operation","_id":5}}
{"name":"张三5","age":18,"description":"测试5"}

 Java API

    @Autowiredprivate RestHighLevelClient client;@RequestMapping("/addBatchDoc")public Boolean addBatchDoc() throws IOException {// 批量插入数据BulkRequest request = new BulkRequest();// 生成10条数据for (int i = 0; i < 10; i++) {// 创建对象HashMap<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", 18 + i);map.put("description", "一个学习ES的学生");// 添加文档数据IndexRequest source = new IndexRequest().index("index_operation");source.source(JSON.toJSONString(map), XContentType.JSON);request.add(source);}// 请求esclient.bulk(request, RequestOptions.DEFAULT);return true;}

 4.3 通过ID查询文档

4.4 条件查询文档

4.5 单条更新文档 

4.6 批量更新文档 

4.7 条件更新文档 

4.8 单条删除文档 

4.9 条件删除文档 

第五章 字段类型介绍 

 5.1 索引方式

正向索引 

正排索引是以文档的ID作为关键字,并且记录文档中每个字段的值信息,通过查询id来把整条文档拿出来。

但是在查询某一个keyword存在于哪些文档的时候, 需要对所有文档进行扫描匹配。这样检索效率比较低下。

 

倒排索引

 第六章 分词操作

6.1 IK分词器

IK分词器包含两种模式:

  • ik_smart:智能语义切分

  • ik_max_word:最细粒度切分

我们在Kibana的DevTools上来测试分词器,首先测试Elasticsearch官方提供的标准分词器: 

POST /_analyze
{"analyzer": "standard","text": "黑马程序员学习java太棒了"
}

 结果如下:

{"tokens" : [{"token" : "黑","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "马","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "程","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "序","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "员","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4},{"token" : "学","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 5},{"token" : "习","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 6},{"token" : "java","start_offset" : 7,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 7},{"token" : "太","start_offset" : 11,"end_offset" : 12,"type" : "<IDEOGRAPHIC>","position" : 8},{"token" : "棒","start_offset" : 12,"end_offset" : 13,"type" : "<IDEOGRAPHIC>","position" : 9},{"token" : "了","start_offset" : 13,"end_offset" : 14,"type" : "<IDEOGRAPHIC>","position" : 10}]
}

可以看到,标准分词器智能1字1词条,无法正确对中文做分词。

我们再测试IK分词器:

POST /_analyze
{"analyzer": "ik_smart","text": "黑马程序员学习java太棒了"
}

 执行结果如下:

{"tokens" : [{"token" : "黑马","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "程序员","start_offset" : 2,"end_offset" : 5,"type" : "CN_WORD","position" : 1},{"token" : "学习","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 2},{"token" : "java","start_offset" : 7,"end_offset" : 11,"type" : "ENGLISH","position" : 3},{"token" : "太棒了","start_offset" : 11,"end_offset" : 14,"type" : "CN_WORD","position" : 4}]
}

 6.2 拓展词典

随着互联网的发展,“造词运动”也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“泰裤辣”,“传智播客” 等。

IK分词器无法对这些词汇分词,测试一下:

POST /_analyze
{"analyzer": "ik_max_word","text": "传智播客开设大学,真的泰裤辣!"
}

 结果:

{"tokens" : [{"token" : "传","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "智","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "播","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 2},{"token" : "客","start_offset" : 3,"end_offset" : 4,"type" : "CN_CHAR","position" : 3},{"token" : "开设","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 4},{"token" : "大学","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 5},{"token" : "真的","start_offset" : 9,"end_offset" : 11,"type" : "CN_WORD","position" : 6},{"token" : "泰","start_offset" : 11,"end_offset" : 12,"type" : "CN_CHAR","position" : 7},{"token" : "裤","start_offset" : 12,"end_offset" : 13,"type" : "CN_CHAR","position" : 8},{"token" : "辣","start_offset" : 13,"end_offset" : 14,"type" : "CN_CHAR","position" : 9}]
}

可以看到,传智播客泰裤辣都无法正确分词。

所以要想正确分词,IK分词器的词库也需要不断的更新,IK分词器提供了扩展词汇的功能。

1)打开IK分词器config目录:

 2)在IKAnalyzer.cfg.xml配置文件内容添加:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--><entry key="ext_dict">ext.dic</entry>
</properties>

 3)在IK分词器的config目录新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改

传智播客
泰裤辣

 4)重启elasticsearch

docker restart es# 查看 日志
docker logs -f elasticsearch

 

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

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

相关文章

【SEMI-e ·国际半导体深圳展】| 06月26-28日唯创知音语音芯片供应商 邀您来观展

世界聚焦半导体&#xff0c;产业规模空前&#xff01;一场高端产业研学盛会即将如约而至。 SEMI-e 第六届2024国际半导体展深圳站&#xff0c;2024年06月26-28日将在深圳国际会展中心&#xff08;宝安&#xff09;开展&#xff0c;展会展出面积60000平方米&#xff0c;汇聚全国…

鄂州职业大学2024年成人高等继续教育招生简章

鄂州职业大学&#xff0c;作为一所享有盛誉的高等学府&#xff0c;一直以来都致力于为社会培养具备专业技能和良好素养的优秀人才。在成人高等继续教育领域&#xff0c;该校同样表现出色&#xff0c;为广大渴望继续深造、提升自身能力的成年人提供了宝贵的学习机会。 随着社会…

【C语言】12.指针与数组的关系

一、数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] %p\n", &arr[0]);printf("arr %p\n", arr);return 0; }通过上述代码输出结果我们发现结果相同&#xff0c;因此我们得出结论&a…

李宏毅深度学习03——神经网络训练不起来怎么办

视频链接 如果Optimization失败的时候&#xff0c;怎么把梯度下降做的更好&#xff1f; 只考虑这种情况&#xff0c;不考虑overfitting 局部最小值&#xff08;local minima&#xff09;和鞍点&#xff08;saddle point&#xff09; 为什么Optimization会失败&#xff1f; …

南京邮电大学计算机网络实验一(网络操作系统的安装与配置)

文章目录 一、 实验目的和要求二、 实验环境(实验设备)三、 实验原理和步骤四、 实验小结&#xff08;包括问题和解决方法、心得体会、意见与建议等&#xff09;&#xff08;一&#xff09;问题和解决方法&#xff08;二&#xff09;心得体会&#xff08;三&#xff09;意见与建…

爬山算法优点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【stm32单片机应用】基于I2C协议的OLED显示(利用U82G库)

一、U8g2库 &#xff08;一&#xff09;U8g2简介 U8g2 是一个用于单色和彩色显示的嵌入式图形库&#xff0c;特别适用于单色OLED、LCD显示屏的驱动。它是对早期U8g库的扩展和改进&#xff0c;提供了更多功能和更广泛的硬件支持。U8g2作为一款强大而灵活的嵌入式图形库&#x…

JAVA语言开发的一套(智慧工地监管系统源码)让工地变得更加“聪明”

JAVA语言开发的一套&#xff08;智慧工地监管系统源码&#xff09;让工地变得更加“聪明” 数字智慧工地是指利用物联网、大数据、云计算、人工智能等先进技术&#xff0c;对工地进行全面数字化改造和智能化升级&#xff0c;实现工地管理的精细化、高效化和智能化。它通过实时…

Windows上PyTorch3D安装踩坑记录

直入正题&#xff0c;打开命令行&#xff0c;直接通过 pip 安装 PyTorch3D : (python11) F:\study\2021-07\python>pip install pytorch3d Looking in indexes: http://mirrors.aliyun.com/pypi/simple/ ERROR: Could not find a version that satisfies the requirement p…

聚焦AIoT最后一公里:EasyCVR+AI视频技术在各领域的创新应用

随着5G、AI、边缘计算、物联网&#xff08;IoT&#xff09;、云计算等技术的快速发展&#xff0c;万物互联已经从概念逐渐转变为现实&#xff0c;全新的行业生态AIoT正在开启新时代。巨大的市场潜力与AI等新兴技术不断融合形成的庞大市场缺口&#xff0c;深度场景化应用落地诉求…

生产环境OpenLDAP主从集群

1、背景 在很多组织中&#xff0c;需要对用户和系统进行统一的身份认证和授权管理。为了实现这一目标&#xff0c;通常会使用LDAP&#xff08;轻量级目录访问协议&#xff09;来构建集中化的身份认证和授权服务。而在生产环境中&#xff0c;为了保证高可用性和可扩展性&#x…

Ubuntu server 24 (Linux) 安装lua + 卸载软件

1 apt 安装 # sudo apt update #查看可安装的lua版本 sudo apt-get install luaversion # sudo apt-get install lua5.3 #查看版本 testiZbp1g7fmjea77vsqc5hmmZ:/data/soft$ lua -v Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio2 Ubuntu卸载软件 #查找lua已安装…

python安装包中的.dist-info作用

在使用pip install 包名 进行python第三方库的时候&#xff0c;安装完库之后通常会出现一个库名&#xff0c;还有一个.dist-info的文件&#xff0c;以安装yolov8所依赖的框架ultralytics为例&#xff0c;成功安装后会出现以下文件夹&#xff1a; 第一个ultralytics是概该框架包…

【Android】构建 Android Automotive OS:适合初学者的指南

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

深入探究RTOS的IPC机制----邮箱

阅读引言&#xff1a; 因为将来工作需要&#xff0c; 最近在深入学习OS的内部机制&#xff0c;我把我觉得重要的、核心的东西分享出来&#xff0c; 希望对有需要的人有所帮助&#xff0c; 阅读此文需要读友有RTOS基础&#xff0c; 以及一些操作系统的基础知识&#xff0c; 学习…

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…

Dynamics 365 on-premise 隐藏高级查找导出按钮

提示 着急可以直接看结果代码部分 背景 Dynamics 365 on-premise中有个高级查找的功能,查询的结果支持导出,如下图 业务反馈这个有数据安全风险,要修改显示规则。 一开始想着能用RibbonWorkbench改,就很爽快得答应了业务。结果用RibbonWorkbench改不了。 反复尝试 既…

Linux远程管理日志

实验介绍 本实验旨在实现主机将日志远程发送到堡垒机或远程服务器上&#xff0c;实现通过一台机器管理整个网络内的主机的效果。 准备两台虚拟机作为生产主机和管理机&#xff0c;保证网络通畅&#xff0c;展示如下&#xff1a; 关闭firewalld&#xff0c;通过配置rsyslog&a…

Sklearn之朴素贝叶斯应用

目录 sklearn中的贝叶斯分类器 前言 1 分类器介绍 2 高斯朴素贝叶斯GaussianNB 2.1 认识高斯朴素贝叶斯 2.2 高斯朴素贝叶斯建模案例 2.3 高斯朴素贝叶斯擅长的数据集 2.3.1 三种数据集介绍 2.3.2 构建三种数据 2.3.3 数据标准化 2.3.4 朴素贝叶斯处理数据 2.4 高斯…

Treeselect是介绍及使用(梳理了我使用这个组件遇到的大部分问题)

介绍&#xff1a; Treeselect是一款基于Vue.js的树形选择器组件&#xff0c;可以快速地实现树形结构的选择功能。 这里梳理了我使用这个组件遇到的大部分问题 安装依赖&#xff1a; 首先&#xff0c;你需要在你的项目中安装Treeselect的依赖。这通常可以通过npm或yarn等来完…