update docs

pull/13/head
dunwu 2022-01-08 20:37:29 +08:00
parent 626d76398c
commit 023e01ec41
9 changed files with 401 additions and 63 deletions

View File

@ -5,7 +5,7 @@ language: node_js
sudo: required sudo: required
node_js: stable node_js: '16.13.0'
branches: branches:
only: only:

View File

@ -75,7 +75,7 @@
- [Elasticsearch 面试总结](docs/nosql/elasticsearch/elasticsearch-interview.md) 💯 - [Elasticsearch 面试总结](docs/nosql/elasticsearch/elasticsearch-interview.md) 💯
- [ElasticSearch 应用指南](docs/nosql/elasticsearch/elasticsearch-quickstart.md) - [ElasticSearch 应用指南](docs/nosql/elasticsearch/elasticsearch-quickstart.md)
- [ElasticSearch API](docs/nosql/elasticsearch/elasticsearch-api.md) - [ElasticSearch API](docs/nosql/elasticsearch/ElasticSearchRestApi.md)
- [ElasticSearch 运维](docs/nosql/elasticsearch/elasticsearch-ops.md) - [ElasticSearch 运维](docs/nosql/elasticsearch/elasticsearch-ops.md)
#### HBase #### HBase

View File

@ -74,7 +74,7 @@ footer: CC-BY-SA-4.0 Licensed | Copyright © 2018-Now Dunwu
- [Elasticsearch 面试总结](nosql/elasticsearch/elasticsearch-interview.md) 💯 - [Elasticsearch 面试总结](nosql/elasticsearch/elasticsearch-interview.md) 💯
- [ElasticSearch 应用指南](nosql/elasticsearch/elasticsearch-quickstart.md) - [ElasticSearch 应用指南](nosql/elasticsearch/elasticsearch-quickstart.md)
- [ElasticSearch API](nosql/elasticsearch/elasticsearch-api.md) - [ElasticSearch API](nosql/elasticsearch/ElasticSearchRestApi.md)
- [ElasticSearch 运维](nosql/elasticsearch/elasticsearch-ops.md) - [ElasticSearch 运维](nosql/elasticsearch/elasticsearch-ops.md)
#### HBase #### HBase

View File

