elasticsearch-8.5.2快速入门和kibana-8.5.2的使用

news2025/3/11 8:56:46

一、 安装

官方安装Elasticsearch,和ES可视化工具kibana。安装下载过程略。

二、 启动Elasticsearch。

windows系统,直接进入到如图目录,然后启动elasticsearch.bat,这个就是ES服务。
在这里插入图片描述
启动后,我们可以访问https://127.0.0.1:9200/来查看 ES是否 启动 成功。

浏览器启动后,提示输入账号密码。
在这里插入图片描述
在安装的elasticsearch-8.5.2\bin 目录下,启动cmd命令,输入以下指令获取账号密码。
elasticsearch-reset-password -u elastic
输入完后出现如图,[用户名]和密码。
在这里插入图片描述
然后输入到浏览器中,就OK了。
出现该界面,表示ES启动成功。
在这里插入图片描述

三、 启动kibana。

进入到如图目录。点击kibana.bat
在这里插入图片描述
等待服务启动。
启动 完成后,访问如下地址:http://localhost:5601/
他会提示你配置token令牌。
进入如图目录elasticsearch-8.5.2\bin,执行一下命令获取令牌。
elasticsearch-create-enrollment-token.bat --scope kibana

在这里插入图片描述
然后进行配置即可。

配置完成后,会看到如图界面。
在这里插入图片描述
依次点击,就可以打开通信工具,按照ES的接口风格来和ES进行通信。

三、 Elasticsearch的基本使用。

ES是通过创建索引,去管理文档的。

1.创建文档。

ES中的文档就相当于面向对象中的对象,文档格式就是Json类型。
打开kibana找到Dev Tools,我们来使用PUT创建第一条数据。

//添加数据
PUT /megacorp/_doc/1
{

    "first_name" : "JC",

    "last_name" :  "W",

    "age" :        25,

    "about" :      "I love to go swiming!",

    "interests": [ "sports", "music" ]

}

在这里插入图片描述
数据写完后,点击这个小三角形,即发生请求。
请求完,我们可以看到右边的返回结果。

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

"successful": 1表示创建成功。

2.查询刚刚创建的文档。

//获取指定ID数据
GET /megacorp/_doc/1  

//获取所有数据,默认返回10条
GET /megacorp/_search

//尝试下搜索姓氏为 ``Smith`` 的雇员
GET /megacorp/_search?q=last_name:Smith

以上都是轻量搜索,Query-string 搜索通过命令非常方便地进行临时性的即席搜索 ,但它有自身的局限性.。
Elasticsearch 提供一个丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。

3.使用查询表达式搜索

查询last_name为w的人。

//表达式查询
GET /megacorp/_search
{
  "query" : 
  {
    "match": {
      "last_name": "w"
    }
    
  }
  
}

返回结果:

{
  "took": 890,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.2039728,
    "hits": [
      {
        "_index": "megacorp",
        "_id": "1",
        "_score": 1.2039728,
        "_source": {
          "first_name": "JC",
          "last_name": "W",
          "age": 25,
          "about": "I love to go swiming!",
          "interests": [
            "sports",
            "music"
          ]
        }
      }
    ]
  }
}

hits.value代表查询了几条数据,hits数组是数据源。

查询 "last_name": "w"并且 年龄大于20

get /megacorp/_search 
{
  "query" : {
    "bool": {
      "must": [
        {
          "match": {
          "last_name": "w"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 20
            }
          }
          
        }
      ]
    }
    
  }
  
}

这部分是一个 range 过滤器 , 它能找到年龄大于 20 的文档,其中 gt 表示_大于_。

4.全文搜索

搜索下所有喜欢攀岩(rock climbing)的员工:

//全文 搜索 

GET /megacorp/_search  
{
  "query":{
    "match": {
      "about": "rock climbing"
    }
    
  }
  
}

返回结果:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.9032972,
    "hits": [
      {
        "_index": "megacorp",
        "_id": "5",
        "_score": 1.9032972,
        "_source": {
          "first_name": "John",
          "last_name": "Smith 1",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      },
      {
        "_index": "megacorp",
        "_id": "6",
        "_score": 0.6682933,
        "_source": {
          "first_name": "Jane",
          "last_name": "Smith 2",
          "age": 32,
          "about": "I like to collect rock albums",
          "interests": [
            "music"
          ]
        }
      }
    ]
  }
}

Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。第一个最高得分的结果很明显:John Smith 的 about 属性清楚地写着 “rock climbing” 。
但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about 属性里提到了 “rock” 。因为只有 “rock” 而没有 “climbing” ,所以她的相关性得分低于 John 的。
这是一个很好的案例,阐明了 Elasticsearch 如何 在 全文属性上搜索并返回相关性最强的结果。

