使用阿里云试用Elasticsearch学习:1.7 基础入门——索引管理

我们已经看到 Elasticsearch 让开发一个新的应用变得简单,不需要任何预先计划或设置。 不过,要不了多久你就会开始想要优化索引和搜索过程,以便更好地适合您的特定用例。 这些定制几乎围绕着索引和类型的方方面面,在本章,我们将介绍管理索引和类型映射的 API 以及一些最重要的设置。

创建一个索引

到目前为止, 我们已经通过索引一篇文档创建了一个新的索引 。这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射。现在我们需要对这个建立索引的过程做更多的控制:我们想要确保这个索引有数量适中的主分片,并且在我们索引任何数据 之前 ,分析器和映射已经被建立好。

为了达到这个目的,我们需要手动创建索引,在请求体里面传入设置或类型映射,如下所示:

PUT /my_index
{"settings": { ... any settings ... },"mappings": {"type_one": { ... any mappings ... },"type_two": { ... any mappings ... },...}
}

如果你想禁止自动创建索引,你 可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:

action.auto_create_index: false

我们会在之后讨论你怎么用 索引模板 来预配置开启自动创建索引。这在索引日志数据的时候尤其有用:你将日志数据索引在一个以日期结尾命名的索引上,子夜时分,一个预配置的新索引将会自动进行创建。

删除一个索引

用以下的请求来 删除索引:

DELETE /my_index

你也可以这样删除多个索引:

DELETE /index_one,index_two
DELETE /index_*

你甚至可以这样删除 全部 索引:

DELETE /_all
DELETE /*

对一些人来说,能够用单个命令来删除所有数据可能会导致可怕的后果。如果你想要避免意外的大量删除, 你可以在你的 elasticsearch.yml 做如下配置:
action.destructive_requires_name: true
这个设置使删除只限于特定名称指向的数据, 而不允许通过指定 _all 或通配符来删除指定索引库。你同样可以通过 Cluster State API 动态的更新这个设置。

索引设置

你可以通过修改配置来自定义索引行为,详细配置参照 索引模块

Elasticsearch 提供了优化好的默认配置。 除非你理解这些配置的作用并且知道为什么要去修改,否则不要随意修改。

下面是两个 最重要的设置:
number_of_shards
每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
number_of_replicas
每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。

例如,我们可以创建只有 一个主分片,没有副本的小索引:

PUT /my_temp_index
{"settings": {"number_of_shards" :   1,"number_of_replicas" : 0}
}

然后,我们可以用 update-index-settings API 动态修改副本数:

PUT /my_temp_index/_settings
{"number_of_replicas": 1
}

配置分析器

第三个重要的索引设置是 analysis 部分,用来配置已存在的分析器或针对你的索引创建新的自定义分析器。

在 分析与分析器 ,我们介绍了一些内置的分析器,用于将全文字符串转换为适合搜索的倒排索引。

standard 分析器是用于全文字段的默认分析器,对于大部分西方语系来说是一个不错的选择。 它包括了以下几点:

  • standard 分词器,通过单词边界分割输入的文本。
  • standard 语汇单元过滤器,目的是整理分词器触发的语汇单元(但是目前什么都没做)。
  • lowercase 语汇单元过滤器,转换所有的语汇单元为小写。
  • stop 语汇单元过滤器,删除停用词—​对搜索相关性影响不大的常用词,如 a , the , and , is 。

默认情况下,停用词过滤器是被禁用的。如需启用它,你可以通过创建一个基于 standard 分析器的自定义分析器并设置 stopwords 参数。 可以给分析器提供一个停用词列表,或者告知使用一个基于特定语言的预定义停用词列表。

在下面的例子中,我们创建了一个新的分析器,叫做 es_std , 并使用预定义的西班牙语停用词列表:

PUT /spanish_docs
{"settings": {"analysis": {"analyzer": {"es_std": {"type":      "standard","stopwords": "_spanish_"}}}}
}

es_std 分析器不是全局的—​它仅仅存在于我们定义的 spanish_docs 索引中。 为了使用 analyze API来对它进行测试,我们必须使用特定的索引名:

GET /spanish_docs/_analyze?analyzer=es_std
El veloz zorro marrón

简化的结果显示西班牙语停用词 El 已被正确的移除:

{"tokens" : [{ "token" :    "veloz",   "position" : 2 },{ "token" :    "zorro",   "position" : 3 },{ "token" :    "marrón",  "position" : 4 }]
}

自定义分析器

虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。

在 分析与分析器 我们说过,一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

字符过滤器

  • 字符过滤器 用来 整理 一个尚未被分词的字符串。例如,如果我们的文本是HTML格式的,它会包含像 <p> 或者 <div> 这样的HTML标签,这些标签是我们不想索引的。我们可以使用 html清除 字符过滤器 来移除掉所有的HTML标签,并且像把 Á 转换为相对应的Unicode字符 Á 这样,转换HTML实体。
  • 一个分析器可能有0个或者多个字符过滤器。

分词器

  • 一个分析器 必须 有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单元。 标准 分析器里使用的 标准 分词器 把一个字符串根据单词边界分解成单个词条,并且移除掉大部分的标点符号,然而还有其他不同行为的分词器存在。
  • 例如, 关键词 分词器 完整地输出 接收到的同样的字符串,并不做任何分词。 空格 分词器 只根据空格分割文本 。 正则 分词器 根据匹配正则表达式来分割文本 。

词单元过滤器

  • 经过分词,作为结果的 词单元流 会按照指定的顺序通过指定的词单元过滤器 。
  • 词单元过滤器可以修改、添加或者移除词单元。我们已经提到过 lowercase 和 stop 词过滤器 ,但是在 Elasticsearch 里面还有很多可供选择的词单元过滤器。 词干过滤器 把单词 遏制 为 词干。 ascii_folding 过滤器移除变音符,把一个像 “très” 这样的词转换为 “tres” 。 ngram 和 edge_ngram 词单元过滤器 可以产生 适合用于部分匹配或者自动补全的词单元。

在 深入搜索,我们讨论了在哪里使用,以及怎样使用分词器和过滤器。但是首先,我们需要解释一下怎样创建自定义的分析器。

创建一个自定义分析器

和我们之前配置 es_std 分析器一样,我们可以在 analysis 下的相应位置设置字符过滤器、分词器和词单元过滤器:

PUT /my_index
{"settings": {"analysis": {"char_filter": { ... custom character filters ... },"tokenizer":   { ...    custom tokenizers     ... },"filter":      { ...   custom token filters   ... },"analyzer":    { ...    custom analyzers      ... }}}
}

作为示范,让我们一起来创建一个自定义分析器吧,这个分析器可以做到下面的这些事:

  1. 使用 html清除 字符过滤器移除HTML部分。
  2. 使用一个自定义的 映射 字符过滤器把 & 替换为 " and " :
"char_filter": {"&_to_and": {"type":       "mapping","mappings": [ "&=> and "]}
}
  1. 使用 标准 分词器分词。
  2. 小写词条,使用 小写 词过滤器处理。
  3. 使用自定义 停止 词过滤器移除自定义的停止词列表中包含的词:
"filter": {"my_stopwords": {"type":        "stop","stopwords": [ "the", "a" ]}
}

我们的分析器定义用我们之前已经设置好的自定义过滤器组合了已经定义好的分词器和过滤器:

"analyzer": {"my_analyzer": {"type":           "custom","char_filter":  [ "html_strip", "&_to_and" ],"tokenizer":      "standard","filter":       [ "lowercase", "my_stopwords" ]}
}

汇总起来,完整的 创建索引 请求 看起来应该像这样:

PUT /my_index
{"settings": {"analysis": {"char_filter": {"&_to_and": {"type":       "mapping","mappings": [ "&=> and "]}},"filter": {"my_stopwords": {"type":       "stop","stopwords": [ "the", "a" ]}},"analyzer": {"my_analyzer": {"type":         "custom","char_filter":  [ "html_strip", "&_to_and" ],"tokenizer":    "standard","filter":       [ "lowercase", "my_stopwords" ]}}
}}}

索引被创建以后,使用 analyze API 来 测试这个新的分析器:

GET my_index/_analyze
{"analyzer": "my_analyzer","text": "The quick & brown fox"
}
{"tokens" : [{ "token" :   "quick",    "position" : 2 },{ "token" :   "and",      "position" : 3 },{ "token" :   "brown",    "position" : 4 },{ "token" :   "fox",      "position" : 5 }]
}

这个分析器现在是没有多大用处的,除非我们告诉 Elasticsearch在哪里用上它。我们可以像下面这样把这个分析器应用在一个 text字段上:

PUT /my_index/_mapping
{"properties": {"title": {"type": "text","analyzer": "my_analyzer"}}
}

根对象

映射的最高一层被称为 根对象 ,它可能包含下面几项:

  • 一个 properties 节点,列出了文档中可能包含的每个字段的映射
  • 各种元数据字段,它们都以一个下划线开头,例如 _type 、 _id 和 _source
  • 设置项,控制如何动态处理新的字段,例如 analyzer 、 dynamic_date_formats 和 dynamic_templates
  • 其他设置,可以同时应用在根对象和其他 object 类型的字段上,例如 enabled 、 dynamic 和 include_in_all

属性

我们已经在 核心简单域类型 和 复杂核心域类型 章节中介绍过文档字段和属性的三个最重要的设置:
type
字段的数据类型,例如 string 或 date
index
字段是否应当被当成全文来搜索( analyzed ),或被当成一个准确的值( not_analyzed ),还是完全不可被搜索( no )
analyzer
确定在索引和搜索时全文字段使用的 analyzer

我们将在本书的后续部分讨论其他字段类型,例如 ip 、 geo_point 和 geo_shape 。

元数据: _source 字段

默认地,Elasticsearch 在 _source 字段存储代表文档体的JSON字符串。和所有被存储的字段一样, _source 字段在被写入磁盘之前先会被压缩。
这个字段的存储几乎总是我们想要的,因为它意味着下面的这些:

  • 搜索结果包括了整个可用的文档——不需要额外的从另一个的数据仓库来取文档。
  • 如果没有 _source 字段,部分 update 请求不会生效。
  • 当你的映射改变时,你需要重新索引你的数据,有了_source字段你可以直接从Elasticsearch这样做,而不必从另一个(通常是速度更慢+ 的)数据仓库取回你的所有文档。
  • 当你不需要看到整个文档时,单个字段可以从 _source 字段提取和通过 get 或者 search 请求返回。
  • 调试查询语句更加简单,因为你可以直接看到每个文档包括什么,而不是从一列id猜测它们的内容。

然而,存储 _source 字段的确要使用磁盘空间。如果上面的原因对你来说没有一个是重要的,你可以用下面的映射禁用 _source 字段:

PUT /my_index11
{"mappings": {"_source": {"enabled": false}}
}

在一个搜索请求里,你可以通过在请求体中指定 _source 参数,来达到只获取特定的字段的效果:

GET website/_search
{"query":   { "match_all": {}},"_source": [ "title", "created" ]
}

这些字段的值会从 _source 字段被提取和返回,而不是返回整个 _source 。

元数据: _all 字段(弃用)

GET /_search
{"query": {"multi_match": {"query": "starting","fields": ["text", "title", "field3"]}}
}

动态映射

当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射。

有时这是想要的行为有时又不希望这样。通常没有人知道以后会有什么新字段加到文档,但是又希望这些字段被自动的索引。也许你只想忽略它们。如果Elasticsearch是作为重要的数据存储,可能就会期望遇到新字段就会抛出异常,这样能及时发现问题。

幸运的是可以用 dynamic 配置来控制这种行为 ,可接受的选项如下:
true——动态添加新的字段—​缺省
false——忽略新的字段
strict——如果遇到新字段抛出异常

配置参数 dynamic 可以用在根 object 或任何 object 类型的字段上。你可以将 dynamic 的默认值设置为 strict , 而只在指定的内部对象中开启它, 例如:

PUT /my_index2
{"mappings": {"dynamic": "strict","properties": {"title": {"type": "text"},"stash": {"type": "object","dynamic": true}}}
}
  • 如果遇到新字段,对象 会抛出异常。
  • 而内部对象 stash 遇到新字段就会动态创建新字段。

使用上述动态映射, 你可以给 stash 对象添加新的可检索的字段:

POST my_index2/_doc/1
{"title":   "This doc adds a new field","stash": { "new_field": "Success!" }
}

但是对根节点对象 进行同样的操作会失败:

POST my_index2/_doc/1
{"title":   "This doc adds a new field","new_field": { "new_field": "Success!" }
}
{"error": {"root_cause": [{"type": "strict_dynamic_mapping_exception","reason": "[3:18] mapping set to strict, dynamic introduction of [new_field] within [_doc] is not allowed"}],"type": "strict_dynamic_mapping_exception","reason": "[3:18] mapping set to strict, dynamic introduction of [new_field] within [_doc] is not allowed"},"status": 400
}

把 dynamic 设置为 false 一点儿也不会改变 _source 的字段内容。 _source 仍然包含被索引的整个JSON文档。只是新的字段不会被加到映射中也不可搜索。

自定义动态映射

如果你想在运行时增加新的字段,你可能会启用动态映射。然而,有时候,动态映射 规则 可能不太智能。幸运的是,我们可以通过设置去自定义这些规则,以便更好的适用于你的数据。

日期检测

当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如 2014-01-01 。如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 text.keyword 类型添加。

有些时候这个行为可能导致一些问题。想象下,你有如下这样的一个文档:

{ "note": "2014-01-01" }

假设这是第一次识别 note 字段,它会被添加为 date 字段。但是如果下一个文档像这样:

{ "note": "Logged out" }

这显然不是一个日期,但为时已晚。这个字段已经是一个日期类型,这个 不合法的日期 将会造成一个异常。

日期检测可以通过在根对象上设置 date_detection 为 false 来关闭:

PUT /my_index3
{"mappings": {"date_detection": false}
}
 "note": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}

使用这个映射,字符串将始终作为 text.keyword 类型。如果你需要一个 date 字段,你必须手动添加。

Elasticsearch 判断字符串为日期的规则可以通过 dynamic_date_formats setting 来设置。

动态模板

使用 dynamic_templates ,你可以完全控制新检测生成字段的映射。你甚至可以通过字段名称或数据类型来应用不同的映射。

每个模板都有一个名称,你可以用来描述这个模板的用途, 一个 mapping 来指定映射应该怎样使用,以及至少一个参数 (如 match) 来定义这个模板适用于哪个字段。

模板按照顺序来检测;第一个匹配的模板会被启用。例如,我们给 text 类型字段定义两个模板:

  • es :以 _es 结尾的字段名需要使用 spanish 分词器。
  • en :所有其他字段使用 english 分词器。

我们将 es 模板放在第一位,因为它比匹配所有字符串字段的 en 模板更特殊:

PUT /my_index7
{"mappings": {"dynamic_templates": [{"es_text": {"match": "*_es","mapping": {"type": "text","analyzer": "spanish"}}},{"default_text": {"match": "*","mapping": {"type": "text","analyzer": "english"}}}]}
}
  • 匹配字段名以 _es 结尾的字段。
  • 匹配其他所有字符串类型字段。

索引别名和零停机

在前面提到的,重建索引的问题是必须更新应用中的索引名称。 索引别名就是用来解决这个问题的!

索引 别名 就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名 带给我们极大的灵活性,允许我们做下面这些:

在运行的集群中可以无缝的从一个索引切换到另一个索引
给多个索引分组 (例如, last_three_months)
给索引的一个子集创建 视图
在后面我们会讨论更多关于别名的使用。现在,我们将解释怎样使用别名在零停机下从旧索引切换到新索引。

有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。

在本章中,我们假设你的应用有一个叫 my_index 的索引。事实上, my_index 是一个指向当前真实索引的别名。真实索引包含一个版本号: my_index_v1 , my_index_v2 等等。

首先,创建索引 my_index_v1 ,然后将别名 my_index 指向它:

PUT /my_index_v1 
PUT /my_index_v1/_alias/my_index 
  • 创建索引 my_index_v1 。
  • 设置别名 my_index 指向 my_index_v1 。

你可以检测这个别名指向哪一个索引:

GET /*/_alias/my_index

