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

搜文本搜位置搜图片,1小时玩转阿里云 Elasticsearch

作者:朱杰、奚悦、黄宇

AI 和搜索的整合已成为下一代搜索引擎的发展趋势,技术革新的浪潮下,你是否想抓住搜索领域的新机会,增强 AI 产品力与技术竞争力?

想学习搜索引擎技术的你,是否面临这样的困惑:

  • 初学实操搭建,缺少指导解惑,刚起步就困在原地
  • 对基础搜索不够了解,怎样构建更高阶的搜索应用
  • 自学搜索引擎难度大,工作中也没有实操的机会
  • 向量检索、多模态搜索、混合搜索,只听过没用过,不知从哪入手

加入 Elasticsearch 训练营,从全文检索到向量检索,搭建高频业务场景,构建进阶向量检索应用。带你拓展技术视野,晋升 Elasticsearch 搜索实战派。

立即学习 搜文本搜位置搜图片,玩转Elasticsearch-阿里云开发者社区-阿里云

学习专属权益

  • 基础学习环境:新用户免费试用阿里云检索分析服务 Elasticsearch 版一个月
  • 打卡拿周边:完成指定打卡任务,可获得Elastic社区周边
  • 结业赢好礼:完成参营学习任务,赢阿里云开发者社区定制礼品

循序渐进的场景实战

  • Elasticsearch 基础检索

       包含业务场景中高频应用的【全文检索】,同时可拓展学习【多语言检索】和【地理位置查询】

  • 基于 Elasticsearch 向量检索的以文搜图

      实现图片和文本的跨模态相似性比对检索,搭建基于向量检索的以文搜图的搜索服务原型

【以文搜图】实验课程先览

1. 以文搜图的实现原理

区别于传统的文本关键词搜索,现代的文本语义搜索、相似图片搜索、还有文本搜索图片的跨模态搜索普遍采用向量相似搜索的方式来实现。基本原理是将文本、图片通过深度学习模型映射到一个高纬度的向量空间,然后通过衡量向量的相似程度就可以找到最相关的文本或者图片。

下面就分 5 个方面详细讲解文本搜索图片、图片搜索图片应用所需的每个组件的基本概念和技术细节:

  • 嵌入模型:把要搜索的数据转化为向量的机器学习模型
  • 推理API:Elastic 中调用模型进行推理的 API
  • 生成图像嵌入:调用嵌入模型将图像转化为向量
  • 向量搜索:通过向量最近邻搜索实现相似性搜索
  • 应用逻辑:前端程序与后端向量搜索引擎 Elasticsearch 通信

嵌入模型

要将相似性搜索应用于自然语言或图像数据,你需要使用机器学习模型将数据转换为数值表示,也称为向量嵌入(embeddings)。在这个例子中:

  • NLP “transformer” 模型将自然语言转化为向量。
  • OpenAI CLIP(对比语言-图像预训练)模型对图像进行向量化。

NLPTransformer 模型是经过训练处理自然语言数据的机器学习模型,例如语言翻译、文本分类或命名实体识别。他们接受了大量的带注释文本数据集的训练,以学习人类语言的模式和结构。

图像相似性应用程序根据文本、自然语言描述找到匹配的图像。要实现这种相似性搜索,你需要一个在文本和图像上都经过训练并且可以将文本查询转换为向的模型。

CLIP 是 OpenAI 开发的一种可以处理文本和图像的大规模语言模型。给定一小段文本作为输入,该模型被训练来预测图像的文本表示。这涉及到将图像的视觉
和文本表示关联起来的学习过程,然后才能进行准确的预测。

CLIP 的另一个重要方面是它是一个“零样本”模型,允许它执行没有经过专门训练的任务。例如,它可以对训练期间从未见过的语言进行翻译,或者将图像分类到以前从未见过的类别中。这使得 CLIP 成为一个非常灵活和通用的模型。

推理 API

一旦将 NLP 模型加载到 Elasticsearch 中,你就可以处理实际的用户查询。首先,你需要使用 Elasticsearch_infer API 将查询文本转换为向量。该 API 提供了一种在 Elastic 中原生使用 NLP 模型的内置方法,不需要查询外部服务,从而显著简化了实施。

