当前位置: 首页 > news >正文

【Elasticsearch】es脚本编程使用详解

目录

一、es脚本语言介绍

1.1 什么是es脚本

1.2 es脚本支持的语言

1.3 es脚本语言特点

1.4 es脚本使用场景

二、环境准备

2.1 docker搭建es过程

2.1.1 拉取es镜像

2.1.2 启动容器

2.1.3 配置es参数

2.1.4 重启es容器并访问

2.2 docker搭建kibana过程

2.2.1 拉取kibana镜像

2.2.2 启动kibana容器

2.2.3 修改配置文件

2.2.4 重启容器并访问

三、Scripting 使用详解

3.1 数据准备

3.1.1 创建索引

3.1.2 添加测试数据

3.2 es脚本常用CRUD操作

3.2.1 修改id为1001数据的价格

3.2.2 修改id为1005数据的tag

3.2.3 删除id为1005数据

3.2.4 upsert操作

3.2.5 使用expression查询

3.3 参数化脚本使用

3.3.1 修改1005这条数据的字段值

3.3.2 对字段值进行计算

3.3.3 对字段值进行计算并输出多个结果

3.4 参数化脚本的存储

3.4.1 自定义一个参数脚本

3.4.2 查询脚本模板

3.4.3 使用自定义脚本模板

四、Scripting 函数式编程

4.1 函数式编程格式

4.2 函数式编程使用

4.2.1 同时操作多个字段

4.2.2 条件表达式

4.2.3 数据统计与聚合

五、写在文末


一、es脚本语言介绍

1.1 什么是es脚本

Elasticsearch的 Scripting 是es支持的一种专门用于复杂场景下实现可编程的强大脚本功能。通过Scripting 脚本编程,可以实现更复杂的查询、数据处理、数据定制统计聚合以及柔性调整索引结构等。

1.2 es脚本支持的语言

es支持多种脚本语言,比如Painless,这是 Elasticsearch 自家开发的一种安全、高效并且易于学习的语言,其语法与Java很类似,编程中,也有注释、关键字、类型、变量、函数等,相较于其他支持的脚本语言性能更高,并且安全可靠,可以用于内联和存储脚本。

除了 Painless,Elasticsearch 也支持其他几种脚本语言,如 Lucene 的表达式语言,但 Painless 是推荐和默认的选项。具体来说,常用的支持语言如下:

  • groovy,ES1.4X~5.0默认的脚本语言;

  • Painless,JavaEE使用java语言开发,.net使用C#语言开发,Flutter使用Dart语言开发,ES5.X之后的Scripting 使用的默认语法就是Painless,Painless是一种专门用于es的脚本语法,是ES5.0+的默认脚本语言,其语法与Java很类似;

  • expression:每个文档的开销较低,表达式的作用更多,可以非常快速地执行,甚至比编写native脚本还要快,支持javascript语法的子集。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用;

  • mustache:提供模板参数化查询。

1.3 es脚本语言特点

使用es脚本语言进行编程具有如下特点

  • 语法简单,学习成本较低;

  • 灵活度高,可编程能力强;

  • 性能相对于其他脚本语言高;

  • 安全性好;

  • 独立语言,虽然易学但是仍需单独学习;

  • 相较于DSL语言性能低;

  • 不适用于复杂的业务场景;

1.4 es脚本使用场景

在下面的一些场景下可以考虑使用es脚步。

计算字段

你可以使用脚本在查询时动态地改变或添加字段的值,这对于数据分析的场景下具有重要的作用。 

脚本查询

在查询中使用脚本进行复杂的条件判断。es脚本语言很灵活,其中painless类型下,其语法格式和java非常相似,支持各类条件查询。 

脚本聚合

使用脚本进行更复杂的聚合计算。 

二、环境准备

为了后面的操作和演示方便,使用docker 快速搭建起es的操作环境。

搭建的服务包括 es+kibana。使用的版本为7.6.2.

2.1 docker搭建es过程

2.1.1 拉取es镜像

docker pull elasticsearch:7.6.2

