使用 Elasticsearch

news2024/11/26 5:41:25

了解如何创建索引,添加,删除,更新文档
参考文档 开始使用 Elasticsearch 1

本文用到Elasticsearch和Kibana 可以看之前的两篇先安装好
Elasticsearch 安装
Kibana安装

Elasticsearch 里的接口都是通过 REST 接口来实现的。

GET						读取数据
POST					插入数据
PUT 或 PATCH			更新数据,或如果是一个新的 id,则插入数据
DELETE					删除数据

http://localhost:5601/app/dev_tools
在这里插入图片描述

在这里插入图片描述

GET /

在这里插入图片描述
还可以复制为Curl
在这里插入图片描述

curl -XGET "https://1270.0.1:9200/" -H "kbn-xsrf: reporting"

同样可以 复制curl至页面就会变成 GET /
在这里插入图片描述


查看当前索引的 mapping:

GET dada/_mapping
{
  "dada": {
    "mappings": {
      "properties": {
        "cc": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "uid": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "user": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

Elasticsearch 的数据类型:

text:							全文搜索字符串
keyword:						用于精确字符串匹配和聚合
date 及 date_nanos:				格式化为日期或数字日期的字符串
byte, short, integer, long:	整数类型
boolean:						布尔类型
float,double,half_float:		浮点数类型
分级的类型:object 及 nested。

创建一个索引 test,并且含有 id 及 message 字段。id 字段为 keyword 类型,而 message 字段为 text 类型,那么我们可以使用如下的方法来创建:

PUT test
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "message": {
        "type": "text"
      }
    }
  }
}
#--------返回结果--------
{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "test"
}

追加一个新的字段 age,并且它的类型为 long 类型:

PUT test/_mapping
{
  "properties": {
    "age": {
      "type": "long"
    }
  }
}
#--------返回结果--------
{
  "acknowledged": true
}
#查看结果
GET test/_mapping
#--------返回结果--------
{
  "test": {
    "mappings": {
      "properties": {
        "age": {
          "type": "long"
        },
        "id": {
          "type": "keyword"
        },
        "message": {
          "type": "text"
        }
      }
    }
  }
}

_refresh用于使新文档在搜索时可见。
反过来,_flush用于在硬盘上持久化内存段。
_flush不会影响Elasticsearch中文档的可见性,因为搜索是在内存段中进行的,而_refresh会影响它们的可见性。

#存在就会修改
PUT dada/_doc/2
{
  "user":"222",
  "uid":2,
  "cc":"222"
}
#存在就会返回报错
PUT dada/_create/2
{
  "user":"222",
  "uid":2,
  "cc":"222"
}
#效果一样
PUT dada/_doc/2?op_type=create
{
  "user":"22222",
  "uid":2,
  "cc":"222"
}
#--------返回报错--------
{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[2]: version conflict, document already exists (current version [2])",
        "index_uuid": "gFA5LQXRQIef2WBv3d_aWw",
        "shard": "0",
        "index": "dada"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[2]: version conflict, document already exists (current version [2])",
    "index_uuid": "gFA5LQXRQIef2WBv3d_aWw",
    "shard": "0",
    "index": "dada"
  },
  "status": 409
}

查询只看_source部分

GET dada/_doc/2
#正常返回
{
  "_index": "dada",
  "_id": "2",
  "_version": 2,
  "_seq_no": 6,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "user": "222",
    "uid": 2,
    "cc": "222"
  }
}
#--------_source-------
GET dada/_source/2
#返回
{
  "user": "222",
  "uid": 2,
  "cc": "222"
}

自动 ID 生成

使用 POST

POST dada/_doc/
{
  "user":"55",
  "uid":5,
  "cc":"55"
}
#-----返回的结果:-----
{
  "_index": "dada",
  "_id": "u_g9C4kB2SZh9y2Iu2Gc",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 7,
  "_primary_term": 1
}

只读部分数据

GET dada/_doc/2?_source=user,uid
#-----返回的结果------
{
  "_index": "dada",
  "_id": "2",
  "_version": 2,
  "_seq_no": 6,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "user": "222",
    "uid": 2
  }
}
GET dada/_source/2?_source=user,uid
#-----返回的结果------
{
  "user": "222",
  "uid": 2
}

