Elasticsearch 8.X reindex 源码剖析及提速指南
1、reindex 源码在线地址
为方便大家验证,这里给出 reindex github 源码地址。
https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java
reindex 常见问题:
2、reindex 源码本质
reindex 操作的本质是从一个或多个源索引中读取文档,并将这些文档索引到一个目标索引中,可能还涉及对文档的某些转换。
以下是从源码中得出的 reindex 操作的关键点:
2.1 源和目标
ReindexRequest 定义了源索引(从中读取文档)和目标索引(将文档索引到其中)。
2.2 查询和过滤
可以为源索引定义一个查询(使用 setSourceQuery 方法),以确定哪些文档应该被重新索引。
也就是可以迁移满足给定检索语句的数据。
2.3 文档转换
如果提供了一个脚本,它可以在文档从源索引移动到目标索引之前对文档进行修改或转换。
2.4 批量处理
文档是批量从源索引读取并批量索引到目标索引的。
批处理的大小可以通过 setSourceBatchSize 方法进行调整。
这个值究竟可以多大,源码并没有明示。但是如下规则咱们得知道!
设置一个非常大的滚动大小仍然可能会对集群造成压力,因为它会增加内存使用和集群节点之间的数据传输。
因此,选择一个合适的滚动大小是很重要的,以确保在取得良好性能的同时,不会过度压迫集群。
2.5 远程源索引
![0bf1afb2cd394530fe06d0f7693dbbf1.png](https://img-blog.csdnimg.cn/img_convert/0bf1afb2cd394530fe06d0f7693dbbf1.png)
reindex 不仅可以在当前 Elasticsearch 集群中的索引之间移动文档(如图 1 所示),还可以从一个远程的 Elasticsearch 集群读取文档(如图 2 所示)。
![60833f888d07396a58988488a539e460.png](https://img-blog.csdnimg.cn/img_convert/60833f888d07396a58988488a539e460.png)
这是通过 RemoteInfo 类实现的,它包含了远程集群的所有必要信息。
包含信息如下:
远程集群的地址(可能是一个 URL 或 URI)
认证信息(例如用户名和密码)
请求头(为远程请求定制的特定头信息)
连接超时和套接字超时
其他与远程集群交互所需的配置信息
2.6 验证
在执行 reindex 操作之前,会进行一系列的验证检查(使用 validate 方法),以确保请求是合法的。
2.7 序列化/反序列化
ReindexRequest 类包含了将请求序列化到网络传输格式并从该格式反序列化的方法。
这允许 Elasticsearch 节点之间有效地通信并执行 reindex 请求。
2.8 输出
ReindexRequest 可以被转化为一个描述性的字符串(使用 toString 方法)或一个XContent格式(通常是JSON,使用 toXContent 方法),这对于日志记录和调试非常有用。
总结起来,reindex 操作的本质是从源索引读取文档、可能进行一些转换,然后将这些文档索引到目标索引。
此操作可以在当前集群的索引之间进行,也可以跨集群进行。这是一种强大的方式,可以用于数据迁移、索引重组、数据转换等任务。
3、reindex 加速
重新索引操作的速度受多个因素的影响, 如果希望加速 reindex 操作,以下是一些建议:
3.1 调整批次大小:
ReindexRequest 有一个 setSourceBatchSize 方法,允许我们设置每批处理的文档数量。
/*** Sets the scroll size for setting how many documents are to be processed in one batch during reindex*/public ReindexRequest setSourceBatchSize(int size) {this.getSearchRequest().source().size(size);return this;}
增加批次大小可能会提高性能,但请注意,太大的批次可能会导致内存问题或请求超时。
3.2 slice 并行处理
slice 在 Elasticsearch 的重索引操作中确实可以帮助提速。slice 是一种将大型查询分解为多个较小部分并并行执行它们的方法,从而使整体操作更快。
在 ReindexRequest 类中,我们可以看到方法 forSlice(TaskId slicingTask, SearchRequest slice, int totalSlices),它允许我们为给定的滚动请求创建一个子切片。
如何实操?
关于设置切片数量: 当我们执行重索引操作时,可以设置 slices 参数来指定我们想要的切片数。
例如,如果我们选择 slices: 5,那么 Elasticsearch 将尝试将查询拆分成5个子查询,并尽可能均匀地分布文档。
并行执行提速
使用切片后,每个切片都可以在单独的线程或节点上并行执行。这样,如果我们有多个节点或足够的资源,切片可以显著提高重索引的速度。
实际命令:
在 Elasticsearch REST API 中,进行带切片的重索引操作的命令可能如下:
POST _reindex
{"source": {"index": "old_index","size": 1000,"slice": {"id": 0,"max": 5}},"dest": {"index": "new_index"}
}
在上面的命令中,我们将原始索引分成了5个切片,并使用 id 参数来指定当前切片的编号。
要并行执行所有切片,需要为每个切片编号运行此命令(在此例中,从0到4)。
slice 注意事项
虽然切片可以加速操作,但它也会增加集群的负担,因为每个切片都会创建自己的滚动上下文。确保的 Elasticsearch 集群有足够的资源来处理我们选择的切片数量。
切片操作的最佳数量取决于数据、查询和集群配置。可能需要进行一些性能测验来找到最佳的切片数量。
总的来说,slice 可以显著提高重索引操作的速度(一会我们验证一把,用事实证明),但需要确保正确使用它,以便在提高速度的同时不过度负担集群。
3.3 优化查询
如果我们在 reindex 请求中使用了查询来筛选文档,确保该查询是优化的。避免使用复杂或低效的查询。比如:复杂嵌套查询、wildcard模糊查询等都尽量避免。
3.4 增加硬件资源
增加 Elasticsearch节点的 CPU、内存和I/O能力可以提高 reindex 的速度。
如果我们正在从远程集群进行重新索引,确保两个集群都有足够的资源。
这种针对数据量极大的情况。
3.5 优化索引设置:
在目标索引上临时禁用一些功能,如刷新和副本。完成 reindex 后,再启用它们:
设置 index.number_of_replicas
为 0 以禁用副本。
设置 index.refresh_interval
为 -1 以禁用刷新。
3.6 使用 Ingest Pipelines
如果我们正在在 reindex 操作中使用脚本对文档进行转换,考虑使用 Ingest Pipelines,这可能比脚本更高效。
3.7 网络优化
如果从远程集群重新索引,确保网络连接是高速、低延迟的。限制其他网络密集型操作的使用,以确保 reindex 请求可以充分利用带宽。
这属于边缘化建议,一般常识属于必知必会的。
3.8 限制其他操作
尝试在集群的非高峰时段执行 reindex 操作,并限制执行其他资源密集型操作,如大型搜索或其他索引操作(如段合并等)。
3.9 检查插件和外部脚本
确保没有任何插件或外部脚本影响 reindex 操作的性能。
3.10监控并调优
使用Elasticsearch的监控工具,如 Elastic Stack 的监控功能,来监控 reindex 操作的性能。这可以帮助我们识别瓶颈并进行相应的调优。
考虑到这些建议,最好在生产环境中进行测试,以找到最佳的设置和优化策略。
4、reindex 借助 slice 加速验证
4.1准备工作
条件1——选择或创建一个足够大的数据。
需要一个大型索引,这样性能差异才会明显。小数据集可能不会显示出明显的差异。
条件2——确保集群健康。
确保 Elasticsearch 集群在开始测试之前是健康的,所有节点都是在线的,没有挂起的任务。
条件3——关闭其他大型操作。
确保集群上没有其他大型查询或索引操作在运行,以免影响性能测试结果。
4.2 不使用 slice 的重索引
记录开始时间。
使用 _reindex API 执行重索引操作,但不使用 slice。
记录完成时间。
计算持续时间。
## 第一种:直接迁移。"took": 4005,POST _reindex
{"source": {"index": "image_index"},"dest": {"index": "image_index_direct"}
}GET image_index_direct/_count
4.3 使用 slice 的重索引
选择一个切片数量:例如,如果有5个数据节点,我们可能想尝试5个切片。
记录开始时间。
使用 _reindex API 执行重索引操作,为每个切片创建一个单独的请求。可以使用并发工具(如 parallel 命令或脚本)来并行运行所有的请求。
记录所有切片完成的时间。
计算总持续时间。
## 第二种,加了并行处理!POST _reindex
{"source": {"index": "image_index","slice": {"id": 0,"max": 5}},"dest": {"index": "image_index_slice"}
}
4.4 比较
比较两次重索引的总时间。理论上,使用 slice 的版本应该更快,尤其是在有多个节点和大量数据的集群中。
如下视频所示,我优先小范围做了验证。
数据量 16MB,上万条数据迁移结果对比:
迁移方式 | 耗时 |
---|---|
直接迁移 | 4005ms |
slice迁移 | 1123ms |
数据量 112MB,15万条长津湖影评数据迁移结果对比:
迁移方式 | 耗时 |
---|---|
直接迁移 | 30000ms左右(事后视频回放看到的) |
slice迁移 | 10263ms |
综上两种数量级不同数据的 reindex 结果可以看出,加了 slice 能提速 3-4倍!
更多节点规模集群和大规模数据,期待大家留言反馈结果。
5、小结
有了方案,更多的付诸实践,拿出结果才更有谁服力!
加油!
推荐阅读
全网首发!从 0 到 1 Elasticsearch 8.X 通关视频
重磅 | 死磕 Elasticsearch 8.X 方法论认知清单
如何系统的学习 Elasticsearch ?
2023,做点事
干货 | Elasticsearch Reindex性能提升10倍+实战
更短时间更快习得更多干货!
和全球 近2000+ Elastic 爱好者一起精进!
大模型时代,抢先一步学习进阶干货!
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/66e844f9e4befc913c1b758b7e89710a.gif)
Elasticsearch 8.X reindex 源码剖析及提速指南
1、reindex 源码在线地址 为方便大家验证,这里给出 reindex github 源码地址。 https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java reindex 常见…...
![](https://img-blog.csdnimg.cn/img_convert/7249b94c2dc5dda1ee1ca18dde29a90f.png#?w=926&h=334&e=png&b=ffffff)
前端组件库造轮子——Input组件开发教程
前端组件库造轮子——Input组件开发教程 前言 本系列旨在记录前端组件库开发经验,我们的组件库项目目前已在Github开源,下面是项目的部分组件。文章会详细介绍一些造组件库轮子的技巧并且最后会给出完整的演示demo。 文章旨在总结经验,开源…...
![](https://www.ngui.cc/images/no-images.jpg)
Day04-Vue基础-监听器-双向绑定-组件通信
Day04-Vue基础-监听器-双向绑定-组件通信 一 侦听器 语法一 <template><div>{{name}}<br><button @click="update1">修改1</button><...
![](https://img-blog.csdnimg.cn/a5d6006c20724f6eaaf57f148e724c05.png)
Java小白基础自学阶段(持续更新...)
引言 Java作为一门广泛应用于企业级开发的编程语言,对初学者来说可能会感到有些复杂。然而,通过适当的学习方法和资源,即使是小白也可以轻松掌握Java的基础知识。本文将提供一些有用的建议和资源,帮助小白自学Java基础。 学习步骤…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue自定义指令- v-loading封装
Vue自定义指令- v-loading封装 文章目录 Vue自定义指令- v-loading封装01-自定义指令自定义指令的两种注册语法: 02自定义指令的值03-自定义指令- v-loading指令封装 01-自定义指令 什么是自定义指令? 自定义指令:自己定义的指令,…...
![](https://www.ngui.cc/images/no-images.jpg)
C++中提供的一些关于查找元素的函数
C中提供的所有关于查找的函数 std::find(begin(), end(), key) std::find(begin(), end(), key):这个函数用于在一个范围内查找一个等于给定值的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。 1.1 例如ÿ…...
![](https://img-blog.csdnimg.cn/42f55eab8f1846d2ada1692ac50478f9.png)
Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径
目录 802.11MAC帧基本概念 802.11帧结构 802.11MAC帧的分类 管理帧 控制帧 数据帧 STA接入无线网络流程 信号扫描—管理帧 链路认证—管理帧 用户关联—管理帧 用户上线 不同802.11帧的转发路径 802.11MAC帧基本概念 802.11协议在802家族中的角色位置 其中802.3标…...
![](https://img-blog.csdnimg.cn/d26c9f2ca90340ed88cc03348261a192.png)
Python|爬虫和测试|selenium框架模拟登录示例(一)
前言: 上一篇文章Python|爬虫和测试|selenium框架的安装和初步使用(一)_晚风_END的博客-CSDN博客 大概介绍了一下selenium的安装和初步使用,主要是打开某个网站的主页,基本是最基础的东西,那么,…...
![](https://www.ngui.cc/images/no-images.jpg)
QT的概述
什么是QT Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 QT项目的创建 .pro文件 .pro 文件是一个Qt项目文件,用于定义…...
![](https://www.ngui.cc/images/no-images.jpg)
Hive 导入csv文件,数据中包含逗号的问题
问题 今天 Hive 导入 csv 文件时,开始时建表语句如下: CREATE TABLE IF NOT EXISTS test.student (name STRING COMMENT 姓名,age STRING COMMENT 年龄,gender STRING COMMENT 性别,other_info STRING COMMENT 其他信息 ) COMMENT 学生信息表 ROW FORM…...
![](https://img-blog.csdnimg.cn/1210557096824c39842642ef7ae8d840.png)
1、Odoo开发起点
1.1.odoo的模块组成 init.py将一个文件夹编程python包manifestpyodoo模块定义的清单文件,用于对odoo模块管理详见model模型类文件,存放py文件security表级别权限管理static静态文件views视图文件。wizard瞬态模型向导文件位置 1.2.odoo的开发规范 非强…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu22.04 交叉编译树莓派CM4 kernel
通过这个文章记录一下如何在Ubuntu22.04编译树莓派CM4的kernel。 主要参考树莓派官网的方法,也总结了一些关于SD卡分区的知识。 1,虚拟机安装Ubuntu 22.04,就不介绍了。 2,先将树莓派官方系统烧录倒SD卡中,设备能正…...
![](https://www.ngui.cc/images/no-images.jpg)
稀疏矩阵搜索(两种方法解决:1.暴力+哈希 2.二分法)
题目: 有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。 示例: 输入: words ["at", "", "", "", "ball", "", &…...
![](https://www.ngui.cc/images/no-images.jpg)
NodeJS系列教程、笔记
NodeJS系列教程、笔记 点我进入专栏 Node.js安装与基本使用 NodeJS的Web框架Express入门 Node.js的sha1加密 Nodejs热更新 Nodejs配置文件 Nodejs的字节操作(Buffer) Node.js之TCP(net) Node.js使用axios进行web接口调用 …...
![](https://img-blog.csdnimg.cn/bbed20210320404882bba58bd261bf5c.png)
4.4TCP半连接队列和全连接队列
目录 什么是 TCP 半连接队列和全连接队列? TCP 全连接队列溢出 如何知道应用程序的 TCP 全连接队列大小? 如何模拟 TCP 全连接队列溢出的场景? 全连接队列溢出会发生什么 ? 如何增大全连接队列呢 ? TCP 半连接队列溢出 如何查看 TC…...
![](https://img-blog.csdnimg.cn/img_convert/21c4e5e848b4d9d25ea207fa47722a44.png)
一键实现 Oracle 数据整库同步至 Apache Doris
在实时数据仓库建设或迁移的过程中,用户必须考虑如何高效便捷将关系数据库数据同步到实时数仓中来,Apache Doris 用户也面临这样的挑战。而对于从 Oracle 到 Doris 的数据同步,通常会用到以下两种常见的同步方式: OGG/XStream/Lo…...
![](https://img-blog.csdnimg.cn/img_convert/a7b759d951afa207f28801c7fc8edeb0.jpeg)
Unity3D软件安装包分享(附安装教程)
目录 一、软件简介 二、软件下载 一、软件简介 Unity3D是一款全球知名的游戏开发引擎,由Unity Technologies公司开发。它提供了一个跨平台、多功能的开发环境,支持创建2D和3D游戏、交互式应用、虚拟现实、增强现实等多种类型的应用程序。以下是Unity3D…...
![](https://img-blog.csdnimg.cn/b4399956242449eb85721d4f3a326e27.png)
Vue2向Vue3过度Vue3组合式API
目录 1. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势3 使用create-vue搭建Vue3项目1. 认识create-vue2. 使用create-vue创建项目 4 熟悉项目和关键文件5 组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖 6 组合式…...
![](https://img-blog.csdnimg.cn/img_convert/1558f821cacf965270d4c5af7fc66cc3.png)
⛳ Docker 安装 MySQL
🎍目录 ⛳ Docker 安装 MySQL🚜 一、搜索 mysql , 查看版本🎨 二、拉取mysql镜像👣 三、建立容器的挂载文件🧰 四、创建mysql配置文件,my.conf🏭 五、根据镜像产生容器🎁 六、远程连…...
![](https://img-blog.csdnimg.cn/53b49a79baae4d20bb806a1a8944c306.png)
4.6 TCP面向字节流
TCP 是面向字节流的协议,UDP 是面向报文的协议 操作系统对 TCP 和 UDP 协议的发送方的机制不同,也就是问题原因在发送方。 UDP面向报文协议: 操作系统不会对UDP协议传输的消息进行拆分,在组装好UDP头部后就交给网络层处理&…...
![](https://img-blog.csdnimg.cn/84505b82cbd94d72943db3a6b33761ce.png)
uniapp返回上一页并刷新
在uniapp中,经常会有返回上一页的情况,官方提供有 uni.navigateBack 这个api来实现效果,但是此方法返回到上一页之后页面并不会更新(刷新)。 例如有这样一个场景:从地址列表页点击添加按钮进入添加地址页面…...
![](https://www.ngui.cc/images/no-images.jpg)
LRU cache的实现细节优化——伪结点的技巧
LRU cache的实现是面试常见的题目,思路比较简单,可以参考思路 这个题目在实际面试中容易出错,主要是npe和头节点与尾节点的更新,有没有办法避免这一点呢,这时可以发现伪节点的好处,永远不用更新头尾节点&am…...
![](https://img-blog.csdnimg.cn/0063fb3a8f93470195438191bce83553.gif#pic_center)
【C/C++】父类指针指向子类对象 | 隐藏
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
![](https://img-blog.csdnimg.cn/2b28c067bc63484db4abb0bd3591e364.png)
NSSCTF——Web题目2
目录 一、[HNCTF 2022 Week1]2048 二、[HNCTF 2022 Week1]What is Web 三、[LitCTF 2023]1zjs 四、[NCTF 2018]签到题 五、[SWPUCTF 2021 新生赛]gift_F12 一、[HNCTF 2022 Week1]2048 知识点:源代码审计 解题思路: 1、打开控制台,查看…...
![](https://img-blog.csdnimg.cn/7c45535769864a7e9edc3ca6d5ef6514.jpeg)
从零到富:探索CSGO搬砖项目的无限可能
在如今互联网时代,有一项令人惊叹的项目正悄然兴起,它就是CSGO搬砖项目。作为一个从零开始的家伙,我亲身经历了这个项目的神奇魅力,每天轻松赚取几十上百的收益,无风险,低成本。今天,我将带领大…...
![](https://www.ngui.cc/images/no-images.jpg)
Uniapp中vuex的使用
vuex的学习笔记,很多地方还都不是很懂,先记下来再说,比小程序里自带的store复杂很多,看着头大,而且方法里面很多ES6的内容,头都看到爆炸 一、初始化vuex 新建store.js,挂载到main.js 1、在根…...
![](https://img-blog.csdnimg.cn/0a7465078f214fb29b05faa92adcca7b.png)
SpringBoot案例-配置文件-参数配置化
前言 目前我们已经完成了部门管理和员工管理功能接口的实现,阿里云OSS工具类中,我们会设置4个参数,分别是云服务域名、云服务ID和密码、文件存储的Bucket、就会存在以下问题:参数配置分散以及参数发生变化,就需要对应…...
![](https://img-blog.csdnimg.cn/d6230877116f488f96707eb658e00048.png)
android系统启动流程之zygote(Native)启动分析
zygote有一部分运行在native,有一部分运行在java层,它是第一个进入java层的进程 zygote在启动时,在init.${ro.zygote}.rc脚本中,里面描述了zygote是如何被启动的, 当init进程解析到zygote.rc文件时,将根据解析出来的命…...
![](https://www.ngui.cc/images/no-images.jpg)
Win10上ffmpeg出现Invalid report file level
在win10上经常使用ffmpeg,但是最近突然ffmpeg用不了,不管ffmpeg还是ffplay,输出始终一句话: Invalid report file level 重新通过scoop装了以后还是同样的错误。 后来发现是一个环境变量设置有问题,FFREPORT。 我在w…...
![](https://img-blog.csdnimg.cn/e51450642d5d41a79e7ee638bcb7bd5c.png)
Vue3 中引入液晶数字字体(通常用于大屏设计)
一、下载 .ttf 字体文件到本地,放在 src 中的 assets 文件下 下载液晶字体 DS-Digital.ttf 二、在 css 文件中引入字体 /* src/assets/fonts/dsfont.css */ font-face {font-family: electronicFont;src: url(./DS-Digital.ttf);font-weight: normal;font-styl…...
![](/images/no-images.jpg)
做自媒体都有什么网站/营销网站
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结…...
![](/images/no-images.jpg)
做公司网站建设价格/如何在手机上建立自己的网站
说明 上一次碰到了时间轴的前置问题,篇幅拉的太长,所以这篇继续完成MyQuantBase的取数加工问题。说起来,时间轴的使用计划由来已久,现在只是开始正式的去使用。关于时间轴,可能还有一些概念需要补充。 内容 1 时间轴…...
![](/images/no-images.jpg)
网站建设陕西/如何联系百度平台客服
本文实例为大家分享了python制作英文字典的具体代码,供大家参考,具体内容如下功能有添加单词,多次添加单词的意思,查询,退出,建立单词文件。keys[]dic{}def rdic():fr open(dic.txt,r)for line in fr:line…...
![](https://img-blog.csdnimg.cn/20200719143913116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dqaW5qaWU=,size_16,color_FFFFFF,t_70#pic_center)
wordpress 删除分类目录/深圳搜索引擎优化收费
大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、数据结构与算法、编程 等感兴趣,可以关注我的动态,我们一起学习&…...
![](https://images2015.cnblogs.com/blog/191890/201702/191890-20170210184148729-2087483916.jpg)
做网站需要投资多少钱/百度推广入口登录
转载于:https://www.cnblogs.com/xiaoyaogege/p/6387613.html...
![](https://img-blog.csdnimg.cn/img_convert/5e9aabbf4535aee52434078a5469af03.png#pic_center)
企业外贸营销型网站/营销页面
文章目录2、 输入控件(一)2.1 纯键盘2.1.1 QLineEdit2.1.1.1 描述2.1.1.2 控件创建2.1.1.3 输出模式2.1.1.4 提示字符串2.1.1.5 清空按钮2.1.1.6 添加操作行为2.1.1.7 自动补全2.1.1.8 输入限制2.1.1.8.1 语法2.1.1.8.2 掩码验证2.1.1.9 案例:…...