2.1.2 启动容器

使用下面的命令启动es的容器

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --name es7.6 -d elasticsearch:7.6.2

重点需要注意这个配置,ES_JAVA_OPTS="-Xms512m -Xmx512m",这个配置参数的值最好根据你的服务器配置来决定,一般最好不要低于512m即可;

2.1.3 配置es参数

进入到es容器内部,然后找到下面的这个文件

然后将下面的配置参数配置进去

cluster.name: "docker-cluster"
http.cors.enabled: true
network.host: 0.0.0.0
http.port: 9200
http.cors.allow-origin: "*"

2.1.4 重启es容器并访问

配置完成后重启docker容器,重启成功后,开放9200的端口,然后浏览器可以访问IP:9200,看到如下信息,说明es的搭建完成

2.2 docker搭建kibana过程

2.2.1 拉取kibana镜像

为了减少后面的配置麻烦和一些问题,建议kibana版本与es版本一致

docker pull kibana:7.6.2

2.2.2 启动kibana容器

这里的IP,如果是云服务器,注意使用内网的IP地址

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://es服务IP:9200 -p 5601:5601 -d kibana:7.6.2

2.2.3 修改配置文件

进入到kibana容器中,进入到下面的目录中

cd /usr/share/kibana/config
vi kibana.yml 

将如下的配置信息配置进去(es的IP地址如果是云服务器建议使用内网IP)

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://es服务IP:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: zh-CN

2.2.4 重启容器并访问

上述配置信息配置完成后,重启容器,开放5601端口,浏览器就可以直接访问,IP:5601,看到下面的效果说明kibana搭建完成

三、Scripting 使用详解

3.1 数据准备

3.1.1 创建索引

使用下面的语句创建一个book的索引

PUT books

3.1.2 添加测试数据

添加如下测试数据

PUT /books/_doc/1001
{"id":"1001","title":"Java technology fans","category":"Java","price":129,"from":"shanghai"
}PUT /books/_doc/1002
{"id":"10034","title":"Python data analysis","category":"Python","price":98,"from":"hangzhou","tags":["python","analysis"]
}PUT /books/_doc/1003
{"id":"1003","title":"Js vue","category":"web","price":68,"from":"wuhan","barcode":["js","web"]
}PUT /books/_doc/1004
{"id":"1004","title":"Mysql dba","category":"mysql","price":88,"from":"hangzhou","barcode":["mysql","analysis"]
}PUT /books/_doc/1005
{"id":"1005","title":"Python official ","category":"Python","price":108,"from":"hangzhou","barcode":["python","analysis"]
}

测试其中一条添加数据效果

全部添加之后,可以检查下是否添加成功

3.2 es脚本常用CRUD操作

操作语法

ctx._source.<field-name>

参数说明

  • ctx,表示当前操作对象的上下文环境;

  • _source,表示包裹数据对象的标识;

  • field-name,具体操作的某个字段

3.2.1 修改id为1001数据的价格

将id为1001的数据的价格加1元,操作语法如下

POST /books/_update/1001
{"script": {"source": "ctx._source.price+=1"}
}

操作完成后,再次查看这条数据,发现价格加1了

上面的语法也可以简写为下面这样

POST /books/_update/1001
{"script": "ctx._source.price+=1"
}

3.2.2 修改id为1005数据的tag

给id为1005的这条数据中的barcode字段的值再增加一个service的值

执行下面的语句

POST /books/_update/1005
{"script": {"lang": "painless", "source": "ctx._source.barcode.add('service')"}
}

执行完成后再次查询,可以看到barcode中就多了一个service的值

3.2.3 删除id为1005数据

执行下面的语句进行数据删除

POST /books/_update/1005
{"script": {"lang": "painless", "source": "ctx.op='delete'"}
}

执行完成后再次查询这条数据,已经查不到了

3.2.4 upsert操作

upsert为更新或新增,当操作的这条数据不存在的时候,执行新增;如果已存在,则执行修改操作,以上面的1005这条被删除的数据,当执行下面的语句时,由于1005不存在,所以会新增一条数据,而其他已存在的数据的price会加10;