一次请求查找多个文档 _mget

GET _mget
{
  "docs":[
    {
      "_index":"dada",
      "_id":2
    },
    {
      "_index":"test",
      "_id":"vPhIC4kB2SZh9y2IU2G6"
    }
  ]
}
#-----------返回的结果------------
{
  "docs": [
    {
      "_index": "dada",
      "_id": "2",
      "_version": 2,
      "_seq_no": 6,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "user": "222",
        "uid": 2,
        "cc": "222"
      }
    },
    {
      "_index": "test",
      "_id": "vPhIC4kB2SZh9y2IU2G6",
      "_version": 1,
      "_seq_no": 0,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "age": 20,
        "id": 11,
        "message": "lalalalaaaa"
      }
    }
  ]
}

也可以只获得部分字段

GET _mget
{
  "docs":[
    {
      "_index":"dada",
      "_id":2,
      "_source":["user","uid"]
    },
    {
      "_index":"test",
      "_id":"vPhIC4kB2SZh9y2IU2G6"
    }
  ]
}
#---------返回的结果---------
{
  "docs": [
    {
      "_index": "dada",
      "_id": "2",
      "_version": 2,
      "_seq_no": 6,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "user": "222",
        "uid": 2
      }
    },
    {
      "_index": "test",
      "_id": "vPhIC4kB2SZh9y2IU2G6",
      "_version": 1,
      "_seq_no": 0,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "age": 20,
        "id": 11,
        "message": "lalalalaaaa"
      }
    }
  ]
}

GET _mget
{
  "docs":[
    {
      "_index":"dada",
      "_id":2,
      "_source":["user","uid"]
    },
    {
      "_index":"dada",
      "_id":1
    }
  ]
}
#--------可简写:---------
GET dada/_mget
{
  "ids":["1","2"]
}
#------------返回结果------------
{
  "docs": [
    {
      "_index": "dada",
      "_id": "1",
      "_version": 1,
      "_seq_no": 0,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "user": "GB",
        "uid": "sss",
        "cc": "aa"
      }
    },
    {
      "_index": "dada",
      "_id": "2",
      "_version": 2,
      "_seq_no": 6,
      "_primary_term": 1,
      "found": true,
      "_source": {
        "user": "222",
        "uid": 2,
        "cc": "222"
      }
    }
  ]
}

修改一个文档

在上面我们看到了可以使用 POST 的命令来修改改一个文档。通常我们使用 POST 来创建一个新的文档。在使用 POST 的时候,我们甚至不用去指定特定的 id,系统会帮我们自动生成。但是我们修改一个文档时,我们通常会使用 PUT 来进行操作,并且,我们需要指定一个特定的 id 来进行修改:

PUT修改时,每一项都会改

PUT test/_doc/1
{
  "age":110,
  "id":1212
}

使用POST 只改需要改的字段,其他字段会保留下来

POST test/_update/1
{
  "doc": {
    "age":22222,
    "id":20
  }
}

先查询后修改 script

通过查询的方式来进行查询,让后进行修改。ES 也提供了相应的 REST 接口。

会把所有age为22222的都修改

POST test/_update_by_query
{
  "query": {
    "match": {
      "age": "22222"
    }
  },
  "script": {
    "source": "ctx._source.id=params.id;ctx._source.message=params.message",
    "lang": "painless",
    "params":{
      "id":888,
      "message":"new哈哈哈",
      "oth":"????"
    }
  }
}

可以通过 update 接口,使用 script 的方法来进行修改。这个方法也是需要知道文档的 id

POST test/_update/vPhIC4kB2SZh9y2IU2G6
{
  "script": {
    "source": "ctx._source.id=params.id;ctx._source.message=params.message",
    "lang": "painless",
    "params":{
      "id":999,
      "message":"new999哈哈哈",
      "oth":"??999??"
    }
  }
}
#------返回结果--------
{
  "_index": "test",
  "_id": "vPhIC4kB2SZh9y2IU2G6",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 9,
  "_primary_term": 1
}

在我们使用上面的方法更新文档时,如果当前的文档 id 不存在,那么我们甚至可以使用 upsert 属性来创建一个文档:

POST test/_update/3
{
  "script": {
    "source": "ctx._source.id=params.id;ctx._source.message=params.message",
    "lang": "painless",
    "params":{
      "id":999,
      "message":"new999哈哈哈",
      "oth":"??999??"
    }
  },
  "upsert":{
    "id":3,
    "message":"3333333"
  }
}

我们甚至可以使用 _update 接口使用 ctx[‘_op’] 来达到删除一个文档的目的,比如:

当检测文档的 字段id 是否为 888,如果为 888 的话,那么该文档将被删除,否则将不做任何事情。
POST test/_update/1
{
  "script": {
    "source":"""
    if(ctx._source.id == 888){
      ctx.op = 'delete'
    }else {
      ctx.op = 'none'
    }
    """
  }
}
#------返回---------
{
  "_index": "test",
  "_id": "1",
  "_version": 7,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 11,
  "_primary_term": 1
}

使用 script 的一些高级操作,比如我们可以通过如下的方法来添加一个崭新的字段,新增加了一个叫做 newfield 的字段:

POST test/_update/2
{
  "script" : {
      "source": "ctx._source.newfield=4",
      "lang": "painless"
  }
}
#----------------------
{
        "_index": "test",
        "_id": "2",
        "_score": 1,
        "_source": {
          "id": 888,
          "message": "new哈哈哈",
          "age": 22222,
          "newfield": 4
        }
}
# --------------也可以删除字段-------------
POST test/_update/2
{
  "script" : {
      "source": "ctx._source.remove(\"newfield\")",
      "lang": "painless"
  }
}

在这里请注意的是:一旦一个字段被创建,那么它就会存在于更新的 mapping 中。即便针对 id 为 1 的文档删除了 newfield,但是 newfield 还将继续存在于 twitter 的 mapping 中。我们可以使用如下的命令来查看 twitter 的 mapping:

GET test/_mapping
#---------返回结果-----------
{
  "test": {
    "mappings": {
      "properties": {
        "age": {
          "type": "long"
        },
        "id": {
          "type": "keyword"
        },
        "message": {
          "type": "text"
        },
        "newfield": {
          "type": "long"
        }
      }
    }
  }
}

UPSERT 一个文档

术语 “upsert” 宽松地表示更新或插入,即更新文档(如果存在),否则,插入新文档。

doc_as_upsert 参数检查具有给定ID的文档是否已经存在,并将提供的 doc 与现有文档合并。 如果不存在具有给定 id 的文档,则会插入具有给定文档内容的新文档。

下面的示例使用 doc_as_upsert 合并到 id 为 10 的文档中,或者如果不存在则插入一个新文档:

POST test/_update/10
{
  "doc":{
    "age":"10",
    "id":"10",
    "newfield":"55",
    "message":"messssss"
  },
  "doc_as_upsert":true
}

检查一个文档是否存在

HEAD test/_doc/10
# ---成功返回---
200 - OK

#------不存在-----
404 - Not Found

删除一个文档

DELETE test/_doc/11
#成功返回
{
  "_index": "test",
  "_id": "11",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 17,
  "_primary_term": 1
}

在不在id的情况下,先查询后删除,以下是把message等于14的都删除

HEAD test/_doc/14
#--
200 - OK

POST test/_delete_by_query
{
  "query":{
    "match":{
      "message":"14"
    }
  }
}

HEAD test/_doc/14
#---
404 - Not Found

检查一个索引是否存在

HEAD tt
200 - OK

删除一个索引

删除一个索引 是非常直接的。我们可以直接使用如下的命令来进行删除:

DELETE tt
#删除成功返回
{
  "acknowledged": true
}

批处理命令

上面我们已经了解了如何使用 REST 接口来创建一个 index,并为之创建(Create),读取(Read),修改(Update),删除文档(Delete)(CRUD)。因为每一次操作都是一个 REST 请求,对于大量的数据进行操作的话,这个显得比较慢。ES 创建一个批量处理的命令给我们使用。这样我们在一次的 REST 请求中,我们就可以完成很多的操作。这无疑是一个非常大的好处。下面,我们来介绍一下这个 _bulk 命令。

我们使用如下的命令来进行 bulk 操作:

POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"虹桥-老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