POST _ml/trained_models/sentence-transformers__clip-vit-b-32-multilingual-v1/deployment/_infer
{"docs": [{"text_field": "A mountain covered in snow"}]
}

生成图像嵌入

上面提到的图像嵌入对于图像相似性搜索的效果至关重要。它们应该存储在一个单独的索引中,该索引包含图像向量,在上面的代码中称为 your-image-index。
该索引由每个图像的文档以及上下文字段和图像的密集向量组成。图像向量表示低维空间中的图像。相似的图像被映射到这个空间中的附近点。原始图像可能有几 MB 大,具体取决于其分辨率。

如何生成这些向量的具体细节可能会有所不同。一般来说,这个过程涉及从图像中提取特征,然后使用数学函数将它们映射到低维空间。该函数通常在大量图数据集上进行训练,以学习在低维空间中表示特征的最佳方式。生成向量是一项一次性任务。

在这个项目中我们将使用 CLIP 模型。你可能需要为专门的用例训练自定义嵌入模型以实现所需的性能,具体取决于你要分类的图像类型在用于训练 CLIP 模型的公开可用数据中的表现程度。

Elastic 中的嵌入生成需要在数据写入时发生,步骤如下:

  • 加载 CLIP 模型。
  • 对于每个图像:
  • 加载图像。
  • 使用模型评估图像。
  • 将生成的向量保存到文档中。
  • 将文档保存到 Elasticsearch 中。

处理后的文档如下所示。关键部分是存储密集向量表示的字段 image_embedding:

{"_index":"my-image-embeddings","_id":"_g9ACIUBMEjlQge4tztV","_score":6.703597,"_source":{"image_id":"IMG_4032","image_name":"IMG_4032.jpeg","image_embedding":[-0.3415695130825043,0.1906963288784027,.....-0.10289803147315979,-0.15871885418891907],"relative_path":"phone/IMG_4032.jpeg"}
}

向量相似度搜索

在使用嵌入模型对查询和文档进行向量化后,相似文档是向量空间中查询的最近邻居。实现该目标的一种流行算法是 k 最近邻 (kNN),它找到与查询向量最近
的k个向量。但是,对于你通常在图像搜索应用程序中处理的大型数据集,kNN 需要非常高的计算资源,并可能导致执行时间过长。作为一种解决方案,近似最近邻 (ANN) 搜索牺牲了完美的准确性,以换取在大规模高维向量空间中高效地执行。

在 Elastic 中,_search API 支持精确和近似最近邻搜索。使用下面的代码进行 kNN 搜索。它假定 your-image-index 中所有图像的向量都在 image_embedding 字段中。

# Run kNN search against<query-embedding> obtained above
POST <your-image-index>/_search
{"fields":[...],"knn":{"field":"image_embedding","k":5,"num_candidates":10,"query_vector":<query-embedding>}
}

应用逻辑

在这些基本组件的基础上,你最终可以将所有部分组合在一起来实现交互式图像相似性搜索。让我们从概念上开始,了解当你想要以交互方式检索匹配的图像时
需要发生的事情。

对于文本查询,输入可以简单到像 "roses" 这样的单个词,也可以是更广泛的描述,如 “a mountain covered in snow”。或者你也可以提供一张图片并要求提供与你图片相似的图片。

尽管你使用不同的模式来查询,但两者在底层向量搜索中都是使用相同的步骤执行,即对密集向量表示的文档使用 kNN 查询。我们在前面的部分中描述了使 Elasticsearch 能够对大型图像数据集执行非常快速和可扩展的向量搜索的机制。

那么如何实现上述逻辑呢?在下面的流程中,你可以看到信息是如何流动的:用户发出的查询,作为文本或图像,由嵌入模型向量化——取决于输入类型:NLP
模型用于文本描述,而 CLIP 模型用于图像。两者都将输入转换为它们的向量表示,并将结果存储为 Elasticsearch 中的密集向量类型([number, number,
number...])。


然后在 kNN 搜索中使用向量表示来查找相似的向量(图像),这些向量作为结果返回。

推理:用户查询向量化

后台的应用程序会向Elasticsearch中的推理API发送请求。对于文本输入,是这样的:

POST _ml/trained_models/sentence-transformers__clip-vit-b-32-multilingual-v1/deployment/_infer
{"docs": [{"text_field": "Amountaincoveredinsnow"}]
}