POST /books/_update/1005
{"script": {"lang": "painless", "source": "ctx._source.price += 10"},"upsert": {"id":"1005","title":"Python official ","category":"Python","price":108,"from":"hangzhou","barcode":["python","analysis"]}
}

执行上面的语句之后,查询一下看到新增了一条100的数据

如果再执行一次,通过右侧执行结果,这一次就是修改操作了

3.2.5 使用expression查询

在上文讲到,es5之后默认的脚本语言是Painless,在某些场景下也可以使用expression来操作,注意的是,使用expression类型查询时,语法格式将有所变化,需要以script_fields开头,这个在kibana中会有提示,如下为查询数据的price字段的值

GET /books/_search
{"script_fields": {"get_price": {"script": {"lang": "expression","source": "doc['price'].value"}}}
}

也可以基于某个值进行计算操作,比如将price的值*10

3.3 参数化脚本使用

在很多编程语言中都支持外部参数的传入,在es的painless脚本编程中,也支持参数化使用,参数化脚本可以让脚本程序的灵活性和可扩展性更好。

3.3.1 修改1005这条数据的字段值

比如在上面的案例中,为id为1005的这条数据的barcode字段中添加一个service的值,如果使用参数化的方式来做,可以修改为下面这样

POST /books/_update/1005
{"script": {"lang": "painless", "source": "ctx._source.barcode.add(params.barcode_name)","params":{"barcode_name":"service"}}
}

执行上面的语句之后再次查询这条数据,barcode字段中就多了一个service的值

3.3.2 对字段值进行计算

使用下面的这段脚本对price进行计算

GET /books/_search
{"script_fields": {"get_price": {"script": {"lang": "painless","source": "doc['price'].value * params.num","params":{"num":10}}}}
}

得到如下结果

当然也可以使用expression来做,执行语句如下

GET /books/_search
{"script_fields": {"get_price": {"script": {"lang": "expression","source": "doc['price'].value * num","params":{"num":10}}}}
}

3.3.3 对字段值进行计算并输出多个结果

也可以自定义多个参数,根据需要输出多个参数的计算结果值,如下,为一个书本打折扣的场景,分别输出在9折,8折,7折下的价格

GET /books/_search
{"script_fields": {"get_price": {"script": {"lang": "painless","source": "[doc['price'].value * params.num_9,doc['price'].value * params.num_8,doc['price'].value * params.num_7]","params":{"num_9":0.9,"num_8":0.8,"num_7":0.7}}}}
}

执行结果如下

3.4 参数化脚本的存储

有些脚本可能在后续经常被使用到,就可以考虑将这些脚本存储到es的内存中,这就有点像mysql中的存储过程或函数一样。下面来看具体的操作流程。

3.4.1 自定义一个参数脚本

自定义如下参数化脚本

# 语法格式,_scripts/{script_id}
POST _scripts/caculate_price
{"script": {"lang": "painless", "source": "doc.price.value * params.discount"}
}

执行之后,将会在内存中存储一个参数化脚本的模板

3.4.2 查询脚本模板

使用下面的语句可以查询内存中存储的脚本模板

3.4.3 使用自定义脚本模板

在查询数据的时候,为了计算折扣后的值,就可以直接使用上面定义的脚本模板

GET /books/_search
{"script_fields": {"discount_price": {"script": {"id":"caculate_price","params":{"discount":0.9}}}}
}

得到如下的结果

四、Scripting 函数式编程

在上文通过实际案例演示了使用es的脚本编程的能力,细心的同学会发现,其实在上面的操作中,都是针对一些比较简单的场景进行使用,大多数基本上一行代码搞定,如果是更复杂的操作呢?比如既要更新字段的数据,同时也要对对数据进行计算等更复杂的操作呢,这时候就需要使用Scripting 的函数式编程了。官方文档地址: 官方文档

4.1 函数式编程格式

以上面的某个案例为例,如下是对1005数据的字段进行修改

