第六章 映射:Mappings

news2024/10/5 21:24:43

文章目录

  • 1、Mapping 简介
    • 1.1 mapping 是啥?
    • 1.2 如何查看索引映射
  • 2、自动映射:dynamic mapping
    • 2.1 自动类型推断规则
    • 2.2 mapping 的使用禁忌
    • 2.3 自动映射器的意义是什么?
  • 3、手动映射:Explicit mapping
    • 3.1 创建索引的 mapping
    • 3.2 修改 mapping 属性
  • 4、ES 数据类型 ★:field data type
    • 4.1 概述
    • 4.2 ES 支持的数据类型
      • 4.2.1 基本数据类型 ★
      • 4.2.2 对象关系类型(复杂类型)
      • 4.2.3 结构化类型
      • 4.2.4 聚合数据类型
      • 4.2.5 文本搜索字段
      • 4.2.6 文档排名类型
      • 4.2.7 空间数据类型 ★
      • 4.2.8 其他类型
  • 5、映射参数
    • 5.1 支持的映射参数
  • 5、Text 类型 ★★
  • 6、keyword 类型 ★
  • 7、Date 类型 ★
    • 7.1 案例
    • 7.2 原理
    • 7.3 采用手工映射
    • 7.4 总结
    • 7.5 解决方案
  • 8、Nested 类型 ★

1、Mapping 简介

1.1 mapping 是啥?

ES 中的 mapping 有点类似与关系数据库中表结构的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在 ES 中一个字段可以有对个类型。

img

1.2 如何查看索引映射

查看完整的索引 mapping

GET /<index_name>/_mappings

查看索引中指定字段的 mapping

GET /<index_name>/_mappings/field/<field_name>

2、自动映射:dynamic mapping

自动映射也叫动态映射,是 ES 在索引文档写入发生时自动创建 mapping 的一种机制。

ES 在创建索引之前,并不强制要求创建索引的 mapping,ES 会根据字段的值来推断字段类型,进而自动创建并指定索引类型。

2.1 自动类型推断规则

下面是自动映射器推断字段类型的规则

自动映射器会尽可能的把字段映射为宽字段类型。

2.2 mapping 的使用禁忌

  • ES 没有隐式类型转换
  • ES 不支持类型修改
  • 生产环境尽可能的避免使用 dynamic mapping

2.3 自动映射器的意义是什么?

官方的解释是为了照顾入门学习者,但实际上我更建议初学者尽量避免使用自动映射器,而尽可能多的显式声明 mapping,因为显式创建 mapping 是生产环境必须的,所以这是必须掌握的技能。

反而是老手,在非生产环境中,使用自动映射会比较方便。

3、手动映射:Explicit mapping

手动映射也叫做显式映射,即:在索引文档写入之前,认为的创建索引并且指定索引中每个字段类型、分词器等参数。

3.1 创建索引的 mapping

PUT /<index_name>
{
  "mappings": {
    "properties": {
      "field_a": {
        "<parameter_name>": "<parameter_value>"
      },
      ...
    }
  }
}

3.2 修改 mapping 属性

注意和创建 mapping 时的语法区别。

PUT <index_name>/_mapping
{
  "properties": {
    "<field_name>": {
      "type": "text",	// 必须和原字段类型相同,切不许显式声明
      "analyzer":"ik_max_word",	// 必须和元原词器类型相同,切必须显式声明
      "fielddata": false
    }
  }
}

**注意:**并非所有字段参数都可以修改。

  • 字段类型不可修改
  • 字段分词器不可修改

4、ES 数据类型 ★:field data type

4.1 概述

每个字段都有字段数据类型或字段类型。其大致分为两种:会被分词的字段类型不会被分词的字段类型。

  • 会被分词的类型:text、match_only_text 等。
  • 不会被分词类型:keyword、数值类型等。

当然数据类型的划分可以分为很多种,比如按照基本数据类型和复杂数据类型来划分。

4.2 ES 支持的数据类型

注意

  • 标注颜色为浅灰色代表非常用数据类型
  • 标注为非常重要的数据类型,会单独用一节课来讲

4.2.1 基本数据类型 ★

  • Numbers:数字类型,包含很多具体的基本数据类型
    在这里插入图片描述

  • binary:编码为 Base64 字符串的二进制值。

  • boolean:即布尔类型,接受 true 和 false。

  • alias:字段别名。

  • Keywords:包含 keyword ★、constant_keyword 和 wildcard。

  • Dates:日期类型,包括 data ★ 和 data_nanos,两种类型