5.短语搜索

查询,仅匹配同时包含 “rock” 和 “climbing” ,并且 二者以短语 “rock climbing” 的员工记录。
为此对 match 查询稍作调整,使用一个叫做 match_phrase 的查询:

GET /megacorp/_search
{
  "query":{
    "match_phrase": {
      "about": "rock climbing"
    }
    
  }
  
}

返回结果:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 2.4450343,
    "hits": [
      {
        "_index": "megacorp",
        "_id": "5",
        "_score": 2.4450343,
        "_source": {
          "first_name": "John",
          "last_name": "Smith 1",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        }
      }
    ]
  }
}

可以看到只返回了包含rock climbing的数据。

6.高亮搜索

//高亮搜索

GET /megacorp/_search 
{
  "query":{
    "match_phrase": {
      "about": "rock climbing"
    }
    
  },
  "highlight":{
    "fields": {
      "about":{}
    }
    
  }
  
}

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:

{
  "took": 593,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 2.4450343,
    "hits": [
      {
        "_index": "megacorp",
        "_id": "5",
        "_score": 2.4450343,
        "_source": {
          "first_name": "John",
          "last_name": "Smith 1",
          "age": 25,
          "about": "I love to go rock climbing",
          "interests": [
            "sports",
            "music"
          ]
        },
        "highlight": {
          "about": [
            "I love to go <em>rock</em> <em>climbing</em>"
          ]
        }
      }
    ]
  }
}

7.数据聚合分析

Elasticsearch 有一个功能叫聚合(aggregations),允许我们基于数据生成一些精细的分析结果。聚合与 SQL 中的 GROUP BY 类似但更强大。

Elasticsearch 5.x版本以后,对排序和聚合等操作,用单独的数据结构(fielddata)缓存到内存里了,默认是不开启的,需要单独开启。
对对应字段执行聚合操作之前需要先开启fielddata

//添加fielddata
PUT megacorp/_mapping
{
  "properties":{
    
    "interests":{
      "type":"text",
      "fielddata":true
      
    }
    
  }
  
}

fielddata开启后,我们再来使用聚合操作。

挖掘出员工中最受欢迎的兴趣爱好:

//聚合分析
GET /megacorp/_search?pretty
{

  "aggs": {

    "all_interests": {

      "terms": { "field": "interests" }

    }

  }

}

聚合结果:

 "aggregations": {
    "all_interests": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "music",
          "doc_count": 4
        },
        {
          "key": "sports",
          "doc_count": 3
        },
        {
          "key": "forestry",
          "doc_count": 1
        },
        {
          "key": "games",
          "doc_count": 1
        },
        {
          "key": "play",
          "doc_count": 1
        },
        {
          "key": "sing",
          "doc_count": 1
        }
      ]
    }
  }

可以看到,四位员工对音乐感兴趣,一位对林业感兴趣,三位对运动感兴趣…。这些聚合的结果数据并非预先统计,而是根据匹配当前查询的文档即时生成的。如果想知道叫 Smith 的员工中最受欢迎的兴趣爱好,可以直接构造一个组合查询:

//构造某个姓氏的兴趣爱好统计
GET megacorp/_search
{
  "query":{
    "match": {
      "last_name": "Smith"
    }
    
  },
  "aggs":
  {
    "all_interests":
    {
      "terms": {
        "field": "interests",
        "size": 10
      }
      
    }
    
  }
  
}

结果:

 "aggregations": {
    "all_interests": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "music",
          "doc_count": 3
        },
        {
          "key": "sports",
          "doc_count": 2
        }
      ]
    }
  }

聚合还支持分级汇总 。比如,查询特定兴趣爱好员工的平均年龄:

//查询特定爱好员工的平均年龄
GET /megacorp/_search
{

    "aggs" : {

        "all_interests" : {

            "terms" : { "field" : "interests" },

            "aggs" : {

                "avg_age" : {

                    "avg" : { "field" : "age" }

                }

            }

        }

    }

}