POST /books/_update/1005
{"script": {"lang": "painless", "source": "ctx._source.barcode.add(params.barcode_name)","params":{"barcode_name":"service"}}
}

如果使用函数式编程的,在上面的脚本中,需要对 source这里做如下调整,即source后面的表达式使用3个引号包裹起来,如下所示

POST /books/_update/1005
{"script": {"lang": "painless", "source": """ctx._source.barcode.add(params.barcode_name)""","params":{"barcode_name":"caculate"}}
}

那么在做业务编码时,只需在3个引号中做即可,执行上面的脚本,效果类似

4.2 函数式编程使用

进入es官方文档:https://www.elastic.co/guide/en/elasticsearch/painless/7.10/painless-lang-spec.html ​​​​​​​,可以看到更多关于函数式编程的操作使用,可以结合这些示例进行使用,比如在官方文档中看到可以支持更多的语法,像if,try等

下面结合上述的books这个索引中的相关数据进行操作说明

4.2.1 同时操作多个字段

对当前索引中的id为1005的数据price值+10,同时给每条数据的barcode添加一个新的标签mark,参考如下的语句;

POST /books/_update/1005
{"script": {"lang": "painless", "source": """ctx._source.barcode.add(params.barcode_name);ctx._source.price += 10""","params":{"barcode_name":"mark"}}
}

检查是否执行成功

4.2.2 条件表达式

在script脚本中,也支持对条件表达式的使用,比如在某些情况下需要结合业务对字段进行判断,就可以使用if来处理,如下,是对1005这条数据的操作

POST /books/_update/1005
{"script": {"lang": "painless", "source": """if(ctx._source.price > 100){ctx._source.price = 100;}""","params":{"barcode_name":"mark"}}
}

执行成功后,确认数据是否修改成功

4.2.3 数据统计与聚合

统计数据中price大于100的数据,如下

GET /books/_search
{"aggs": {"big100_total_count": {"cardinality": {"script": {"source":"""if(doc['price'].value < 100) { return null ; } else { return  doc['_id'].value}""","lang": "painless"}}}}
}

执行结果如下,当前查到了2条数据

五、写在文末

es脚本编程在某些特殊的场景下可以发挥很大的用场,也算是es众多高级功能中一个重要的组成部分,合理使用es的脚步语言编程,可以给实际工作带来意想不到的效果,感兴趣的同学可以深入学习。

相关文章:

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…...

Synchronized 关键字

在Java中&#xff0c;线程同步使用最多的方法是使用synchronized关键字。每个Java对象都隐含有一把锁&#xff0c;这里称为Java内置锁(或者对象锁、隐式锁)。使用synchronized(syncObject)调用相当于获取 syncObject 的内置锁&#xff0c;所以可以使用内置锁对临界区代码段进行…...

Maven系列第8篇:大型Maven项目,快速按需任意构建

本篇涉及到的内容属于神技能&#xff0c;多数使用maven的人都经常想要的一种功能&#xff0c;但是大多数人都不知道如何使用&#xff0c;废话不多说&#xff0c;上干货。 需求背景 我们需要做一个电商项目&#xff0c;一般都会做成微服务的形式&#xff0c;按业务进行划分&am…...

卷积神经网络(CNN)的组成结构以及其优点

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理具有网格结构的数据&#xff0c;如图像和视频。它的结构包含以下几个关键组件&#xff1a; 卷积层&#xff08;Convolutional Layer&#xff…...

[③ADRV902x]: Digital Filter Configuration(接收端)

前言 本篇博客主要总结了ADRV9029 Rx接收端链路中各个滤波器的配置。配置不同的滤波器系数以及不同的参数&#xff0c;可以对输入的数字信号灵活得做decimation处理&#xff0c;decimation信号抽取&#xff0c;就是降低信号采样率的过程。 Receiver Signal Path 下图为接收端…...

企业安全—DevSecOps概述详情