@ -1,4 +1,4 @@
# Elasticsearch API # ElasticSearch Rest API
> **[Elasticsearch](https://github.com/elastic/elasticsearch) 是一个分布式、RESTful 风格的搜索和数据分析引擎**,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 > **[Elasticsearch](https://github.com/elastic/elasticsearch) 是一个分布式、RESTful 风格的搜索和数据分析引擎**,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
> >
@ -6,17 +6,17 @@
> >
> _以下简称 ES_ > _以下简称 ES_
## 一、REST API
> REST API 最详尽的文档应该参考:[ES 官方 REST API](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) > REST API 最详尽的文档应该参考:[ES 官方 REST API](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html)
### 索引 ## 索引 API
> 参考资料:[Elasticsearch 官方之 cat 索引 API](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-indices.html)
### 创建索引
新建 Index可以直接向 ES 服务器发出 `PUT` 请求。 新建 Index可以直接向 ES 服务器发出 `PUT` 请求。
#### 创建索引 1直接创建索引
示例:直接创建索引
```bash ```bash
curl -X POST 'localhost:9200/user' curl -X POST 'localhost:9200/user'
@ -28,7 +28,23 @@ curl -X POST 'localhost:9200/user'
{"acknowledged":true,"shards_acknowledged":true,"index":"user"} {"acknowledged":true,"shards_acknowledged":true,"index":"user"}
``` ```
示例:创建索引时指定配置 2创建索引时指定配置
语法格式:
```bash
$ curl -X PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}
```
示例:
```bash ```bash
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user' -d ' $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user' -d '
@ -42,21 +58,13 @@ $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user' -d '
}' }'
``` ```
示例:创建索引时指定 `mappings` 如果你想禁止自动创建索引,可以通过在 `config/elasticsearch.yml` 的每个节点下添加下面的配置:
```bash ```js
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user' -d ' action.auto_create_index: false
{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}'
``` ```
#### 删除索引 ### 删除索引
然后,我们可以通过发送 `DELETE` 请求,删除这个 Index。 然后,我们可以通过发送 `DELETE` 请求,删除这个 Index。
@ -64,55 +72,58 @@ $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user' -d '
curl -X DELETE 'localhost:9200/user' curl -X DELETE 'localhost:9200/user'
``` ```
#### 查看索引 删除多个索引
```js
DELETE /index_one,index_two
DELETE /index_*
```
### 查看索引
可以通过 GET 请求查看索引信息 可以通过 GET 请求查看索引信息
```bash ```bash
# 查看索引相关信息 # 查看索引相关信息
curl -X GET 'localhost:9200/user' GET kibana_sample_data_ecommerce
#查看索引的文档总数 # 查看索引的文档总数
CURL -X 'localhost:9200/user/_count' GET kibana_sample_data_ecommerce/_count
#查看前10条文档了解文档格式 # 查看前10条文档了解文档格式
POST user/_search GET kibana_sample_data_ecommerce/_search
{
}
#_cat indices API # _cat indices API
#查看indices # 查看indices
CURL -X /_cat/indices/kibana*?v&s=index GET /_cat/indices/kibana*?v&s=index
#查看状态为绿的索引 # 查看状态为绿的索引
CURL -X /_cat/indices?v&health=green GET /_cat/indices?v&health=green
#按照文档个数排序 # 按照文档个数排序
CURL -X /_cat/indices?v&s=docs.count:desc GET /_cat/indices?v&s=docs.count:desc
#查看具体的字段 # 查看具体的字段
CURL -X /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
#How much memory is used per index? # 查看索引占用的内存
CURL -X /_cat/indices?v&h=i,tm&s=tm:desc GET /_cat/indices?v&h=i,tm&s=tm:desc
``` ```
#### 打开/关闭索引 ### 打开/关闭索引
通过在 `POST` 中添加 `_close``_open` 可以打开、关闭索引。 通过在 `POST` 中添加 `_close``_open` 可以打开、关闭索引。
关闭索引
```bash
curl -X POST 'localhost:9200/user/_close'
```
打开索引 打开索引
```bash ```bash
curl -X POST 'localhost:9200/user/_open' # 打开索引
POST kibana_sample_data_ecommerce/_open
# 关闭索引
POST kibana_sample_data_ecommerce/_close
``` ```
### 文档 ## 文档
#### 新增记录 #### 新增记录
@ -372,9 +383,92 @@ $ curl -H 'Content-Type: application/json' 'localhost:9200/user/admin/_search?pr
}' }'
``` ```
## 二、Java API ## 集群 API
TODO待补充... > [Elasticsearch 官方之 Cluster API](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster.html)
一些集群级别的 API 可能会在节点的子集上运行,这些节点可以用节点过滤器指定。例如,任务管理、节点统计和节点信息 API 都可以报告来自一组过滤节点而不是所有节点的结果。
节点过滤器以逗号分隔的单个过滤器列表的形式编写,每个过滤器从所选子集中添加或删除节点。每个过滤器可以是以下之一:
- `_all`:将所有节点添加到子集
- `_local`:将本地节点添加到子集
- `_master`:将当前主节点添加到子集
- 根据节点ID或节点名将匹配节点添加到子集
- 根据IP地址或主机名将匹配节点添加到子集
- 使用通配符,将节点名、地址名或主机名匹配的节点添加到子集
- `master:true`, `data:true`, `ingest:true`, `voting_only:true`, `ml:true``coordinating_only:true`, 分别意味着将所有主节点、所有数据节点、所有摄取节点、所有仅投票节点、所有机器学习节点和所有协调节点添加到子集中。
- `master:false`, `data:false`, `ingest:false`, `voting_only:true`, `ml:false``coordinating_only:false`, 分别意味着将所有主节点、所有数据节点、所有摄取节点、所有仅投票节点、所有机器学习节点和所有协调节点排除在子集外。
- 配对模式,使用 `*` 通配符,格式为 `attrname:attrvalue`,将所有具有自定义节点属性的节点添加到子集中,其名称和值与相应的模式匹配。自定义节点属性是通过 `node.attr.attrname: attrvalue` 形式在配置文件中设置的。
```bash
# 如果没有给出过滤器,默认是查询所有节点
GET /_nodes
# 查询所有节点
GET /_nodes/_all
# 查询本地节点
GET /_nodes/_local
# 查询主节点
GET /_nodes/_master
# 根据名称查询节点(支持通配符)
GET /_nodes/node_name_goes_here
GET /_nodes/node_name_goes_*
# 根据地址查询节点(支持通配符)
GET /_nodes/10.0.0.3,10.0.0.4
GET /_nodes/10.0.0.*
# 根据规则查询节点
GET /_nodes/_all,master:false
GET /_nodes/data:true,ingest:true
GET /_nodes/coordinating_only:true
GET /_nodes/master:true,voting_only:false
# 根据自定义属性查询节点(如:查询配置文件中含 node.attr.rack:2 属性的节点)
GET /_nodes/rack:2
GET /_nodes/ra*:2
GET /_nodes/ra*:2*
```
### 集群健康 API
```bash
GET /_cluster/health
GET /_cluster/health?level=shards
GET /_cluster/health/kibana_sample_data_ecommerce,kibana_sample_data_flights
GET /_cluster/health/kibana_sample_data_flights?level=shards
```
### 集群状态 API
集群状态 API 返回表示整个集群状态的元数据。
```bash
GET /_cluster/state
```
## 节点 API
> [Elasticsearch 官方之 cat Nodes API](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-nodes.html)——返回有关集群节点的信息。
```bash
# 查看默认的字段
GET /_cat/nodes?v=true
# 查看指定的字段
GET /_cat/nodes?v=true&h=id,ip,port,v,m
```
## 分片 API
> [Elasticsearch 官方之 cat Shards API](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html)——shards 命令是哪些节点包含哪些分片的详细视图。它会告诉你它是主还是副本、文档数量、它在磁盘上占用的字节数以及它所在的节点。
```bash
# 查看默认的字段
GET /_cat/shards
# 根据名称查询分片(支持通配符)
GET /_cat/shards/my-index-*
# 查看指定的字段
GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason
```
## 参考资料 ## 参考资料