结果:

 "aggregations": {
    "all_interests": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "music",
          "doc_count": 4,
          "avg_age": {
            "value": 26.75
          }
        },
        {
          "key": "sports",
          "doc_count": 3,
          "avg_age": {
            "value": 25
          }
        },
        {
          "key": "forestry",
          "doc_count": 1,
          "avg_age": {
            "value": 35
          }
        },
        {
          "key": "games",
          "doc_count": 1,
          "avg_age": {
            "value": 33
          }
        },
        {
          "key": "play",
          "doc_count": 1,
          "avg_age": {
            "value": 33
          }
        },
        {
          "key": "sing",
          "doc_count": 1,
          "avg_age": {
            "value": 33
          }
        }
      ]
    }
  }

四、 Elasticsearch集群。

1.了解集群。

一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。

作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。

2.集群健康。

Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status 字段中展示为 greenyellow 或者 red

//查看集群健康状态
GET /_cluster/health

返回结果:

{
  "cluster_name": "elasticsearch",
  "status": "yellow",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 12,
  "active_shards": 12,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 1,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 92.3076923076923
}

status 字段是我们最关心的。

status 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:

green

所有的主分片和副本分片都正常运行。
yellow

所有的主分片都正常运行,但不是所有的副本分片都正常运行。
red
有主分片没能正常运行

3.添加索引。

我们往 Elasticsearch 添加数据时需要用到 索引 —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。

我们只需知道一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。

让我们在包含一个空节点的集群内创建名为 blogs 的索引。 索引在默认情况下会被分配5个主分片。

//设置节点中分片数量 。表示设置了5个主分片,每个分配有一个备份。
PUT /blogs
{
  "settings":
  {
    "number_of_shards":5,
    "number_of_replicas":1
    
  }
  
}

简而言之,数据都存放在shard中,每个node可以自己设置shard数量,shard分为primary shardreplicas shard replicas shard是primary shard的备份,并且同一个primary shardreplicas shard 不能放在同一个节点中,例如:P_A ,R_A不能在一个节点。但是P_A,R_B可以在同一个节点。如果相同数据和备份都在一个节点,那该节点如果宕机了,所有数据就会丢失。

4.水平扩容

主分片的数目在索引创建时就已经确定了下来。实际上,这个数目定义了这个索引能够 存储 的最大数据量。(实际大小取决于你的数据、硬件和使用场景。) 但是,读操作——搜索和返回数据——可以同时被主分片 或 副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群。让我们把副本数从默认的 1 增加到 2 :

PUT /blogs/_settings
{
   "number_of_replicas" : 2
}

在这里插入图片描述

blogs 索引现在拥有9个分片:3个主分片和6个副本分片。 这意味着我们可以将集群扩容到9个节点,每个节点上一个分片。相比原来3个节点时,集群搜索性能可以提升 3 倍。

5.Autogenerating IDs

如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID 。 请求的结构调整为: 不再使用 PUT 谓词, 而是使用 POST 谓词

POST /website/_doc
{
  "title":"My second blog entry",
  "text":"still trying this out ...",
  "date":"2022-01-01"
  
}

post后会自动生成一个GUID