对于图像,你可以使用以下简化代码使用 CLIP 模型处理单个图像

model = SentenceTransformer('clip-ViT-B-32')
image = Image.open(file_path)
embedding = model.encode(image)

你将得到一个 512 长的 Float32 值数组,如下所示:

{"predicted_value": [-0.26385045051574707,0.14752596616744995,0.4033305048942566,0.22902603447437286,-0.15598160028457642,...]
}

搜索:寻找相似的图片

对于两种类型的输入,搜索工作相同。将带有kNN搜索定义的查询发送到带有图像向量 my-image-embeddings 的索引。放入先前查询的密集向量 (”query_vector":  [...]) 并执行搜索

GET my-image-embeddings/_search
{"knn":{"field":"image_embedding","k":5,"num_candidates":10,"query_vector":[-0.19898493587970734,0.1074572503566742,-0.05087625980377197,...0.08200495690107346,-0.07852292060852051]},"fields":["image_id","image_name","relative_path"],"_source":false
}

Elasticsearch 的响应将根据我们的 kNN 搜索查询为你提供存储在 Elasticsearch 中最匹配的图像。

下面的流程总结了交互式应用程序在处理用户查询时所经历的步骤:

  1. 加载交互式应用程序,它的前端。
  2. 用户选择他们感兴趣的图像。
  3. 你的应用程序通过应用 CLIP 模型将图像向量化,并将生成的向量存储为密集向量类型。
  4. 应用程序在 Elasticsearch 中启动 kNN 查询,它获取向量并返回其最近的邻居。
  5. 你的应用程序处理响应并呈现一个(或多个)匹配图像。

2. 课程实验详情

本实验将阿里云 Elasticsearch 作为支持向量近邻搜索的向量查询引擎,结合在 Elasticsearch 实例部署开源模型,将查询文本的语义特征向量化的方式,将文本和图片映射到同一个向量空间,实现图片和文本的跨模态相似性比对检索,搭建基于向量检索的以文搜图的搜索服务原型,并使用阿里云 Serverless 应用引擎 SAE 实现了前端 web 应用 demo。

说明:本实验由阿里云与Elastic公司合作创作,实验原始代码来源于 flask-elastic-nlp 项目,点击查看 Github 项目地址。

2.1 领取实验产品资源

本实验场景使用的实验资源和配置,说明如下:

  • 资源规格说明:本示例遵循最小原则,使用满足场景需求的最小资源。
  • 免费试用说明:首购客户可以免费试用 Serverless 应用引擎 SAE、传统型负载均衡 CLB 可以使用免费试用资源。
  • 付费说明:本实验推荐使用阿里云 Elasticsearch 4C8G 规格的按量付费资源,
  • 计费标准 3.7 元起/时(不同地域价格略有差异);如果用户没有 SAE 免费试用领取资格,推荐使用 SAE2C4G 规格的按量付费资源,计费标准为单实例0.0074074 元/min。

具体配置项说明和资源领取步骤,请参见 搜文本搜位置搜图片,玩转Elasticsearch-阿里云开发者社区-阿里云

2.2 实验步骤

2.2.1 创建配置 Elasticsearch 部分

1. 进入控制台,找到 Elasticsearch 所在的地域,从实例列表页找到实验需要使用 ES 的实例:

2. 点击实例 ID 或 “管理”,进入实例详情页,可查看ES的实例所在的专有网络、私网地址、私网端口等信息;

 3. 进入安全配置,确认 VPC 私网访问白名单是否包含 ES 实例所在的专有网络的全部网段:

专有网络网段可以进入专有网络列表页查看:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

4. 进入可视化控制,在修改配置页修改 Kibana 公网访问白名单为本机 IP:

5. 点击公网入口进入 Kibana,正确输入用户名密码后,即可登录。用户名默认为:elastic;密码为实例创建时输入的自定义密码。

6. 左侧菜单栏 “Management” 进入 “开发工具

7. 通过快照恢复方式将数据集和模型导入到 ES 实验实例中:

1)创建快照仓库并指定公共读的阿里云 OSS bucket 作为源存储库

 代码