View File

@ -0,0 +1,222 @@
# Elasticsearch 基本概念
## 文档
Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位。
Elasticsearch 使用 [_JSON_](http://en.wikipedia.org/wiki/Json) 作为文档的序列化格式。
每个文档都有一个 Unique ID
- 用户可以自己指定
- 或通过 Elasticsearch 自动生成
### 文档的元数据
一个文档不仅仅包含它的数据 ,也包含**元数据** —— 有关文档的信息。
- `_index`:文档在哪存放
- `_type`:文档表示的对象类别
- `_id`:文档唯一标识
- `_source`:文档的原始 Json 数据
- `_all`:整合所有字段内容到该字段,已被废除
- `_version`:文档的版本信息
- `_score`:相关性打分
示例:
```json
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": ["sports", "music"]
}
}
```
## 索引
索引在不同语境,有着不同的含义
- 索引(名词):一个 **索引** 类似于传统关系数据库中的一个 **数据库** ,是一个存储关系型文档的容器。 索引 (_index_) 的复数词为 indices 或 indexes 。索引实际上是指向一个或者多个**物理分片**的**逻辑命名空间** 。
- 索引(动词):索引一个文档 就是存储一个文档到一个 _索引_ (名词)中以便被检索和查询。这非常类似于 SQL 语句中的 `INSERT` 关键词,除了文档已存在时,新文档会替换旧文档情况之外。
- 倒排索引:关系型数据库通过增加一个索引比如一个 B 树索引到指定的列上以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 **倒排索引** 的结构来达到相同的目的。
索引的 Mapping 和 Setting
Mapping 定义文档字段的类型
Setting 定义不同的数据分布
示例:
```
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}
```
## 节点
### 节点简介
一个运行中的 Elasticsearch 实例称为一个**节点**。
Elasticsearch 实例本质上是一个 Java 进程。一台机器上可以运行多个 Elasticsearch 进程,但是生产环境建议一台机器上只运行一个 Elasticsearch 进程
每个节点都有名字,通过配置文件配置,或启动时通过 `-E node.name=node1` 指定。
每个节点在启动后,会分配一个 UID保存在 data 目录下。
### 节点类型
- **主节点master node**:每个节点都保存了集群的状态,只有 master 节点才能修改集群的状态信息(保证数据一致性)。**集群状态**,维护了以下信息:
- 所有的节点信息
- 所有的索引和其相关的 mapping 和 setting 信息
- 分片的路由信息
- **候选节点master eligible node**master eligible 节点可以参加选主流程。第一个启动的节点,会将自己选举为 mater 节点。
- 每个节点启动后,默认为 master eligible 节点,可以通过配置 `node.master: false` 禁止
- **数据节点data node**:负责保存分片数据。
- **协调节点coordinating node**:负责接收客户端的请求,将请求分发到合适的接地那,最终把结果汇集到一起。每个 Elasticsearch 节点默认都是协调节点coordinating node
- **冷/热节点warm/hot node**针对不同硬件配置的数据节点data node用来实现 Hot & Warm 架构,降低集群部署的成本。
- **机器学习节点machine learning node**:负责执行机器学习的 Job用来做异常检测。
### 节点配置
| 配置参数 | 默认值 | 说明 |
| ----------- | ------ | ------------------------------------- |
| node.master | true | 是否为主节点 |
| node.data | true | 是否为数据节点 |
| node.ingest | true | |
| node.ml | true | 是否为机器学习节点(需要开启 x-pack |
> **建议**
>
> 开发环境中一个节点可以承担多种角色。但是,在生产环境中,节点应该设置为单一角色。
## 集群
### 集群简介
拥有相同 `cluster.name` 配置的 Elasticsearch 节点组成一个**集群**。 `cluster.name` 默认名为 `elasticsearch`,可以通过配置文件修改,或启动时通过 `-E cluster.name=xxx` 指定。
当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为主节点时,它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量增加,它也不会成为瓶颈。 任何节点都可以成为主节点。
作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。
### 集群健康
Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 _集群健康_ 它在 `status` 字段中展示为 `green``yellow` 或者 `red`
在一个不包含任何索引的空集群中,它将会有一个类似于如下所示的返回内容:
```js
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 5,
"active_shards" : 5,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"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" : 100.0
}
```
`status` 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:
- **`green`**:所有的主分片和副本分片都正常运行。
- **`yellow`**:所有的主分片都正常运行,但不是所有的副本分片都正常运行。
- **`red`**:有主分片没能正常运行。
## 分片
### 分片简介
索引实际上是指向一个或者多个**物理分片**的**逻辑命名空间** 。
一个分片是一个底层的工作单元 ,它仅保存了全部数据中的一部分。一个分片可以视为一个 Lucene 的实例,并且它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。
Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
### 主分片和副分片
分片分为主分片Primary Shard和副分片Replica Shard
主分片:用于解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内不同节点上。
- 索引内任意一个文档都归属于一个主分片。
- 主分片数在索引创建时指定,后序不允许修改,除非 Reindex
副分片Replica Shard用于解决数据高可用的问题。副分片是主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份并为搜索和返回文档等读操作提供服务。
- 副分片数可以动态调整
- 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
对于生产环境中分片的设定,需要提前做好容量规划
分片数过小
- 无法水平扩展
- 单个分片的数量太大,导致数据重新分配耗时
分片数过大
- 影响搜索结果的相关性打分,影响统计结果的准确性
- 单节点上过多的分片,会导致资源浪费,同时也会影响性能
### 故障转移
当集群中只有一个节点运行时,意味着存在单点故障问题——没有冗余。
---
文档的基本 CRUD 与批量操作
倒排索引入门
通过分析器进行分词
Search API 概览
URI Search 详解
Request Body 与 Query DSL 简介
Query String & Simple Query String 查询
Dynamic Mapping 和常见字段类型
显式 Mapping 设置与常见参数介绍
多字段特性及 Mapping 中配置自定义 Analyzer
Index Template 和 Dynamic Template
Elasticsearch 聚合分析简介
## 参考资料
- [Elasticsearch 官网](https://www.elastic.co/)

View File

@ -1,10 +1,10 @@
# Elasticsearch 应用指南 # Elasticsearch 快速入门
> **[Elasticsearch](https://github.com/elastic/elasticsearch) 是一个分布式、RESTful 风格的搜索和数据分析引擎**,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 > **[Elasticsearch](https://github.com/elastic/elasticsearch) 是一个分布式、RESTful 风格的搜索和数据分析引擎**,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
> >
> [Elasticsearch](https://github.com/elastic/elasticsearch) 基于搜索库 [Lucene](https://github.com/apache/lucene-solr) 开发。ElasticSearch 隐藏了 Lucene 的复杂性,提供了简单易用的 REST API / Java API 接口(另外还有其他语言的 API 接口)。 > [Elasticsearch](https://github.com/elastic/elasticsearch) 基于搜索库 [Lucene](https://github.com/apache/lucene-solr) 开发。ElasticSearch 隐藏了 Lucene 的复杂性,提供了简单易用的 REST API / Java API 接口(另外还有其他语言的 API 接口)。
> >
> *以下简称 ES* > _以下简称 ES_
## 一、Elasticsearch 简介 ## 一、Elasticsearch 简介
@ -121,7 +121,7 @@ java好难学啊
j2ee特别牛 j2ee特别牛
``` ```
你根据 `java` 关键词来搜索,将包含 `java``document` 给搜索出来。es 就会给你返回java真好玩儿啊java好难学啊。 你根据 `java` 关键词来搜索,将包含 `java``document` 给搜索出来。es 就会给你返回java 真好玩儿啊java 好难学啊。
- 客户端发送请求到一个 `coordinate node` - 客户端发送请求到一个 `coordinate node`
- 协调节点将搜索请求转发到**所有**的 shard 对应的 `primary shard``replica shard` ,都可以。 - 协调节点将搜索请求转发到**所有**的 shard 对应的 `primary shard``replica shard` ,都可以。

View File

@ -0,0 +1,22 @@
# Elasticsearch 简介
Elasticsearch 是一款基于 Lunece 的开源分布式搜索分析引擎。
为什么使用 Elasticsearch
- 查询性能好
- 分布式设计,易于水平扩展
- 支持多种语言的集成
- 社区活跃,业界广泛使用
## Elastic Stack 生态
### Logstash
### Kibana
### Beats
## 参考资料
- [Elasticsearch 官网](https://www.elastic.co/)

View File

@ -2,20 +2,21 @@
## 📖 内容 ## 📖 内容
### ElasticSearch ### Elasticsearch
> [ElasticSearch](https://www.elastic.co/products/elasticsearch) 是一个基于 [Lucene](http://lucene.apache.org/core/documentation.html) 构建的开源分布式RESTful 搜索引擎。 > [Elasticsearch](https://www.elastic.co/products/elasticsearch) 是一个基于 [Lucene](http://lucene.apache.org/core/documentation.html) 构建的开源分布式RESTful 搜索引擎。
- [Elasticsearch 面试总结](elasticsearch-interview.md) 💯 - [Elasticsearch 面试总结](elasticsearch-interview.md) 💯
- [ElasticSearch 应用指南](elasticsearch-quickstart.md) - [Elasticsearch 快速入门](Elasticsearch快速入门.md)
- [ElasticSearch API](elasticsearch-api.md) - [Elasticsearch 基本概念](Elasticsearch基本概念.md)
- [ElasticSearch 运维](elasticsearch-ops.md) - [Elasticsearch Rest API](ElasticsearchRestApi.md)
- [Elasticsearch 运维](elasticsearch-ops.md)
### Elastic 技术栈 ### Elastic 技术栈
> **Elastic 技术栈通常被用来作为日志采集、检索、可视化解决方案。** > **Elastic 技术栈通常被用来作为日志采集、检索、可视化解决方案。**
> >
> ELK 是 elastic 公司旗下三款产品 [ElasticSearch](https://www.elastic.co/products/elasticsearch) 、[Logstash](https://www.elastic.co/products/logstash) 、[Kibana](https://www.elastic.co/products/kibana) 的首字母组合。 > ELK 是 elastic 公司旗下三款产品 [Elasticsearch](https://www.elastic.co/products/elasticsearch) 、[Logstash](https://www.elastic.co/products/logstash) 、[Kibana](https://www.elastic.co/products/kibana) 的首字母组合。
> >
> [Logstash](https://www.elastic.co/products/logstash) 传输和处理你的日志、事务或其他数据。 > [Logstash](https://www.elastic.co/products/logstash) 传输和处理你的日志、事务或其他数据。
> >

View File

@ -16,7 +16,6 @@ cd ${ROOT_DIR}/docs
# 生成静态文件 # 生成静态文件
npm install npm install
npm audit fix
npm run build npm run build
# 进入生成的文件夹 # 进入生成的文件夹