ElasticSearch-第二天

目录

文档批量操作

批量获取文档数据

批量操作文档数据

DSL语言高级查询

DSL概述

无查询条件

叶子条件查询

模糊匹配

match的复杂用法

精确匹配

组合条件查询(多条件查询)

连接查询(多文档合并查询)

查询DSL和过滤DSL

区别

query DSL  

filter DSL

Query方式查询:案例

term

match

multi_match

query_string

范围查询

分页、输出字段、排序综合查询

Filter Context 对数据进行过滤

总结

match

term

match_phase

query_string

文档映射

动态映射

静态映射

核心类型(Core datatype)

keyword 与 text 映射类型的区别

创建静态映射时指定text类型的ik分词器

设置ik分词器的文档映射

分词查询

对已存在的mapping映射进行修改

Elasticsearch乐观并发控制

悲观并发控制

乐观并发控制

举例

ES集群环境搭建

将安装包分发到其他服务器上面

修改elasticsearch.yml

修改jvm.option

node2与node3修改es配置文件


文档批量操作

这个不用看,看DSL语言哪个就行

这里多个文档是指,批量操作多个文档

批量获取文档数据

批量获取文档数据是通过_mget的API来实现的

在URL中不指定index和type

  • 请求方式:GET
  • 请求地址:_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    •  docs : 文档数组参数
      • _index : 指定index
      • _source : 指定要查询的字段
      • _id : 指定id
      • _type : 指定type
GET _mget 
{
	"docs": 
	[
	  {
			"_index": "es_db",
			"_type": "_doc",
			"_id": 1
		},
		{
			"_index": "es_db",
			"_type": "_doc",
			"_id": 2
		}
	]
}

响应结果如下:

{
  "docs" : [
    {
      "_index" : "es_db",
      "_type" : "_doc",
      "_id" : "1",
      "_version" : 3,
      "_seq_no" : 7,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "name" : "张三666",
        "sex" : 1,
        "age" : 25,
        "address" : "广州天河公园",
        "remark" : "java developer"
      }
    },
    {
      "_index" : "es_db",
      "_type" : "_doc",
      "_id" : "2",
      "_version" : 1,
      "_seq_no" : 1,
      "_primary_term" : 1,
      "found" : true,
      "_source" : {
        "name" : "李四",
        "sex" : 1,
        "age" : 28,
        "address" : "广州荔湾大厦",
        "remark" : "java assistant"
      }
    }
  ]
}

在URL中指定index

  • 请求方式:GET
  • 请求地址:/{{indexName}}/_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    • docs : 文档数组参数
      • _index : 指定index
      • _source : 指定要查询的字段
      • _id : 指定id
      • _type : 指定type
GET / es_db / _mget 
{
	"docs": [
	  {
			"_type": "_doc",
			"_id": 3
		},
		{
			"_type": "_doc",
			"_id": 4
		}
	]
}

在URL中指定index和type

  • 请求方式:GET
  • 请求地址:/{{indexName}}/{{typeName}}/_mget
  • 功能说明 : 可以通过ID批量获取不同index和type的数据
  • 请求参数:
    • docs : 文档数组参数
      • _index : 指定index
      • _source : 指定要查询的字段
      • _id : 指定id
      • _type : 指定type
GET / es_db / _doc / _mget 
{
	"docs": [
	    {
			"_id": 1
		},
		{
			"_id": 2
		}
	]
}

批量操作文档数据

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

  • 请求方式:POST
  • 请求地址:_bulk
  • 请求参数:通过_bulk操作文档,一般至少有两行参数(或偶数行参数)
    • 第一行参数为指定操作的类型及操作的对象(index,type和id)
    • 第二行参数才是操作的数据

参数类似于:

{"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": "白起老师1",
	"content": "白起老师666",
	"tags": ["java", "面向对象"],
	"create_time": 1554015482530
} {
	"create": {
		"_index": "article",
		"_type": "_doc",
		"_id": 4
	}
} {
	"id": 4,
	"title": "白起老师2",
	"content": "白起老师NB",
	"tags": ["java", "面向对象"],
	"create_time": 1554015482530
}

普通创建或全量替换index

POST _bulk {
	"index": {
		"_index": "article",
		"_type": "_doc",
		"_id": 3
	}
} {
	"id": 3,
	"title": "图灵徐庶老师(一)",
	"content": "图灵学院徐庶老师666",
	"tags": ["java", "面向对象"],
	"create_time": 1554015482530
} {
	"index": {
		"_index": "article",
		"_type": "_doc",
		"_id": 4
	}
} {
	"id": 4,
	"title": "图灵诸葛老师(二)",
	"content": "图灵学院诸葛老师NB",
	"tags": ["java", "面向对象"],
	"create_time": 1554015482530
}
  • 如果原文档不存在,则是创建
  • 如果原文档存在,则是替换(全量修改原文档)