PUT _snapshot/my_backup/
{"type": "oss","settings": {"endpoint": "http://oss-rg-china-mainland.aliyuncs.com","bucket": "es-image-search","base_path": "snapshot/","readonly": true,"access_key_id": "xxxx","secret_access_key":"xxxx","region": "oss-rg-china-mainland"}
}

说明:“access_key_id” 和 “secret_access_key” 字段的具体信息,请进入课程学习钉群(群号:28810034388)在群公告处获取。

2)从公共读的 OSS 中恢复快照到当前实验实例中:

代码

POST /_snapshot/my_backup/snapshot_1/_restore
{"indices": "image-embeddings","feature_states": ["machine_learning"],"ignore_unavailable": true,"include_global_state": false
}

3)确认数据已同步完毕:

左侧菜单栏 “Management” 进入 “Stack Management”的“ 索引管理”模块,确认 “image-embeddings” 和 ".ml-inference-native-000001" 大小和下图一致:

8. 左侧菜单栏 “Analytics” 进入 “Machine Learning” 中 “同步模型” 后进入 “模型管理-已训练模型” 并部署

 tips:如遇以下网络返回超时报错可忽略,关闭报错窗口并刷新,模型状态能正常更新为 “started” 即可。

9. 测试模型,输入词组或短句,该模型可以将文本数据转换成向量数据:

该模型支持中英文的文本转换,成功转化为向量后,说明模型部署成功。

2.2.2 创建和配置 SAE 部分

本步骤仅介绍关键配置项,其余配置项保持默认即可。

1. 登录 SAE 控制台。

2.(可选)在左侧导航栏,单击命名空间(环境),在顶部菜单栏选择华北2(北京)地域,然后在命名空间页面,单击创建命名空间,在创建命名空间面板,配置相关信息,单击确定

配置项教程配置
命名空间名称自定义,例如输入 demo。
命名空间 ID自定义,例如输入 demo。
描述自定义,例如输入测试。

说明:如果跳过该步骤,在创建应用时(步骤4)选择默认命名空间,则应用创建成功后,需要切换 VPC,修改为与 Elasticsearch 实例配置一致的 VPC。

3. 在左侧导航栏,选择应用管理>应用列表,然后在应用列表页面,单击创建应用

4. 在创建应用页面,配置相关信息。
        a.在应用基本信息配置向导,配置相关信息,然后单击下一步:应用部署配置。

配置项教程配置
应用名称自定义,例如输入 demo。
专有网络配置选择自定义配置
命名空间
  • 默认:无需手动创建。第一次在默认命名空间内创建应用时,系统会自动生成一个 VPC(与Elasticsearch 实例配置的 VPC 不一致)。因此,如果你选择默认方式,后续需要在命名空间详情页面,切换 VPC。
  • (推荐)自定义:需要手动创建。选择已创建的命名空间,并选择与 Elasticsearch 实例配置一致的 VPC。
更多信息,请参见管理命名空间。
vSwitch选择与 Elasticsearch 实例配置一致的虚拟交换机。
安全组选择与 Elasticsearch 实例配置一致的 VPC 绑定的安全组。更多信息,请参见创建安全组。
应用实例数1
VCPU2Core
内存4GiB

2. 在应用部署配置配置向导,配置相关信息,然后单击下一步确认规格

配置项教程配置
技术栈语言选择 Python。
应用部署方式选择镜像。
配置镜像在配置镜像区域,单击Demo镜像页签,选择SAE提供的版本为nlp的镜像Demo。完整的镜像地址如下:registry-vpc.cn-beijing.aliyuncs.com/sae-serverless-demo/python-demo:nlp
环境变量设置

展开环境变量设置区域,选择类型为自定义,新增3对键值对,格式如下:

  • ES_HOST:<testHost>
  • ES_USER:<testUser>
  • ES_PWD:<testPassword>

注意事项如下:

  • ES_HOST 可在阿里云 Elasticsearch 控制台的实例基本信息页面获取 ES 实例的私网地址
  • 请注意格式为:http://es-cn-vxxxxx.elasticsearch.aliyuncs.com:9200
  • ES_USER 和 ES_PWD 为开通 Elasticsearch 时填写的的账户名和密码

4. 页面会跳转至创建完成配置向导,你可以单击应用详情页进入基本信息页面。

2.2.3 为 SAE 应用绑定负载均衡 CLB