或哪些别名指向这个索引:

GET /my_index_v1/_alias/*

两者都会返回下面的结果:

{"my_index_v1" : {"aliases" : {"my_index" : { }}}
}

然后,我们决定修改索引中一个字段的映射。当然,我们不能修改现存的映射,所以我们必须重新索引数据。 首先, 我们用新映射创建索引 my_index_v2 :

PUT /my_index_v2
{"mappings": {"properties": {"tags": {"type": "text","index": "false"}}}
}

然后我们将数据从 my_index_v1 索引到 my_index_v2 ,下面的过程在 重新索引你的数据 中已经描述过。一旦我们确定文档已经被正确地重索引了,我们就将别名指向新的索引。

一个别名可以指向多个索引,所以我们在添加别名到新索引的同时必须从旧的索引中删除它。这个操作需要原子化,这意味着我们需要使用 _aliases 操作:

POST /_aliases
{"actions": [{ "remove": { "index": "my_index_v1", "alias": "my_index" }},{ "add":    { "index": "my_index_v2", "alias": "my_index" }}]
}

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

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

相关文章

基于单片机的有害气体检查系统设计

**单片机设计介绍&#xff0c;基于单片机的有害气体检查系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的有害气体检查系统设计旨在实现对环境中各种有害气体的实时监测与报警&#xff0c;保障人员健康和环境…

numpy库read_excek,读取函数

文件说明&#xff1a; 版本&#xff1a;window 10 python3.10 解决的问题&#xff1a;pandas库如何读取excel文件 使用pandas库读取Excel文件可以通过以下步骤实现&#xff1a; 1.首先&#xff0c;确保你已经安装了pandas库。可以使用以下命令在Python环境中安装pandas库&…

如何使用NumPy处理数组翻转与变形

NumPy是Python中一个强大的库&#xff0c;主要用于处理大型多维数组和矩阵的数学运算。处理数组翻转与变形是NumPy的常用功能。 1.对多维数组翻转 n np.random.randint(0,100,size(5,6))n# 执行结果array([[ 9, 48, 20, 85, 19, 93], [ 1, 63, 20, 25, 19, 44], …

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

【蓝桥杯每日一题】4.1 奶酪

我天&#xff01;哥们经过两个周的忙碌又重生了&#xff01; 原题链接&#xff1a;528. 奶酪 - AcWing题库 本题注意点&#xff1a; 注意几个边界值&#xff0c;如果说没有球连接顶部或者底部&#xff0c;老鼠是不可能上来的&#xff0c;直接say no!要利用公式判断两个球是相…

零基础轻松入门Java数据库连接(JDBC)

什么是JDBC&#xff1f; Java数据库连接&#xff08;JDBC&#xff09;就像是Java程序和数据库之间的翻译官。它是一个官方的标准接口集&#xff0c;让Java程序能和不同的数据库“对话”。甭管你是在跟MySQL、Oracle还是SQL Server打交道&#xff0c;只要有了JDBC&#xff0c;J…

OpenCV入门例程:裁剪图片、模糊检测、黑屏检测

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 本例程运行环境为CentOS7&…

AI创业机会的探索

AI创业机会的探索 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为当今世界的重要技术之一。AI的广泛应用不仅改变了我们的生活方式&#xff0c;也为创业者带来了前所未有的机会。以下&#xff0c;我们将一起探讨AI领域中的一些创业机会。 一、智能…

JS详解-函数柯里化

简介&#xff1a; 柯里化&#xff08;Currying&#xff09;是一种关于函数的高阶技术。柯里化是一种函数的转换&#xff0c;它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。柯里化不会调用函数。它只是对函数进行转换。 举个例子&#xff1a; 已最简单的…

图像处理入门 3(how to get the pixel pitch / 如何获得单个像素的尺寸)

在这里一节里面&#xff0c;将记录如何获得一个相机传感器中单个像素点的尺寸&#xff0c;为了实现不同相机照片之间的匹配。 如果我们知道了相机传感器的尺寸和分辨率的大小&#xff0c;自然就可以求出单个像素的大小。 在这里插入图片描述&#xff1a; 如何获得相机传感器的…

Redis 怎么发布订阅

在Redis中&#xff0c;发布-订阅模式&#xff08;Pub/Sub&#xff09;允许客户端&#xff08;订阅者&#xff09;订阅频道&#xff0c;并接收其他客户端&#xff08;发布者&#xff09;发送到该频道的消息。下面是如何在Redis中使用发布-订阅模式的简要说明&#xff1a; 订阅频…

C++多线程:async、future、packaged_task、promise、shared_future的学习与使用(九)

1、异步任务线程 异步线程的概念&#xff1a; 异步&#xff1a;就是非同步&#xff0c;同步就是必须一个一个的执行&#xff0c;异步可以两个事情一起干异步线程&#xff1a;异步线程就相当于把非关联的两件事分开找两个线程去执行&#xff0c;而分开的那个就是异步线程举例&am…

06-kafka配置

生产者配置 NAMEDESCRIPTIONTYPEDEFAULTVALID VALUESIMPORTANCEbootstrap.servershost/port列表&#xff0c;用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…&#xff0c;无需添加所有的集群地址&#xff0c;kafka会根据提供的地址发现其他的地址&…

golang设计模式图解——模板方法模式

设计模式 GoF提出的设计模式有23个&#xff0c;包括&#xff1a; &#xff08;1&#xff09;创建型(Creational)模式&#xff1a;如何创建对象&#xff1b; &#xff08;2&#xff09;结构型(Structural )模式&#xff1a;如何实现类或对象的组合&#xff1b; &#xff08;3&a…

FastAPI Web框架教程 第13章 WebSocket

13-1 WebSocket是什么 WebSocket简介&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 在WebSocket API中&#xff0c;浏览器和服务器只需要完成一…

【JavaSE】反射

Java代码的生命周期 Java代码在计算机中经历的阶段&#xff1a;Source源代码阶段、Class类对象阶段、RunTime运行时阶段。 Source源代码阶段: 这个阶段是由程序员编写生成源代码,再由Javac编译器生成class文件。 Class类对象阶段&#xff1a;由类加载器将class文件加载到JVM内…

【网站项目】少儿编程管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

备战蓝桥杯---多路归并与归并排序刷题

话不多说&#xff0c;直接看题 1. 我们考虑一行一行合并&#xff0c;一共m次&#xff0c;我们合并两个并取前n小&#xff0c;那么我们怎么取&#xff1f; 我们采用分组的思想&#xff1a; 我们选第一列的min,然后把后面那个再纳入考虑&#xff0c;用优先队列实现即可。 下面…

chatGPT4无法登录

遇到问题&#xff1a;chatgpt网站上点击登录&#xff08;log in),网站就会跳转并显示&#xff1a;unable to connect 解决方法&#xff1a;不要用亚洲节点&#xff0c;亚洲节点被全面封禁&#xff0c;在全局代理中可以换成美国的节点