批量删除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": "ES大法必修内功"
	}
} {
	"update": {
		"_index": "article",
		"_type": "_doc",
		"_id": 4
	}
} {
	"doc": {
		"create_time": 1554018421008
	}
}

DSL语言高级查询

DSL概述

Domain Specific Language:领域专用语言

Elasticsearch provides a ful1 Query DSL based on JSON to define queries

Elasticsearch提供了基于JSON的DSL来定义查询。

DSL由叶子查询子句和复合查询子句两种子句组成。

 

无查询条件

无查询条件是查询所有,默认是查询所有的,或者使用match_all表示所有

GET / es_db / _doc / _search 
{
	"query": {
		"match_all": {}
	 }
}

叶子条件查询

模糊匹配

模糊匹配主要是针对文本类型的字段,文本类型的字段会对内容进行分词,对查询时,也会对搜索条件进行分词,然后通过倒排索引查找到匹配的数据,模糊匹配主要通过match等参数来实现

  • match : 通过match关键词模糊匹配条件内容
  • prefix : 前缀匹配
  • regexp : 通过正则表达式来匹配数据

match的复杂用法

match条件还支持以下参数:

  • query : 指定匹配的值
  • operator : 匹配条件类型
    • and : 条件分词后都要匹配
    • or : 条件分词后有一个匹配即可(默认)
  • minmum_should_match : 指定最小匹配的数量

精确匹配

  • term : 单个条件相等
  • terms : 单个字段属于某个值数组内的值
  • range : 字段属于某个范围内的值
  • exists : 某个字段的值是否存在
  • ids : 通过ID批量查询

组合条件查询(多条件查询)

组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询条件

  • bool : 各条件之间有and,or或not的关系
    • must : 各个条件都必须满足,即各条件是and的关系
    • should : 各个条件有一个满足即可,即各条件是or的关系
    • must_not : 不满足所有条件,即各条件是not的关系
    • filter : 不计算相关度评分,它不计算_score即相关度评分,效率更高
  • constant_score : 不计算相关度评分

must/filter/shoud/must_not 等的子条件是通过 term/terms/range/ids/exists/match 等叶子条件为参数的

注:以上参数,当只有一个搜索条件时,must等对应的是一个对象,当是多个条件时,对应的是一个数组

连接查询(多文档合并查询)

  • 父子文档查询:parent/child
  • 嵌套文档查询: nested

查询DSL和过滤DSL

区别

query DSL  

在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。

filter DSL

在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”

答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。

过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用must_not或者filter

另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

Query方式查询:案例

term

根据名称精确查询姓名 term, term查询不会对字段进行分词查询,会采用精确匹配

注意: 采用term精确查询, 查询字段映射类型属于为keyword.

举例:

POST / es_db / _doc / _search 
{
	"query": {
		"term": {
			"name": "admin"
		}
	}
}

match

根据备注信息模糊查询 match, match会根据该字段的分词器,进行分词查询

举例:

POST / es_db / _doc / _search 
{
	"from": 0,
	"size": 2,
	"query": {
		"match": {
			"address": "广州"
		}
	}
}

multi_match

多字段模糊匹配查询与精准查询 multi_match

POST / es_db / _doc / _search 
{
	"query": {
		"multi_match": {
			"query": "张三",
			"fields": ["address", "name"]
		}
	}
}

query_string

  • 未指定字段条件查询 query_string , 含 AND 与 OR 条件
POST / es_db / _doc / _search 
{
	"query": {
		"query_string": {
			"query": "广州 OR 长沙"
		}
	}
}
  • 指定字段条件查询 query_string , 含 AND 与 OR 条件
POST / es_db / _doc / _search 
{
	"query": {
		"query_string": {
			"query": "admin OR 长沙",
			"fields": ["name", "address"]
		}
	}
}

范围查询

注:json请求字符串中部分字段的含义

range:范围关键字

  • gte 大于等于
  • lte  小于等于
  • gt 大于
  • lt 小于
  • now 当前时间
POST / es_db / _doc / _search 
{
	"query": {
		"range": {
			"age": {
				"gte": 25,
				"lte": 28
			}
		}
	}
}

分页、输出字段、排序综合查询

POST / es_db / _doc / _search 
{
	"query": {
		"range": {
			"age": {
				"gte": 25,
				"lte": 28
			}
		}
	},
	"from": 0,
	"size": 2,
	"_source": ["name", "age", "book"], // 显示哪几个字段
	"sort": {
		"age": "desc"  // 排序字段
	}
}