{
  "_index": "website",
  "_id": "03HF8IQBM50g06X4YHbb",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

6.文档的取回

取出刚刚创建的文档

get /website/_doc/03HF8IQBM50g06X4YHbb

返回 文档的一部分

//请求某个文档中的某个字段
GET /website/_doc/03HF8IQBM50g06X4YHbb?_source=title,text

7.检查文档是否存在

如果只想检查一个文档是否存在–根本不想关心内容—​那么用 HEAD 方法来代替 GET 方法。 HEAD 请求没有返回体,只返回一个 HTTP 请求报头:

//检查 文档 是否 存在 
HEAD /website/_doc/123

8.更新整个文档

在 Elasticsearch 中文档是 不可改变 的,不能修改它们。相反,如果想要更新现有的文档,需要 重建索引 或者进行替换。

//修改文档数据
PUT /website/_doc/123
{
  
    "title": "My second blog entry",
    "text": "still trying this out ...",
    "date": "2022-01-11"
}

9.创建新文档

方式1

POST /website/_doc/
{
  "title":"My second blog entry",
  "text":"still trying this out ...",
  "date":"2022-01-01"
  
}

然而,如果已经有自己的 _id ,那么我们必须告诉 Elasticsearch ,只有在相同的 _index 、 _type 和 _id 不存在时才接受我们的索引请求。这里有两种方式,他们做的实际是相同的事情。使用哪种,取决于哪种使用起来更方便。
第一种方法使用 op_type 查询-字符串参数:

//ID不存在时候才创建
PUT /website/_doc/1234?op_type=create
{
  
    "title": "My second blog entry",
    "text": "still trying this out ...",
    "date": "2022-01-11"
}

返回结果

{
  "error": {
    "type": "version_conflict_engine_exception",
    "reason": "[1234]: version conflict, document already exists (current version [2])",
    "index_uuid": "Dhq2F9QCR3G1DSWLM7niVA",
    "shard": "0",
    "index": "website"
  },
  "status": 409
}

返回409表示该ID已经存在。无法创建。

第二种方法是在 URL 末端使用 /_create :

PUT /website/_create/1
{
  
    "title": "My second blog entry",
    "text": "still trying this out ...",
    "date": "2022-01-11"
}

10. 删除文档

删除文档的语法和我们所知道的规则相同,只是使用 DELETE 方法:

//删除指定ID文档
DELETE /website/_doc/1

如果找到该文档,Elasticsearch 将要返回一个 200 ok 的 HTTP 响应码,和一个类似以下结构的响应体。注意,字段 _version 值已经增加:

{
  "found" :    true,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 2
}

如果文档没有找到,我们将得到 404 Not Found 的响应码和类似这样的响应体:

{
  "found" :    false,
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 4
}

即使文档不存在( Foundfalse ), _version 值仍然会增加。这是 Elasticsearch 内部记录本的一部分,用来确保这些改变在跨多节点时以正确的顺序执行。

参考:ES文档。

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

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

相关文章

#438 沸腾客厅:从数字藏品到Web3.0,不止于事件营销

点击文末“阅读原文”即可收听本期节目数字藏品是什么&#xff1f;数字藏品是指使用区块链技术&#xff0c;对应特定的作品、艺术品生成的唯一数字凭证&#xff0c;在保护其数字版权的基础上&#xff0c;实现真实可信的数字化发行、购买、收藏和使用。2022年是天津文化中心成立…

「Redis」10 三大缓存问题、分布式锁

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——三大缓存问题、分布式锁 1. 三大缓存 缓存穿透 问题描述 key 对应的数据在数据源并不存在&#xff0c;每次针对此 key 的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。 …

Java入门教程(27)——重写和final关键字

文章目录1.重写(override)2.final关键字实例1&#xff1a;修饰变量实例2.修饰方法实例3.修饰类1.重写(override) 什么是重写呢&#xff0c;顾名思义&#xff0c;子类重写父类的方法&#xff0c;可以用自身行为替换父类行为。方法重写需要符合的条件&#xff1a; 方法名、形参列…

【Linux】静动态库的制作和使用

前言 好久不见&#xff0c;甚是想念~ 本篇文章具体以操作为主&#xff0c;介绍在Linux下如何打包动静态库&#xff0c;并且如何使用这些库&#xff0c;同时&#xff0c;简单的阐述一下原理。让我们开始吧~ 上一篇Linux文章传送地址~ 【Linux】基础IO的理解与操作 - fd_柒海啦的…

复合材料专场 | ABAQUS车载四型复合材料气瓶固化过程的数值模拟分析攻略

复合材料气瓶固化的热场本质上可以认为包含两个阶段&#xff0c;复合材料气瓶表面和周围通过与空气的热对流换热&#xff0c;复合材料与内部塑料芯模以及金属接头的传热。在第一个阶段整体温度较低&#xff0c;热量从表面向复合材料层内部流入&#xff0c;此时固化速率很低&…

Python使用Opencv图像处理方法完成手势识别(三)tkinter制作GUI界面

前面对手势识别已经差不多完成。 这一章来制作一个手势识别GUI界面和说一下精确度不够问题所在。 首先是精确度不够的问题&#xff1a; 让手势更规范&#xff0c;手掌张开点。首先应该调节Hsv阈值&#xff0c;因为手掌和环境颜色与我的可能有差异。调整面积&#xff0c;周长阈…

ADI Blackfin DSP处理器-BF533的开发详解7:SPI接口的驱动和应用(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 接口功能介绍 SPI 接口是 4 线串口&#xff0c;可以连接 SPIFLASH&#xff0c;SPI 接口的 AD&#xff0c;DA 等等。ADSP-BF533 的 SPI 接口支持主…

【Python合集系列】爬虫有什么用,网友纷纷给出自己的答案,王老师,我..我想学那个..爬虫。可以嘛?“(代码免费分享)

导语 Hello&#xff0c;大家好呀&#xff01;我是木木子吖&#xff5e; 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ &#xff08;哇哇哇 这真的爱&#x1f60d;&#x1f60d;&#xff09; 生活中总有些东西值得爬一爬 爬虫…

Java 内存模型之 JMM

—— 计算机存储结构 计算机存储结构&#xff0c;从本地磁盘到主存到 CPU 缓存&#xff0c;也就是硬盘到内存&#xff0c;到CPU&#xff0c;一般对应的程序的操作就是从数据库到内存然后到CPU进行计算CPU拥有多级缓存&#xff0c;&#xff08;CPU和物理主内存的速度不一致&…

群集搭建【LNMP+负载均衡+高可用+跳板机】

目录 项目需求 LNMP部署 web1部署 mysql部署 php部署 nfs部署 LNMP测试 负载均衡与高可用 web2部署 lb1部署 lb2部署 验证群集 跳板机功能 测试跳板机 项目需求 实验目标&#xff1a;根据拓扑图搭建环境&#xff0c;安装论坛&#xff0c;创建证书通过https访问&#xff0c;实现…

一文搞懂 Nginx

文章目录一、前言二、NGINX 指令与上下文2.1 指令2.2 上下文三、NGINX 静态文件处理3.1 静态文件配置3.2 静态文件类型处理四、NGINX 动态路由4.1 Location 匹配4.1.1 前缀匹配4.1.2 精准匹配4.1.3 正则匹配4.1.4 优先前缀匹配4.2 Location 匹配优先级4.2.1 匹配优先级对比4.2.…

学好selenium工具,能实现你想得到的所有事情

文章目录一、介绍背景二、开发与实现2.1、部署开发环境2.2、开始码代码<demo只为提供思路>2.3、思路分析2.4、难点解析三、总结一、介绍背景 情况是这样的&#xff1a;某段时间之前&#xff0c;开发想找我用ui自动化帮他们实现一个功能&#xff1a;在系统某些时候生成报告…

[附源码]计算机毕业设计大学生心理健康测评系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

零基础CSS入门教程(17)——内边距

本章目录1.任务目标2.默认情况3.有内边距4.小结1.任务目标 上一篇介绍了外边距&#xff0c;也就是元素跟相邻元素的距离。 本篇来介绍内边距&#xff0c;顾名思义&#xff0c;内边距是指的元素内部的内容&#xff0c;与元素的边的距离 2.默认情况 <!DOCTYPE html> <…

Velero 系列文章(一):基础

概述 Velero 是一个开源工具&#xff0c;可以安全地备份和还原&#xff0c;执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。 灾难恢复 Velero 可以在基础架构丢失&#xff0c;数据损坏和/或服务中断的情况下&#xff0c;减少恢复时间。 数据迁移 Velero 通过轻松地将 …

使用VictoriaMetrics 对Prometheus的数据进行分布式存储

前言 Prometheus 就是一个很好的时序数据库&#xff0c;对于监控数据量没有超过千万级的 情况下没必要进行分布式存储。一般的监控数据存3个月以内即可&#xff0c;所以数据量并不会很大。 并且生产环境可以搞多个Proms数据源在Grafana中做统一的告警。并且在时序数据库的排名…

windows安装minikube

由于学习的需要&#xff0c;需要在windows上搭建一套可以使用的k8s学习用&#xff0c;最后选择了minikube这个安装k8s&#xff0c;本博客介绍了minikube的安装步骤&#xff0c;详细命令以及截图 1、首先是本机windows安装docker&#xff0c;具体可以参考这个 win10安装docker…

奥曲肽-葡聚糖-亲和索的偶联物TOC-Dx40-Av)|紫杉醇-DHA-右旋糖酐偶联聚合物

中文名称&#xff1a;奥曲肽-葡聚糖-亲和索的偶联物 英文名称&#xff1a;TOC-Dx40-Av 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装 溶解性&#xff1a;溶于大部分有机溶剂&#xff0…

GC 算法总结_java培训

1.标记清除压缩(Mark-Sweep-Compact) 标记清除、标记压缩的结合使用 原理java培训GC 算法总结 2.算法总结 内存效率&#xff1a;复制算法>标记清除算法>标记整理算法&#xff08;此处的效率只是简单的对比时间复杂度&#xff0c;实际情况不一定如此&#xff09;。 内…

城市云灾备,为业务连续性保驾护航

摘要&#xff1a;华为云作为中国政务云基础设施领域领导者&#xff0c;基于华为公有云技术架构的政务云平台&#xff0c;具备领先的云灾备技术实力&#xff0c;支持IaaS、PaaS等云服务云原生灾备能力。本文分享自华为云社区《城市云灾备&#xff0c;为业务连续性保驾护航》&…