4.2.2 对象关系类型(复杂类型)

  • object:非基本数据类型之外,默认的 json 对象为 object 类型。
  • flattened:单映射对象类型,其值为 json 对象。
  • nested ★:嵌套类型。
  • join:父子级关系类型。

4.2.3 结构化类型

  • Range:范围类型,比如 long_range,double_range,data_range 等
  • ip:ipv4 或 ipv6 地址
  • version:版本号
  • murmur3:计算和存储值的散列

4.2.4 聚合数据类型

  • aggregate_metric_double
  • histogram

4.2.5 文本搜索字段

  • text ★:文本数据类型,用于全文检索。
  • annotated-text:
  • completion ★**:**
  • search_as_you_type:
  • token_count:

4.2.6 文档排名类型

  • dense_vector:记录浮点值的密集向量。
  • rank_feature:记录数字特征以提高查询时的命中率。
  • rank_features:记录数字特征以提高查询时的命中率。

4.2.7 空间数据类型 ★

  • geo_point:纬度和经度点。
  • geo_shape:复杂的形状,例如多边形。
  • point:任意笛卡尔点。
  • shape:任意笛卡尔几何。

4.2.8 其他类型

  • percolator:用Query DSL 编写的索引查询。

5、映射参数

5.1 支持的映射参数

以下是 ES 中说所有支持的映射参数

参数名称释义
analyzer指定分析器,只有 text 类型字段支持。
coerce是否允许强制类型转换,支持对字段段度设置或者对整个索引设置。
true: “1” => 1
false: “1” =< 1
索引级设置 在这里插入图片描述 字段级设置在这里插入图片描述
copy_to该参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询
doc_values为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc值以节省磁盘空间(不支持 text 和 annotated_text)在开源社区 ES 8.x:进阶篇 - 深入聚合原理章节中会深入讲解
dynamic ★控制是否可以动态添加新字段,支持以下四个选项:true:(默认)允许动态映射false:忽略新字段。这些字段不会被索引或搜索,但仍会出现在_source返回的命中字段中。这些字段不会添加到映射中,必须显式添加新字段。runtime:新字段作为运行时字段添加到索引中,这些字段没有索引,是_source在查询时加载的。strict:如果检测到新字段,则会抛出异常并拒绝文档。必须将新字段显式添加到映射中。
eager_global_ordinals**用于聚合的字段上,优化聚合性能。例如:在这里插入图片描述
enabled**是否创建倒排索引,可以对字段操作,也可以对索引操作,如果不创建索引,让然可以检索并在_source元数据中展示,谨慎使用,该状态无法修改。在这里插入图片描述
fielddata查询时内存数据结构,在首次用当前字段聚合、排序或者在脚本中使用时,需要字段为fielddata数据结构,并且创建倒排索引保存到堆中
fields给 field 创建多字段,用于不同目的(全文检索或者聚合分析排序)
format**用于格式化代码,如:在这里插入图片描述
ignore_above超过长度将被忽略
ignore_malformed忽略类型错误
index_options控制将哪些信息添加到反向索引中以进行搜索和突出显示。仅用于text 字段
index_phrases提升exact_value查询速度,但是要消耗更多磁盘空间
index_prefixes前缀搜索:min_chars:前缀最小长度,>0,默认2(包含)max_chars:前缀最大长度,<20,默认5(包含)
index是否对创建对当前字段创建倒排索引,默认 true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在 source 元数据中展示true 新检测到的字段将添加到映射中。(默认)false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式添加新字段。strict 如果检测到新字段,则会引发异常并拒绝文档。必须将新字段显式添加到映射中
meta附加到元字段
normalizer文档归一化器
norms是否禁用评分(在filter和聚合字段上应该禁用)。
null_value为 null 值设置默认值
position_increment_gap用于数组中相邻搜索中的搜索间隙,slop 默认 100 见:代码块 1
properties ★除了mapping还可用于object的属性设置
search_analyzer设置单独的查询时分析器
similarity为字段设置相关度算法,支持:BM25boolean注意:classic(TF-IDF)在 ES 8.x 中已不再支持!
subobjectsES 8 新增,subobjects 设置为 false 的字段的值,其子字段的值不被扩展为对象。
store设置字段是否仅查询
term_vector运维参数,在运维篇会详细讲解。