Filter Context 对数据进行过滤

Filter过滤器方式查询,它的查询不会计算相关性分值,也不会对结果进行排序, 因此效率会高一点,查询的结果可以被缓存。

POST / es_db / _doc / _search 
{
	"query": {
		"bool": {
			"filter": {
				"term": {
					"age": 25
				}
			}
		}
	}
}

总结

match

match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。

term

term: 这种查询和match在有些时候是等价的,比如我们查询单个的词hello,那么会和match查询结果一样,但是如果查询"hello world",结果就相差很大,因为这个输入不会进行分词,就是说查询的时候,是查询字段分词结果中是否有"hello world"的字样,而不是查询字段中包含"hello world"的字样。当保存数据"hello world"时,elasticsearch会对字段内容进行分词,"hello world"会被分成hello和world,不存在"hello world",因此这里的查询结果会为空。这也是term查询和match的区别。

match_phase

match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that world不满足,world hello也不满足条件。

query_string

query_string:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛

文档映射

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

动态映射

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

动态映射规则如下:

删除原创建的索引:DELETE /es_db

创建索引:PUT /es_db

创建文档(ES根据数据类型, 会自动创建映射)

PUT / es_db / _doc / 1 
{
	"name": "Jack",
	"sex": 1,
	"age": 25,
	"book": "java入门至精通",
	"address": "广州小蛮腰"
}

获取文档映射:GET /es_db/_mapping

静态映射

静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射

设置文档映射 

PUT / es_db {
	"mappings": {
		"properties": {
			"name": {
				"type": "keyword",
				"index": true,
				"store": true
			},
			"sex": {
				"type": "integer",
				"index": true,
				"store": true
			},
			"age": {
				"type": "integer",
				"index": true,
				"store": true
			},
			"book": {
				"type": "text",
				"index": true,
				"store": true
			},
			"address": {
				"type": "text",
				"index": true,
				"store": true
			}
		}
	}
}

核心类型(Core datatype)

字符串:string,string类型包含 text 和 keyword。

text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。

keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。

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

日期型:date

布尔型:boolean

keyword 与 text 映射类型的区别

将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、排序)

将 book 字段设置为 text 映射能模糊查询, 能分词查询,不能聚合、排序

POST / es_db / _doc / _search 
{
	"query": {
		"term": {
			"book": "elasticSearch入门至精通"
		}
	}
}

创建静态映射时指定text类型的ik分词器

设置ik分词器的文档映射

  • 先删除之前的es_db
  • 再创建新的es_db
  • 定义ik_smart的映射
PUT / es_db 
{
	"mappings": {
		"properties": {
			"name": {
				"type": "keyword",
				"index": true,
				"store": true
			},
			"sex": {
				"type": "integer",
				"index": true,
				"store": true
			},
			"age": {
				"type": "integer",
				"index": true,
				"store": true
			},
			"book": {
				"type": "text",
				"index": true,
				"store": true,
				"analyzer": "ik_smart",
				"search_analyzer": "ik_smart"
			},
			"address": {
				"type": "text",
				"index": true,
				"store": true
			}
		}
	}
}

分词查询

POST / es_db / _doc / _search 
{
	"query": {
		"match": {
			"address": "广"
		}
	}
}

POST / es_db / _doc / _search {
	"query": {
		"match": {
			"address": "广州"
		}
	}
}

对已存在的mapping映射进行修改

具体方法

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

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

3)删除原创建的索引

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

POST _reindex   // 命令
{
	"source": {
		"index": "db_index"  // 来源数据
	},
	"dest": {
		"index": "db_index_2"  //目标数据
	}
}

DELETE /db_index  // 删除原来的索引

PUT /db_index_2 /_alias /db_index  // 对新建的索引重新命名

注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机

Elasticsearch乐观并发控制

在数据库领域中,有两种方法来确保并发更新,不会丢失数据:

悲观并发控制

这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。

乐观并发控制

Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。

举例

再以创建一个文档为例 ES老版本        

PUT /db_index /_doc /1 
{
	"name": "Jack",
	"sex": 1,
	"age": 25,
	"book": "Spring Boot 入门到精通",
	"remark": "hello world"
}

实现_version乐观锁更新文档,根据版本去查询

PUT /db_index /_doc /1?version=1 
{
	"name": "Jack",
	"sex": 1,
	"age": 25,
	"book": "Spring Boot 入门到精通",
	"remark": "hello world"
}