SAE 支持绑定的 SLB,为传统型负载均衡 CLB(Classic Load Balancer),属于阿里云负载均衡 SLB(Server Load Balancer)支持的负载均衡类型之一

1) 在应用的基本信息页面的应用访问设置区域,单击添加公网 SLB 访问。

2. 在添加公网访问 SLB 对话框,从请选择 SLB 下拉列表中,选择复用已创建的免费试用 CLB 资源(优先),或者新建 SLB 资源(如果没有 CLB 领取资格需要额外付费),然后在 HTTP 协议页签,HTTP 端口输入 80,容器端口输入 5001,单击确认

注意:如果你复用已创建的 SLB,且需要确保 HTTP 端口和容器端口均未被占用。更多信息,请参见 CLB 按量付费。

3. 添加完成后,n 可以在公网访问地址栏看到该公网 SLB 的 IP 地址和端口。

4. 在浏览器地址栏中输入上一步获得的 SLB 的 IP 地址:端口,并回车访问公网。在如下界面中,我们可以在搜索框中输入文字搜索图片,或者在图片结果列的“搜索相似图片”按钮,搜索相似图片。下图红色框的内容展现了搜索相似图片的实现原理。

原文:基于 Elasticsearch 向量检索的以文搜图-阿里云开发者社区

相关文章:

搜文本搜位置搜图片,1小时玩转阿里云 Elasticsearch

作者&#xff1a;朱杰、奚悦、黄宇 AI 和搜索的整合已成为下一代搜索引擎的发展趋势&#xff0c;技术革新的浪潮下&#xff0c;你是否想抓住搜索领域的新机会&#xff0c;增强 AI 产品力与技术竞争力&#xff1f; 想学习搜索引擎技术的你&#xff0c;是否面临这样的困惑&…...

从三个主要需求市场分析,VR全景创业的潜力发展

VR全景&#xff0c;5G时代朝阳产业&#xff0c;其实拍摄制作很简单&#xff0c;就是利用一套专业的相机设备去给商家拍摄&#xff0c;结合后期专业的3DVR全景展示拍摄制作平台&#xff0c;打造3D立体环绕的效果&#xff0c;将线下商家真实环境1&#xff1a;1还原到线上&#xf…...

k8s 自身原理 2

前面我们说到 K8S 的基本原理和涉及的四大组件&#xff0c;分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波&#xff1a; 调度器 scheduler控制器管理器 controller manager 调度器 scheduler 调度器&#xff0c;见名知意&#xff0c;用于调度 k8s 资源的&…...

解决hbase节点已下线,但在status中显示为dead问题

工作中需要下线4台hbase小节点&#xff0c;下线完成后使用status 命令查看,有一台为dead状态: 使用status detailed 查看&#xff0c;发现“hd-03"这台节点是dead。 检查各节点配置文件无误&#xff0c;并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重启两个…...

深入理解Python装饰器:解析高阶函数与代码美学

文章目录 &#x1f340;引言&#x1f340;什么是装饰器&#xff1f;&#x1f340;装饰器的基本用法&#x1f340;带参数的装饰器&#x1f340;类装饰器&#x1f340;总结 &#x1f340;引言 当谈到Python编程中的高级特性时&#xff0c;装饰器&#xff08;decorators&#xff0…...

构建之法 - 软件工程实践教学:每天都向前推进一点点

作者&#xff1a;福州⼤学 汪璟玢⽼师 汪老师&#xff1a;每次都向前推进一点点&#xff0c;哪怕只有一点点&#xff0c;也好过什么都不做。 ​邹老师&#xff1a;对&#xff0c;几个学期下来&#xff0c;就已经超过那些“空想”的团队很远了。坚持下去&#xff01; 汪老师&…...

CSS transform:rotate;无效问题

CSS设置旋转 transform:rotate无效。 今天遇到一个奇怪的问题&#xff0c;CSS给 icon图标设置一个hover 旋转180deg的效果&#xff0c;不生效。 一度任务样式被覆盖了&#xff0c;样式不生效没选中元素的class。但是设置hover改变大小是生效的。奇怪了&#xff1f; 为什么会无…...

华为新版ENSP PRO模拟器测评:性能表现与功能扩展一览