代码块 1

# slop 默认 100
PUT position_increment_gap_index
{
  "mappings" : {
    "properties" : {
      "title" : {
        "type"   : "text", // slop 默认 100
        "fields" : {
          "slop_0" : {
            "type": "text",
            "position_increment_gap" : 0
          },
          "slop_10" : {
            "type": "text",
            "position_increment_gap" :10
          }
        }
      }
    }
  }
}
# 写入数据
POST /position_increment_gap_index/_doc/1
{
  "title" : ["hello word", "Elastic Go"]
}

# 默认无数据
GET position_increment_gap_index/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "word hello"
      }
    }
  }
}
# slop 配置 100 有数据
GET position_increment_gap_index/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "word elastic",
        "slop": 100
      }
    }
  }
}

# slop_0 默认有数据
GET position_increment_gap_index/_search
{
  "query": {
    "match_phrase": {
      "title.slop_0": {
        "query": "word elastic"
      }
    }
  }
}

# slop_10 需要设置 slop:10以上才有数据
GET position_increment_gap_index/_search
{
  "query": {
    "match_phrase": {
      "title.slop_10": {
        "query": "word elastic",
        "slop": 10
      }
    }
  }
}

5、Text 类型 ★★

当一个字段是要被全文搜索的,比如邮件内容、产品描述等长文本,这些字段应该使用 text 类型。设置 text 类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text 类型的字段不用于排序,很少用于聚合。(解释一下为啥不会为 text 创建正排索引:大量堆空间,尤其是在加载高基数 text 字段时。字段数据一旦加载到堆中,就在该段的生命周期内保持在那里。同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟问题。这就是默认情况下禁用字段数据的原因)

总的来说,text 用于长文本字段,可以说是 ES 体系中最重要也是最常见的数据类型。

注意:

在基础课程中,仅需掌握 text 类型用于哪些应用场景下,以及用法即可,其深层次原理及全文检索相关内容,会在进阶课程中倒排索引的章节中体现。

6、keyword 类型 ★

keyword使用序号映射存储它们的文档值以获得更紧凑的表示。 此映射的工作原理是根据其词典顺序为每个术语分配一个增量整数或*序数。*该字段的文档值仅存储每个文档的序数而不是原始术语,并使用单独的查找结构在序数和术语之间进行转换。

一般用于精确匹配和聚合字段,例如 ID、电子邮件地址、主机名、状态代码、邮政编码或标签。包括范围查找。和 term 查询一起使用频率是最高的。

  • keyword 类型字段不会被分词。
  • keyword 一般用于精确查找或者聚合字段
  • keyword 类型超过阈值长度会直接被丢弃

概括来说,就是用于“不分词”的字段,不需要“模糊检索”的字段,所以常和 term 一起使用,用于精准查询。

GET 

7、Date 类型 ★

时间和日期类型是我们作为开发每天都会遇到的一种常见数据类型。和 Java 中有所不同,Elasticsearch 在索引创建之前并不是必须要创建索引的 mapping。

Elasticsearch 会根据你写入的字段的内容动态去判定字段的数据类型,不过这种自动映射的机制存在一些缺陷,比如在 Elasticsearch 中没有隐式类型转换,所以在自动映射的时候就会把字段映射为较宽的数据类型。比如你写入一个数字 50,系统就会自动给你映射成 long 类型,而不是 int 。一般企业中用于生产的环境都是使用手工映射,能保证按需创建以节省资源和达到更高的性能。

在 Elasticsearch 中,时间类型是一个非常容易踩坑的数据类型,通过一个例子向大家展示这个时间类型的用法和避坑指南

7.1 案例

假如我们有如下索引 tax ,保存了一些公司的纳税或资产信息,单位为“万元”。当然这里面的数据是随意填写的。多少为数据统计的时间,当前这个例子里。索引达的含义并不重要。关键点在于字段的内容格式。我们看到date字段其中包含了多种日期的格式:“yyyy-MM-dd”,“yyyy-MM-dd”还有时间戳。如果按照 dynamic mapping,采取自动映射器来映射索引。我们自然而然的都会感觉字段应该是一个date类型。