ES新版本(7.x)不使用version进行并发版本控制 if_seq_no=版本值&if_primary_term=文档位置

  • _seq_no:文档版本号,作用同_version
  • _primary_term:文档所在位置
POST /es_sc/_search

DELETE /es_sc

POST /es_sc/_doc/1
{
  "id": 1,
  "name": "图灵学院",
  "desc": "图灵学院白起老师",
  "create_date": "2021-02-24"
}

POST /es_sc/_update/1
{
  "doc": {
  	"name": "图灵教育666"
   }
}

// 下面这两个有一个能执行成功,一个执行不成功,因为seq_no版本号变了
POST /es_sc/_update/1/?if_seq_no=1&if_primary_term=1
{
  "doc": {
  	"name": "图灵学院1"
  }    
}

POST /es_sc/_update/1/?if_seq_no=1&if_primary_term=1
{
  "doc": {
  	"name": "图灵学院2"
  }    
}

ES集群环境搭建

将安装包分发到其他服务器上面

修改elasticsearch.yml

node1.baiqi.cn 服务器使用baiqi用户来修改配置文件

mkdir -p /usr/local/es/elasticsearch-7.6.1/log
mkdir -p /usr/local/es/elasticsearch-7.6.1/data

cd /usr/local/es/elasticsearch-7.6.1/config

rm -rf elasticsearch.yml

vim elasticsearch.yml
cluster.name: baiqi-es
node.name: node1.baiqi.cn
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: node1.baiqi.cn
http.port: 9200
discovery.seed_hosts: ["IP1", "IP2", "IP3"]
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

修改jvm.option

修改jvm.option配置文件,调整jvm堆内存大小

node1.baiqi.cn使用baiqi用户执行以下命令调整jvm堆内存大小,每个人根据自己服务器的内存大小来进行调整。

cd /usr/local/es/elasticsearch-7.6.1/config
vim jvm.options
-Xms2g
-Xmx2g

node2与node3修改es配置文件

node2.baiqi.cn与node3.baiqi.cn也需要修改es配置文件

node2.baiqi.cn使用baiqi用户执行以下命令修改es配置文件

mkdir -p /usr/local/es/elasticsearch-7.6.1/log
mkdir -p /usr/local/es/elasticsearch-7.6.1/data

cd /usr/local/es/elasticsearch-7.6.1/config


vim elasticsearch.yml
cluster.name: baiqi-es
node.name: node2.baiqi.cn
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: node2.baiqi.cn
http.port: 9200
discovery.seed_hosts: ["IP1", "IP2", "IP3"]
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

node3.baiqi.cn使用baiqi用户执行以下命令修改配置文件

mkdir -p /usr/local/es/elasticsearch-7.6.1/log
mkdir -p /usr/local/es/elasticsearch-7.6.1/data

cd /usr/local/es/elasticsearch-7.6.1/config


vim elasticsearch.yml
cluster.name: baiqi-es
node.name: node3.baiqi.cn
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: node3.baiqi.cn
http.port: 9200
discovery.seed_hosts: ["IP1", "IP2", "IP3"]
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

查看集群状态:

GET   _cat/nodes?v
GET   _cat/health?v

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录。 逆向目标 目标:某 7 网游登录主页:aHR0cHM6Ly93d3cuMzcuY29tLw接口:aHR0cHM6Ly9teS4zNy5jb20vYXBpL…

Vue的命令式和声明式的概念