一、引言 在网络领域不断涌现的新技术和复杂的网络拓扑要求&#xff0c;推动了网络设备模拟器的持续发展和创新。华为作为一家领先的通信技术解决方案提供商&#xff0c;不断致力于为网络工程师和技术从业人员提供更优秀的仿真环境。最近&#xff0c;华为推出了ensp pro模拟器的…...

BBS-个人博客项目完整搭建、BBS多人博客项目基本功能和需求、项目程序设计、BBS数据库表结构设计、创建BBS表模型

一、BBS-个人博客项目完整搭建 项目开发流程 一、项目分类 现在互联网公司需要开发的主流web项目一般分为两类&#xff1a;面向互联网用户&#xff0c;和公司内部管理。面向互联网用户: C(consumer)端项目 公司内部管理&#xff1a;B(business)端项目还有一类web应用&#xff…...

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性&#xff0c;帮助企业降低运营成本、提高生产效率&#xff0c;并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响&#xff1a; …...

取证--实操

2022年美亚杯个人赛 运用软件DB Browser for SQLite &#xff08;一款用于查看SQLlite数据库文件的浏览器工具&#xff09; 火眼&#xff0c;盘古石手机取证系统等 案件详情 于2022年10月&#xff0c;有市民因接获伪冒快递公司的电邮&#xff0c;不慎地于匪徒架设的假网站提…...

react组件化开发详解

React是一个流行的JavaScript库&#xff0c;用于构建用户界面&#xff0c;并且以组件化的方式进行开发。下面将详解React组件化开发的概念和步骤&#xff1a; 组件化思维&#xff1a; 组件化开发是将复杂的用户界面划分为独立、可重用的小部件&#xff08;组件&#xff09;。…...

【JVM】对String::intern()方法深入详解(JDK7及以上)

文章目录 1、什么是intern&#xff1f;2、经典例题解释例1例2例3 1、什么是intern&#xff1f; String::intern()是一个本地方法&#xff0c;它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串&#xff0c;则返回代表池中这个字符串的String对象的引用&#…...

7.1 C/C++ 实现动态数组

动态数组相比于静态数组具有更大的灵活性&#xff0c;因为其大小可以在运行时根据程序的需要动态地进行分配和调整&#xff0c;而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况&#xff0c;因为它们可以在不浪费空间的情况下根据需要…...

iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)

文章目录 前言开发环境问题描述问题分析1. 定位问题2. 逆向分析2.1. IDA Free2.2. Hopper Disassembler Demo 3. 模拟器日志4. supportedArchs 解决方案最后 前言 最近新需求很多&#xff0c;项目改动很大&#xff0c;开发完成后想测一遍在低版本iOS系统上的兼容性&#xff0c…...

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1&#xff1a;自定义水滴头像&#xff08;自定义标注覆盖物、Overlay覆盖类&#xff09; 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…...

R语言生存分析(机器学习)(2)——Enet(弹性网络)

弹性网络&#xff08;Elastic Net&#xff09;:是一种用于回归分析的统计方法&#xff0c;它是岭回归&#xff08;Ridge Regression&#xff09;和lasso回归&#xff08;Lasso Regression&#xff09;的结合&#xff0c;旨在克服它们各自的一些限制。弹性网络能够同时考虑L1正则…...

【Docker】使用 Docker Registry 搭建自己的 Docker 镜像仓库

使用 Docker Registry 搭建自己的 Docker 镜像仓库 在使用 Docker 进行应用程序的开发和部署时&#xff0c;使用 Docker 镜像仓库是一个很好的实践。它允许集中存储和管理 Docker 镜像&#xff0c;方便团队协作和版本控制。在本文中&#xff0c;将介绍如何使用 Docker Registr…...

Spring 是什么框架?

Spring 是 Java EE 编程领域的一款轻量级的开源框架&#xff0c;由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立&#xff0c;它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐&#xff0c;一直被广大开发人员作为 Java 企业…...

Azure添加网络接口

添加网络接口的意义 在 Azure 上&#xff0c;为虚拟机添加网络接口的意义包括以下几个方面&#xff1a; 扩展网络带宽&#xff1a;通过添加多个网络接口&#xff0c;可以增加虚拟机的网络带宽&#xff0c;提高网络传输速度和数据吞吐量。实现网络隔离&#xff1a;每个网络接口…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...