0x00 前言 SDL存在的问题在于体量过于庞大&#xff0c;不利于快速进行适配和进行&#xff0c;所以就有了DevSecOps&#xff0c;实际上是因为敏捷开发也就是DevOps的推进&#xff0c;并且坐上了云服务模式的火车&#xff0c;所以这一系列的东西都开始普及。DevSecOps作为DevOps…...

数据结构与算法(十):动态规划与贪心算法

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 动态规划算法 动态规划将一个问题分解为一系列更小的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率 问题&#xff1a;给定一个共有 n 阶的楼梯&#xff0c;你每步可以上 1 阶或…...

【C++代码】安排行程,N皇后,解数独--代码随想录

题目&#xff1a;重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…...

SpringCloud Alibaba【二】nacos

nacos配置与使用 nacos初步使用nacos安装与配置创建命名空间 nacos使用与配置创建新项目作为父项目 创建nacos服务端项目pom.xmlapplication.yml启动类 创建nacos客户端项目pom.xml application.yml启动类 启动测试 nacos配置负载均衡改造生产者nacos-provider-projectcontroll…...

C++中的fsanitize指令

一个集成在 gcc、clang 编译器中的编译指令&#xff0c;可以有效测试程序中的一些诸如数组越界、未定义行为等情况。 举个例子&#xff1a; #include <bits/stdc.h> using namespace std;const int maxn2e55,mxr1e5,maxm1e75; int head[maxn],nxt[maxn],to[maxn],f[max…...

【AI视野·今日Robot 机器人论文速览 第五十八期】Thu, 19 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 19 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers InViG: Benchmarking Interactive Visual Grounding with 500K Human-Robot Interactions Authors Hanbo Zhang, Jie Xu, Yuch…...

Java截取(提取)子字符串(substring()),Java分割字符串(split())

在 String 中提供了两个截取字符串的方法&#xff0c;一个是从指定位置截取到字符串结尾&#xff0c;另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。 1. substring(int beginIndex) 形式 此方式用于提取从索引位置开始至结尾处的字符串部分。调用时&#xff0c…...

从厨房间到股市:家庭主妇的华美转身

我一直是一个安于现状的家庭主妇。生活中&#xff0c;我热爱烹饪、园艺和照顾家人&#xff0c;但我也渴望能有更多的自我实现和价值感。在机缘巧合下&#xff0c;我接触到了卓扬网&#xff0c;一个专业的股票投资平台。从那刻起&#xff0c;我的人生发生了翻天覆地的变化。 初…...

Oracle 数据库的锁排查方法

关键字 oracle lock 问题描述 Oracle 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);Orac…...

混合精度训练原理之float16和float32数据之间的互相转换

混合精度训练原理之float16和float32数据之间的互相转换 本篇文章参考&#xff1a;全网最全-混合精度训练原理 上述文章已经讲解的比较详细&#xff0c;本文只是从数值角度分析&#xff1a; 1. float32转入float16的精度误差 2. 在深度学习的混精度训练当中&#xff0c;当参数…...

网络协议--ICMP:Internet控制报文协议

6.1 引言 ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议&#xff08;TCP或UDP&#xff09;使用。一些ICMP报文把差错报文返回给用户进程。 ICMP报文是在IP数据报内部被传输的&#xff0c;如图6-1所示。 ICMP…...

《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网

目录 一. 在 Windows 操作系统中探测 HTTP/HTTPS 出网 1. Bitsadmin 命令 2.Certuil 命令 2.Linux系统探测HTTP/HTTPS出网 1.Curl命令 2.Wget命令 对目标服务器探测 HTTP/HTTPS 是否出网时&#xff0c;要根据目标系统类型执行命令&#xff0c;不同类型的操作系统使用的探…...

【Win11】系统重装教程(最新最详细)

目录 一.简介 二.用U盘制作PE系统 三、安装系统 软件&#xff1a;Windows 11版本&#xff1a;21H2语言&#xff1a;简体中文大小&#xff1a;5.14G安装环境&#xff1a;PE系统&#xff0c;至少7代处理器硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨…...

如何构建一个外卖微信小程序