1.命令式框架(jQuery) 这里有个小例子: 1.获取id为app的div标签 2.设置他的文本内容是hello,world 3.为其绑定点击事件 4.当点击时候弹出提示ok 1.首先我们通过$来活动app的标签 $(#app)//获取id为app的标签 2.然后通过text来讲内容设置为hello&am…

Sentinel 授权规则规则持久化

本篇博客我们来学习授权规则,授权规则是对请求者的一种身份的判断。 1、授权规则 授权规则是对请求者的身份做一个判断。你有没有权限来访问我?那就有人可能会说这个功能,好像以前我们在学习微服务的时候讲过网关他不就是把门的吗&#xff1…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

springboot车辆充电桩

sprinboot车辆充电桩演示录像2022开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:ecli…

文法和语言的基本知识

一、什么形式化的方法用一套带有严格规定的符号体系来描述问题的方法二、什么是非形式化的方法对程序设计语言的描述从语法、语义和语用三个方面因素来考虑所谓语法是对语言结构定义所谓语义是描述了语言的含义所谓语用则是从使用的角度去描述语言三、符号串字母表和符号串字母…

vue基于vant封装可精确到秒的时间选择器

前言 在移动开发中,时间选择的控件比比皆是,但却鲜有类似的组件可以精确到秒级别的,官方可能是考虑到小屏幕手机的显示问题,也可能是使用的场景寥寥无几,但是少不代表没有,所以最近花了点时间基于 vant 组件…

011+limou+C语言深入知识——(3)“字符串函数”和“字符分类函数”和“内存操作函数”以及“部分库函数的模拟实现”

一、字符串库函数 001、求字符串长度strlen size_t strlen ( const char * str );注意size_t是一个无符号类型&#xff0c;没有正负 #include <stdio.h> #include <string.h> int main() {char*str1 "abcdef";strcmpchar*str2 "bbb";if( …

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》

《Roller: Fast and Efficient Tensor Compilation for Deep Learning》 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的kernel时&#xff0c;搜索空间大&#xff0c;通常使用机器学习的方法 找到最优的方案…

【测试开发篇3】软件测试的常用概念

目录 一、软件测试的生命周期(5个步骤) ①需求分析(两个角度) 用户角度&#xff1a; 开发人员的角度&#xff1a; ②测试计划 ③测试设计、测试开发 ④执行测试 ⑤测试评估 二、软件测试贯穿项目的整个生命周期的体现 需求分析阶段 计划阶段 设计阶段 编码阶段 …

Keil5安装和使用小记

随着keil版本的更新&#xff0c;一些使用问题一随之产生。本文针对安装目前最新版本keil软件和使用问题做一些总结。 目录1 Keil5下载&安装1.1 官网下载链接1.2 软件安装1.2.1 安装说明1.2.2 关于 51 和 ARM 共存的问题1.3 软件破解2 pack包安装 & 破解2.1 下载2.2 安装…

智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类&#xff0c;通过图片、视频和摄像头识别生活垃圾&#xff0c;对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数&#xff0c;以协助垃圾环保分类处理。本文详细介绍基于YOLO…

找一找马里奥-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第110讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

《Linux的权限》

本文主要对linux的一些基本权限进行讲解 文章目录前言Linux权限&#xff08;1&#xff09;权限的概念&#xff08;2&#xff09;linux下用户分类(root,普通)(3)linux的文件属性文件属性的分类文件权限修改文件权限1、chmod2、chown和chgrp3、fiile权限的三个重要的问题第一个问…

Java面向对象:接口的学习

本文介绍了Java中接口的基本语法, 什么是接口, java中的接口 语法规则, 接口的使用,接口的特性,如何实现多个接口,接口间的继承,以及抽象类和接口的区别 Java接口的学习一.接口的概念二.Java中的接口1.接口语法规则2.接口的使用3.接口的特性4.实现多个接口5.接口间的继承三.抽象…

C++线程池理解

线程池基本信息 线程池是一种结合池化思想衍生出来的一种线程管理及使用的方案 其主要针对服务器端多线程场景下&#xff0c;服务器频繁接收请求&#xff0c;每个请求都分配一个单独的线程去处理。 使用线程的开销&#xff1a; 创建和销毁线程调度线程 线程池主要解决的核…

你是真的“C”——结构体中鲜有人知的“秘密”

你是真的“C”——结构体中的精髓剖析【内存对齐】 【位段】 &#x1f60e;前言&#x1f64c;结构体内存对齐&#xff1a;&#x1f60a;结构体内存对齐存在的意思是什么&#xff1f;&#x1f618;内存对齐例子详细剖析&#xff1a;&#x1f618;结构体中的位段&#xff1a;&…

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

本文是专栏《Vue SpringBoot前后端分离项目实战》的实战第一篇&#xff0c;将从Vue脚手架安装开始&#xff0c;逐步带你搭建起一套管理系统所需的架构。当然&#xff0c;在默认安装完成之后&#xff0c;会对文件目录进行初步的细化拆分&#xff0c;以便后续功能迭代和维护所用…

ChatGPT没有API?OpenAI官方API带你起飞

目录ChatGPT没有API&#xff1f;OpenAI官方API带你起飞安装 OpenAI 的 API 库包装个函数包装个UIAPI 调不通怎么办&#xff1f;ChatGPT没有API&#xff1f;OpenAI官方API带你起飞 前段时间ChatGPT爆火&#xff0c;OpenAI 的 GPT API也被大家疯狂调用&#xff0c; 但其实这个AP…

超详细的堆排序,进来看看吧。

1.堆的基本概念1.1什么是堆堆是一种叫做完全二叉树的数据结构&#xff0c;1.2大堆和小堆大堆:每个节点的值都大于或者等于他的左右孩子节点的值小根堆:每个结点的值都小于或等于其左孩子和右孩子结点的值1.3完全二叉树节点之间的关系leftchild parent*2 1rightchild parent*…