POST tax/_bulk
{"index":{}}
{"date": "2021-01-25 10:01:12", "company": "中国烟草", "ratal": 5700000}
{"index":{}}
{"date": "2021-01-25 10:01:13", "company": "华为", "ratal": 4034113.182}
{"index":{}}
{"date": "2021-01-26 10:02:11", "company": "苹果", "ratal": 7784.7252}
{"index":{}}
{"date": "2021-01-26 10:02:15", "company": "小米", "ratal": 185000}
{"index":{}}
{"date": "2021-01-26 10:01:23", "company": "阿里", "ratal": 1072526}
{"index":{}}
{"date": "2021-01-27 10:01:54", "company": "腾讯", "ratal": 6500}
{"index":{}}
{"date": "2021-01-28 10:01:32", "company": "蚂蚁金服", "ratal": 5000}
{"index":{}}
{"date": "2021-01-29 10:01:21", "company": "字节跳动", "ratal": 10000}
{"index":{}}
{"date": "2021-01-30 10:02:07", "company": "中国石油", "ratal": 18302097}
{"index":{}}
{"date": "1648100904", "company": "中国石化", "ratal": 32654722}
{"index":{}}
{"date": "2021-11-1 12:20:00", "company": "国家电网", "ratal": 82950000}

然而我们以上代码查看 tax 索引的 mapping,会惊奇的发现 date 居然是一个 text 类型。

7.2 原理

原因就在于对时间类型的格式的要求是绝对严格的。要求必须是一个标准的 UTC 时间类型。上述字段的数据格式如果想要使用,就必须使用yyyy-MM-ddTHH:mm:ssZ格式(其中T个间隔符,Z代表 0 时区),以下均为错误的时间格式(均无法被自动映射器识别为日期时间类型):

  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd
  • 时间戳

注意:需要注意的是时间说是必须的时间格式,但是需要通过手工映射方式在索引创建之前指定为日期类型,使用自动映射器无法映射为日期类型。

7.3 采用手工映射

如果我们换一个思路,使用手工映射提前指定日期类型,那会又是一个什么结果呢?

PUT tax
{
  "mappings": {
    "properties": {
      "date": {
        "type": "date"
      }
    }
  }
}
POST tax/_bulk
{"index":{}}
{"date": "2021-01-30 10:02:07", "company": "中国石油", "ratal": 18302097}
{"index":{}}
{"date": "1648100904", "company": "中国石化", "ratal": 32654722}
{"index":{}}
{"date": "2021-11-1T12:20:00Z", "company": "国家电网", "ratal": 82950000}
{"index":{}}
{"date": "2021-01-30T10:02:07Z", "company": "中国石油", "ratal": 18302097}
{"index":{}}
{"date": "2021-01-25", "company": "中国烟草", "ratal": 5700000}

执行以上代码,以下为完整的执行结果:

{
  "took" : 17,
  "errors" : true,
  "items" : [
    {
      "index" : {
        "_index" : "tax",
        "_type" : "_doc",
        "_id" : "f4uyun8B1ovRQq6Sn9Qg",
        "status" : 400,
        "error" : {
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [date] of type [date] in document with id 'f4uyun8B1ovRQq6Sn9Qg'. Preview of field's value: '2021-01-30 10:02:07'",
          "caused_by" : {
            "type" : "illegal_argument_exception",
            "reason" : "failed to parse date field [2021-01-30 10:02:07] with format [strict_date_optional_time||epoch_millis]",
            "caused_by" : {
              "type" : "date_time_parse_exception",
              "reason" : "date_time_parse_exception: Failed to parse with all enclosed parsers"
            }
          }
        }
      }
    },
    {
      "index" : {
        "_index" : "tax",
        "_type" : "_doc",
        "_id" : "gIuyun8B1ovRQq6Sn9Qg",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 2,
          "failed" : 0
        },
        "_seq_no" : 3,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "tax",
        "_type" : "_doc",
        "_id" : "gYuyun8B1ovRQq6Sn9Qg",
        "status" : 400,
        "error" : {
          "type" : "mapper_parsing_exception",
          "reason" : "failed to parse field [date] of type [date] in document with id 'gYuyun8B1ovRQq6Sn9Qg'. Preview of field's value: '2021-11-1T12:20:00Z'",
          "caused_by" : {
            "type" : "illegal_argument_exception",
            "reason" : "failed to parse date field [2021-11-1T12:20:00Z] with format [strict_date_optional_time||epoch_millis]",
            "caused_by" : {
              "type" : "date_time_parse_exception",
              "reason" : "date_time_parse_exception: Failed to parse with all enclosed parsers"
            }
          }
        }
      }
    },
    {
      "index" : {
        "_index" : "tax",
        "_type" : "_doc",
        "_id" : "gouyun8B1ovRQq6Sn9Qg",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 2,
          "failed" : 0
        },
        "_seq_no" : 4,
        "_primary_term" : 1,
        "status" : 201
      }
    },
    {
      "index" : {
        "_index" : "tax",
        "_type" : "_doc",
        "_id" : "g4uyun8B1ovRQq6Sn9Qg",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 2,
          "failed" : 0
        },
        "_seq_no" : 5,
        "_primary_term" : 1,
        "status" : 201
      }
    }
  ]
}