在上面的命令中,我们使用了 bulk 指令来完成我们的操作。在输入命令时,我们需要特别的注意:千万不要添加除了换行以外的空格,否则会导致错误。在上面我们使用的 index 用来创建一个文档。为了说明问题的方便,我们在每一个文档里,特别指定了每个文档的 id。当执行完我们的批处理 bulk 命令后,我们可以看到:
在这里插入图片描述
在实际的使用中,我们必须注意的是:一个好的起点是批量处理 1,000 到 5,000 个文档,总有效负载在 5MB 到 15MB 之间。如果我们的 payload 过大,那么可能会造成请求的失败。
通过 POST dd/_search 查询
在这里插入图片描述
统计 GET dd/_count
在这里插入图片描述


上面我们已经使用了 index 来创建6条文档记录。我也可以尝试其它的命令,比如 create:

POST _bulk
{ "create" : { "_index" : "dd", "_id": 1} }
{"user":"双榆树-张三","message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "dd", "_id": 2 }}
{"user":"东城区-老刘","message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "dd", "_id": 3} }
{"user":"东城区-李四","message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "dd", "_id": 4} }
{"user":"朝阳区-老贾","message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "dd", "_id": 5} }
{"user":"朝阳区-老王","message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "dd", "_id": 6} }
{"user":"虹桥-老吴","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

在这里插入图片描述
从上面的信息,我们可以看出来 index 和 create 的区别。index 总是可以成功,它可以覆盖之前的已经创建的文档,但是 create 则不行,如果已经有以那个 id 为名义的文档,就不会成功。

我们可以使用 delete 来删除一个已经创建好的文档:

POST _bulk
{ "delete" : { "_index" : "dd", "_id": 1 }}

在这里插入图片描述
可以看到 id 为1的文档已经被删除了。我可以通过如下的命令来查看一下:在这里插入图片描述
批量修改

POST _bulk
{ "update" : { "_index" : "dd", "_id": 2 }}
{"doc": { "city": "长沙"}}

索引统计

GET dd/_stats

同时获得多个索引统计值
GET dd,test/_stats

通配符
GET dd*/_stats

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

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

相关文章

matlab——制作箱线图

在数据分析中,如果不知道数据分布的情况下很难判断中位数是否有效或者存在离群点。 离群点指偏离大多数点规律的点。 为了更有效对整体数据进行划分,提出四分位点的概念。即选取概念下界、0.25位点、0.75位点、概念上界。 有一种专门表现四分位点的图像叫…

@Import注解源码解析

文章目录 一、简介二、Import注解的几种用法三、Import注解源码解析1、ConfigurationClassPostProcessor2、ConfigurationClassPostProcessor 类的 postProcessBeanDefinitionRegistry 方法3、ConfigurationClassParser 类的 parse 方法4、处理 ImportBeanDefinitionRegistrar …

C++实现打包工具代码框架+多种设计模式以及C++特性(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、打包工具二、packtool框架前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务于工作实践。 专栏介绍:专栏讲本人近…

沟通漏斗模型

沟通漏斗模型 沟通漏斗理论|是指信息在用语言这种形式,传递在过程中,逐渐衰减的现象。 模型介绍 「沟通漏斗模型」很多时候你说出来的≠别人听到的!对沟通者来说,如果心里想的是100%的信息,受限于语言表达的技巧&…

海康威视(Hikvision) 摄像头-CVE-2017-7921漏洞复现

漏洞描述 许多HikvisionIP摄像机包含一个后门,允许未经身份验证的模拟任何配置的用户帐户。 漏洞复现 访问漏洞url 检索用户与用户列表 ttp://your-ip/Security/users?authYWRtaW46MTEK 从下图可知该摄像只有admin一个账户 获取监控快照 http://your-ip/onvif…

北京阿里云代理商:阿里云CDN流量包的价格和流量消耗计算?

标题:阿里云CDN流量包的价格和流量消耗计算?成本控制策略 本文由阿里云代理商[上海聚搜信息技术有限公司] 撰写。 面对企业或个人用户在使用阿里云CDN进行内容分发时,常常会有一个疑问,那就是如何计算阿里云CDN流量包的价格以及流…

社区底商需要加入团购?社区团购的运营到底应该怎么做?

社区团购作为越来越多社区底商老板的“副业”的模式,社区团购为门店带来的巨大盈利增长点,但传统门店盈利单一、客流有限等问题依然严重,门店改牌也是迟早的事情。 对于传统门店来说,生死存亡下想要转型线上,往往面临开…

TCP之延时Nagle算法实验详解

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MS…

系统盘崩溃挂盘进入救援模式选择continue无法进入

问题: 系统盘崩溃挂盘进入救援模式选择continue无法进入,始终读码或者黑屏。 原因: 出现这个界面一般是在选择 "1 Continue" 后,某些文件系统没有成功 mount导致 解决方法: 再次进入救援模式&#xff0c…

(五)人工智能应用--深度学习原理与实战--Linux系统Tensorflow平台搭建

作为使用最广泛的深度学习框架,TensorfLow支持Windows、Linux、MacOs等多种操作系统。Linux系统作为服务器部署环境十分常见,本章我们将学习在Linux操作系统下Tensorflow的安装及基于NVIDIA GPU的Cuda(GPU并行计算框架)、cudnn(深度学习加速平台)的安装配置。 主要…

CV多模态和AIGC的原理解析:从CLIP、BLIP到Stable Diffusion、Midjourney

前言 终于开写本CV多模态系列的核心主题:stable diffusion相关的了,为何执着于想写这个stable diffusion呢,源于三点 去年stable diffusion和midjourney很火的时候,就想写,因为经常被刷屏,但那会时间错不…

Apache组件POI,勾选导出Excel文件。

如果对 POI组件、Maven依赖不了解的小伙伴,在观看本篇文章之前可以先观看我上一篇文章: Apache组件POI,将图片下载到Excel文件中并导出。 。 本篇文章主要讲解Excel文件如何实现勾选导出。 我们先看一下勾选导出时的入参参数,其中…

【调试】vscode远程连接服务器

概述 windows远程连接linux服务器进行操作,有多种方式。可以借助ssh客户端,MobaXterm,finalshell等,这两个我觉得是不错的软件。当然如果需要在服务器编写代码,我还是建议使用vscode这个神奇的工具。怎么用vscode远程…

Spring Boot 中的 TCC 事务

Spring Boot 中的 TCC 事务 在分布式系统中,事务一直是一个棘手的问题。传统的 ACID 事务无法满足分布式系统的需求,因为它们需要强一致性、单点故障和网络延迟等问题。近年来,随着微服务架构的普及,TCC 事务成为了一种非常流行的…

SpringMVC入门篇4 --- SSM整合案例

目录 SSM整合小案例 源码 1.整合配置(config目录) Spring - SpringConfigMyBatis - MyBatisConfig、JdbcConfig、jdbc.propertiesSpringMVC - ServletConfig、SpringMvcConfig 2.功能模块 模型(domain目录):Book.java数据层(dao目录):.BookDao.ja…

windows11安装Linux子系统

个人博客地址: https://cxx001.gitee.io Windows在10之后自带了虚拟机子系统功能,可以和本地磁盘共享,默认挂载到/mnt/目录下面。比起传统的VM方便多了。下面是搭建流程: 一 开启子系统服务 控制面板 -> 程序 -> 程序与功能 -> 启动…

学会vue3,仅需这一篇

V3-组合式API setup/reactive/ref/computed/watch/生命周期/父子通信/模板引用/provide和inject数据传输 vue3的优势** 组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。 使用create-vue搭建Vue3项目…

Apikit 自学日记:API 变更历史

系统会自动保存API的每一次编辑内容。进入API详情页面,点击 编辑历史 ,在弹窗中会列出API的每次改动,您可以点击 详情 了解编辑的概况信息。 如果您想对比当前版本和历史的某个版本的差别,点击 对比 按钮,会在新窗口中…

springboot整合shiro实现认证和授权(非常详细)

Shiro和Spring Sercurity应该是我们比较常用的权限框架了,这篇文章教大家怎么通过springboot整合shiro从0开始搭建一个包含权限控制的后台管理系统。 第一步:创建一个springboot项目 创建springboot项目,这里项目就命名为shiro 第二步&#…

如何用一键抠图工具在线压缩PNG图片

我们会发现,现在用的很多图片格式都是PNG,它通常以无损压缩的方式存储图像。然而,有时候我们可能会遇到PNG文件过大的问题,这样会导致文件传输、存储和加载速度变慢。怎么才能解决这个问题,有什么好用的工具推荐么&…