随着外卖行业的不断发展&#xff0c;越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势&#xff0c;成为了商家们的首选。 那么&#xff0c;如何快速开发一个外卖微信小程序呢&#xff1f;下面就让我们来看看吧&#xff01; 首…...

小知识(5) el-table行样式失效问题

一、实现效果 子级呈现不同颜色去区分 二、最初代码 tips: 我这里使用的vue3 elementplus <el-table :row-class-name"tableRowClassName" >... </el-table>function tableRowClassName({ row, rowIndex }) {if (row.children.length 0) {return …...

Mysql的卸载与安装

确保卸载干净mysql 不然在进行mysal安装时候会出现不一的页面和问题 1、卸载 在应用页面将查询到的mysql相关应用卸载 2、到c盘下将残留的软件包进行数据删除 3、删除programData下的mysql数据 4、检查系统中的mysql是否存在 cmd中执行 sc deleted mysql80 5、删除注册表中的…...

web前端开发如何适配各分辨率

在开发Web应用时&#xff0c;适配不同的显示器分辨率是确保用户体验一致性的关键。以下是一些常见的显示器分辨率。 常见的显示器分辨率 PC屏幕分辨率 1366 x 768&#xff1a;普通液晶显示器 1920 x 1080&#xff1a;高清液晶显示器 2560 x 1440&#xff1a;2K高清显示器 4096…...

当丰收季遇上超导磁测量:粮食产业的科技新征程

麦浪藏光阴&#xff0c;心田种丰年&#xff01;又到了一年中最令人心潮澎湃的粮食丰收季。金色的麦浪随风翻滚&#xff0c;沉甸甸的稻穗谦逊地低垂着&#xff0c;处处洋溢着丰收的喜悦。粮食产业&#xff0c;无疑是国家发展的根基与命脉&#xff0c;是民生稳定的压舱石。在现代…...

DFT测试之TAP/SIB/TDR

TAP的作用 tap全称是test access port&#xff0c;是将jtag接口转为reset、sel、ce、ue、se、si、tck和so这一系列测试组件接口的模块。 jtag的接口主要是下面几个信号&#xff1a; 信号名称信号方向信号描述TCK&#xff08;测试时钟&#xff09;输入测试时钟&#xff0c;同…...

DDD架构实战 领域层 事件驱动

目录 核心实现&#xff1a; 这种实现方式的优势&#xff1a; 在实际项目中&#xff0c;你可能需要&#xff1a; 事件驱动往往是在一个微服务内部实现的 领域时间是DDD架构中比较常见的概念 在领域层内部的一个模型更改了状态或者发生了一些行为 向外发送一些通知 这些通…...

基于5G下行信号的模糊函数分析matlab仿真,对比速度模糊函数和距离模糊函数

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB部分程序 5.算法涉及理论知识概要 6.参考文献 7.完整算法代码文件获得 1.引言 模糊函数&#xff08;Ambiguity Function, AF&#xff09;是信号处理领域用于分析信号时频分辨能力的核心工具&#xf…...

Devops系列---python基础篇二

1、列表 1.1 概念 格式&#xff1a; 名称 [ “元素1”,“元素2”,…] #定义一个列表 computer ["主机","键盘","显示器","鼠标"]类型方法用途查index(“元素”)查看元素索引位置count(“元素”)统计元素出现的次数reverse()倒序排…...

设计模式复习小结

1.容易忘得设计原则 接口隔离&#xff1a;指接口中的功能太杂则可以拆分一下。防止实现类实现了接口后自动依赖了一些不需要的功能。不同功能拆分成不同的接口。 里氏代换&#xff1a;强调父类能出现的地方&#xff0c;子类一定能正常跑。 迪米特法则&#xff1a;又称最少知…...

Web前端之原生表格动态复杂合并行、Vue

MENU 效果公共数据纯原生StyleJavaScript vue原生table 效果 原生的JavaScript原生table null 公共数据 const list [{id: "a1",title: "第一列",list: [{id: "a11",parentId: "a1",title: "第二列",list: [{ id: "…...

阿里云ACP云计算备考笔记 (3)——云存储RDS

目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…...