分析结果:

  • 第一个(写入失败):2021-01-30 10:02:07
  • 第二个(写入成功):1648100904
  • 第三个(写入失败):2021-11-1T12:20:00Z
  • 第四个(写入成功):2021-01-30T10:02:07Z
  • 第五个(写入成功):2021-01-25

7.4 总结

  • 对于yyyy-MM-dd HH:mm:ss2021-11-1T12:20:00Z,ES 的自动映射器完全无法识别,即便是事先声明日期类型,数据强行写入也会失败。
  • 对于时间戳和yyyy-MM-dd这样的时间格式,ES 自动映射器无法识别,但是如果事先说明了日期类型是可以正常写入的。
  • 对于标准的日期时间类型是可以正常自动识别为日期类型,并且也可以通过手工映射来实现声明字段类型。

7.5 解决方案

其实解决办法非常简单。只需要在字段属性中添加一个参数:“format”: “yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis”,这样就可以避免因为数据格式不统一而导致数据无法写入的窘境。

代码如下:

PUT test_index
{
  "mappings": {
    "properties": {
      "time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

8、Nested 类型 ★

由于前置知识所限,本章将不再对 Nested 进行深入的讲解,扩展学习请参考以下文章讲解。

参考:ES 中 Nested 类型的用法及原理

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

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

相关文章

电子产品量产工具项目开发中遇到的问题(更新......)

1、找不到tslib.h库的头文件 这是因为找不到tslib库的头文件。 确定工具链中头文件、库文件目录&#xff0c;对于 IMX6ULL &#xff0c;命令如下 echo main(){}| arm-linux-gnueabihf-gcc -E -v -找到了编译器arm-linux-gnueabihf的include和lib文件夹 /usr/local/arm/gcc-l…

AT155 高压绝缘电阻测试仪 都有哪些功能?

、 高压绝缘电阻测试仪是—款手持式仪表主要用来测量交流&#xff0f;直流电压、 电阻、 短路蜂鸣测试和 绝缘电阻测量。 式高压绝缘电阻测试仪具有4个量程用千绝缘电阻、 AC/DC电压、 电阻和短路蜂鸣测试。 设计达到以下安全标准 &#xff0e;绝缘测试量程O.lMn to 60Gn。…

机器学习 决策树基础 ID3、C4.5、CART

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比划分策略ID3定义举例计算各属性的信息增益选取最优属性作划分对子节点作递归划分生成结果ID3的缺点C4.5信息增益率优化缺点CARTCART相较于前两者…

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示&#xff1a; MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期&#xff0c;单位为毫秒UINT uResolution, // 定时事件的精度&#xff0c;单位…

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁&#xff1a; 推荐网站 mysql学习网站&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/ 算法&#xff1a;https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了&#xff0c;说实话&#xff0c;我之前是一场球都没有&#xff0c;对足球知道也甚少&#xff0c;妥妥一个假球迷了。这次世界杯感觉离自己特别近&#xff0c;身边的很多朋友都在看&#xff0c;也不乏赌球的小伙伴&#xff0c;自己的感悟也比较深&a…

电机定子模态的空间特征

对于电机定子模态而言&#xff0c;通常不是按传统的阶次顺序&#xff08;按频率从小到大&#xff09;来描述它们&#xff0c;而是按空间节点数的顺序来描述&#xff0c;这在很大程度上是因为受激励的电磁力波的振型的影响。 1、传统模态阶次表示方式 传统模态阶次的顺序都是按…

安卓期末大作业——个人简历APP源码和设计报告

Android课程需求文档 设计题目&#xff1a; 个人简历APP 学生姓名&#xff1a; 学号&#xff1a; 1&#xff0e;Smart.apk功能设计说明 Android真机运行进入该app。背景音乐服务播放正常&#xff0c;并设置可通过右上角按钮关闭musicservice&#xff1b; 1通过viewpager实…

Jenkins+SonarQube 代码质量检测详解

一、SonarQube 概述 1、SonarQube 简介 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube通过插件机制,Sonar可以集成不同的测试工具,代码分析工具…

【JavaWeb开发-Servlet】将项目打包部署在本地

Servlet与JSP进阶十&#xff1a;Web应用程序打包与发布&#xff08;war包&#xff09;_小枯林的博客-CSDN博客_servlet项目如何打成war包本篇博客主要内容是&#xff1a; ●如何使用Eclipse打war包&#xff1b; ●打好的war包如何发布&#xff1b;访问演示&#xff1b; ●解决u…

如何使用ChatGPT辅助AI绘画?

如何使用ChatGPT辅助AI绘画&#xff1f; AI自动化内容生成&#xff08;AIGC&#xff09;是一种利用人工智能技术生成新内容的方法。它可以快速、自动、准确地从大量原始数据中生成新内容&#xff0c;大大提高了内容创作效率。AIGC 使用机器学习算法&#xff0c;自动识别文本特…

【MySQL】触发器

目录 概述 操作-创建触发器 操作-NEW与OLD 其他操作 注意事项 概述 介绍 触发器&#xff0c;就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据 库服务器上的SQL片段&#xff0c;但是触发器无需调用&#xff0c;当对数据库表中的数据执…

微信小程序|前端技术主要框架分析

1.框架 微信提供了一套自己的用于开发小程序的前端框架,和目前主流的前端框架相比,其既有类似的地方,也有特殊的地方。 特殊的地方在于其只能在微信小程序开发工具内使用,并做了相对严格的使用和配置限制,开发者必须按照其规定的用法来使用。一些外部的框架和插件在小程…

apis-day7综合案例

apis-day7综合案例-小兔鲜案例注册 需求①&#xff1a; 发送验证码 用户点击之后&#xff0c;显示 05秒后重新获取 时间到了&#xff0c;自动改为 重新获取 需求②&#xff1a; 用户名验证&#xff08;注意封装函数 verifyxxx&#xff09; 正则 /1{6,10}$/ 如果不符合要求…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.3 使用Go 语言的项目第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目 Go语言在2009年首次公开发布后受到越来越多的开发者的关注&#xff0c;Go语言社区不断壮大&#xff0c;开源…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Task Tips

文章目录一、深度学习步骤回顾二、常规指导三、训练过程中Loss很大3.1 原因1&#xff1a;模型过于简单3.2 原因2&#xff1a;优化得不好3.3 原因1 or 原因2 &#xff1f;四、训练过程Loss小。测试过程Loss大4.1 原因1&#xff1a;过拟合 Overfitting4.2 原因2&#xff1a;Misma…

windows 10 HBase保姆级安装教程

安装HDFS 将下载好的hadoop-2.6.5.zip解压到自己的磁盘文件&#xff0c;将解压后的文件夹hadoop-2.6.5重命名为hadoop&#xff1b; 解压hadoopbin.zip&#xff0c;将解压后的文件夹打开&#xff0c;里面的文件复制到上一步的hadoop文件夹下的bin文件&#xff0c;直接覆盖同名文…

蓝牙模块HC-05使用指南

概述 HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备。该模块基于BC417单芯片蓝牙IC&#xff0c;符合蓝牙v2.0标准&#xff0c;支持UART和USB接口。 具有两种工作模式&#xff1a;命令响应工作模式和自动连接工作模式。 当模块处于命令响应工作模式&#xff08;或者AT模…

文件传输利器Croc

概述 一般而言&#xff0c;Linux系统是没有用户界面的&#xff0c;所有操作都是在命令行里。 然后在安装搭建集群&#xff0c;如分布式的Hadoop集群时&#xff0c;经常需要在多个Server之间传输文件。两个server之间的文件传输&#xff0c;一般会想到FTP或SSH两种方式。使用F…

监控系列(二)Dem对接Prometheus+grafana显示

一、概括 本篇不涉及达梦数据库搭建以及Dem的搭建&#xff0c;操作环境需提前准备prometheus以及grafana的搭建&#xff0c;请跳转到前文查看整体的对接流程如图所示 二、Dem对接prometheus 前提 需确保当前Dem&#xff0c;已有集群纳入监管 配置Dem的监控机器数据指标 prome…