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

基于ElasticSearch的向量检索技术实践

基于ElasticSearch的向量检索技术实践

作者:Tableau

原文地址:https://zhuanlan.zhihu.com/p/620260383

图片、视频、语音、文本等非结构化数据可以通过人工智能技术(深度学习算法)提取特征向量,然后通过对这些特征向量的计算和检索来实现对非结构化数据的分析与检索。 针对向量检索常见的应用场景有:

  • 图片识别:以图搜图,通过图片检索图片;人脸识别

  • 自然语言处理:基于语义的文本检索。

  • 声纹匹配:音频检索。

  • 电商推荐:提取用户个性化特征或是商品的个性化属性,提高推荐模型的准确性,获得更加精确的推荐结果。

  • 知识图谱:智能搜索,智能问答,个性化推荐。

后续研究实践,以人脸为例,进行讨论介绍。

图片

向量检索面临的挑战主要在以下几个方面

  1. 高维数据:向量数据维度通常是 256/512 维。

  2. 海量数据:在电商场景图片搜索或者商品知识图谱等,

  3. 向量数据通常在千万到亿别级别。

  4. 高召回:为保证检索效果,精度召回率通常要求 95% 以上。

  5. 高性能:为保证用户体验,向量检索的响应要求毫秒级。

工程落地面临的挑战

  1. 系统高可用:需要实现一个分布式高可用系统

  2. 向量检索算法:需要根据不同场景,召回率和性能要求使用不同算法,并进行性能优化

  3. 通用的向量检索:适用于各种场景

  4. 与传统搜索结合:在向量检索的同时,需要其他一些业务字段的查询,过滤,和排序

向量检索简介

向量检索与机器学习分类问题

图片

在人脸识别的过程中,输入的人脸图片会转化为人脸特征值向量保存在计算机中作为人脸库,假设右图方块表示小王的多个人脸图片的特征值向量,三角表示小李的多个人脸特征值向量绿色向量表示输入的一张未知人脸图片的特征值向量。使用两向量的距离评估两向量表示的人脸的相似度在右图中与绿色新向量距离最近的为一方块向量,因此认为新输入的图片最有可能是小王的人脸图片。与人脸识别问题类似的其他的机器学习分类问题中,向量检索也是应用流程中的重要环节。

向量距离

KNN 检索最重要的子问题是如何评估任两个向量间的距离,机器学习聚类算法中最常用的距离是欧式距离和余弦距离。对某二维平面上两点

图片

**欧式距离:两向量终点连线的长度

图片

**余弦距离:两向量夹角的余弦值

图片

即:在向量归一化后,欧式距离与余弦距离等效,但在进行向量距离的矩阵运算时,欧式距离有明显的性能优势,因此向量检索系统统一使用欧式距离作为评判标准。

FAISS库介绍

Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,针对稠密向量设计和优化,可以提供高效的聚类运算和搜索运算,也是当前最受欢迎的近似近邻搜索库,使用C++开发,源码逻辑清晰结构简单提供C++和Python两种接口,提供了搜索算法的GPU实现,可扩展性强我们可以通过Jni封装来实现ES的Faiss插件。

Faiss支持众多搜索算法,主流的算法有:

  1. IndexFlatL2 和IndexFlatIP:使用BLAS库优化的暴力搜索。

  2. IndexHNSWFLat:HNSW(Hierarchical Navigable Small World)算法占用空间大,召回率高,索引时间长,搜索时间短。

  3. IndexIVFFlat:基于聚类的子空间搜索算法。

  4. IndexLSH:局部敏感hash,基于hash的子空间搜索算法。

  5. IndexPQ:类PCA的量化搜索算法。

  6. IndexIVFPQ:基于积量化的子空间搜索算法。

搜索算法优化的本质都是在空间、时间和召回率上的取舍需要根据不同业务场景,召回率和性能要求使用不同算法,并在样本集上面进行参数调优。

图片

图片

图片

向量检索服务设计

以常见的人脸识别服务为例,介绍分析不同的向量检索方式;

传统向量检索方案

图片

数据保存在数据库中,索引使用 Flann 构建每台服务器负责固定检索任务每个向量库仅由一台机器负责检索,若机器宕机,相关服务将无法访问Flann 搜索效率低下,浪费了大量的计算资源无法均衡负载单机内存受限无法扩展当前的向量检索系统 。 索引使用 Faiss 构建,保存在多台服务器上通过Ribbon控制搜索请求的负载均衡添加和更新文档时需要所有保存该索引的服务器同时生效,无法保证数据一致性每台机器都是全量数据还是突破不了单机内存的限制,系统重启逻辑复杂向量检索现有解决方案介绍(含竞对)。

向量检索现有解决方案介绍(含竞对)

图片

ElasticSearch

概念介绍

  1. 节点:单个ES实例

  2. 集群:由一个或多个节点组成,他们具有相同的 cluster.name 并协同工作。集群会感知节点的加入和退出并自动处理数据同步和负载均衡

  3. 分片:ES分布式系统中的存储最小单位,一个分片就是一个Lucene实例,是ES的最小工作单元 分片分为主分片和副本分片,副本分片是主分片的复制和备份。副本分片可以有多个但主分片有且仅有一个

  4. 索引:任意个分片的集合

  5. 分片对用户不可见,是ES构成分布式系统的内部组件,多个分片作为一个索引与用户交互

  6. 希望可以使用分布式服务解决问题,保证数据和检索服务的冗余性和一致性

向量检索系统解决方案

图片

集群中共包含 Master 节点、Data 节点、Requesting 节点三种角色

  1. Master 节点负责管理集群和数据的同步

  2. Data 节点加载 Faiss 实例负责执行向量搜索工作

  3. Requesting 节点负责接收请求并均衡 Data 节点负载

ElasticSearch 正好满足我们的分布式需求,但是原始的 ElasticSearch 不支持向量检索。

人脸搜索集群设计

  1. ES充当系统中分布式数据库和分布式索引库的角色,ES负责数据的备份,保证数据的安全性。

  2. ES中的最小可访问单元为index,单个index不限制存储数据量,index内部通过增加分片来保证搜索的低延时性,多分片分布式搜索的再排序过程由ES中的master节点负责,取消上层平台的group分片机制与再排序过程

  3. 每个index包含至少一个主分片和两倍的副本分片,数据三倍冗余

  4. ES使用轮询机制处理负载均衡

  5. ES负责分片的备份和同步

  6. 集群共8台机器,其中2台负责负载均衡、

  7. 同步协调等工作,6台负责搜索

  8. 系统保证在两台搜索机器同时宕机的情况下仍可正常提供服务

图片

集群原理与鲁棒性--数据同步

  1. master收到请求

  2. master通过hash函数确定分片位置,转发请求

  3. node1更新主分片并发送副本分片更新请求给node2、node3

  4. 增、删、改操作先在主分片上成功完成,然后复制到副本分片

  5. 每次更改时向副本分片的同步过程都是将整个分片完整复制

  6. 本质上不支持修改操作,通过删除和增加间接实现

  7. 本质上不支持删除操作,通过增加删除标记实现和index重建来实现

图片

集群原理与鲁棒性--基础搜索与负载均衡

  1. master收到请求

  2. master通过hash函数确定主分片和副本分片位置,根据轮询机制确定执行节点,转发请求

  3. node2执行检索并返回结果到master

图片

  • 示意图中使用单个master节点指代集群的requesting node

图片

  • 示意图中使用单个master节点指代集群的requesting node 集群原理与鲁棒性--分布式搜索(多分片搜索)

  • Query

    • master收到请求

    • master确定分片位置并转发请求

    • node1、node2执行搜索并返回结果到master

  • Fetch

    • master向node1、node2请求搜索结果中的文档原文

    • node1、node2返回文档

    • master对所有备选文档再排序后返回给客户端

图片

集群原理与鲁棒性--集群横向扩展

  • 如果请求量增大或数据量增加,可以对集群进行横向扩展。向集群中增加 Worker 类型节点,新增节点设置与原集群相同的 cluster.name。

  • 集群会自动发现新节点并向其分配分片以均衡负载。

集群原理与鲁棒性--故障处理

  1. 由于节点宕机或节点掉线造成访问超时视为节点退出集群。

  2. 集群管理节点发现异常后检查是否所有主分片都存在。

  3. 若发现主分片缺失将提升对应副本分片为新的主分片。

图片

向量检索插件实现

图片

Lucene 层次实现 – 利用 codec 扩展机制

图片

集成 KNN 插件后的向量检索逻辑流程

图片

向ES添加插件

  1. ES具有扩展插件的功能,在ES的 org.elasticsearch.plugins.Plugin 包中,定义了常用的一些插件的基类和接口。

  2. ES支持API Extension Plugins ,即API扩展插件,通过这个扩展可以实现自定义的搜索功能

  3. public class KNNPlugin extends Plugin implements MapperPlugin, SearchPlugin, ActionPlugin

  4. 为了添加自定义数据类型和搜索方法,继承Plugin 类并使用java语言实现相关接口:public class KNNPlugin extends Plugin implements MapperPlugin, SearchPlugin, ActionPlugin

  5. 将编译好的插件jar包放置在ES的plugin目录下,重启ES即可自动加载插件 扩展Lucene功能

ES的搜索功能实际上是Lucene实现的

  1. Lucene可以通过扩展codec来提供对自定义检索和自定义存储的支持。

  2. 常见的高性能搜索框架都是使用C/C++实现的,使用Java语言继承Lucene的codec基类并实现相关功能,涉及到索引的部分通过Jni调用C++搜索库来实现。

具体实现方法:

  1. 继承org.apache.lucene.search.IndexSearcher、org.apache.lucene.search.Query、 org.apache.lucene.search.ScoreMode、org.apache.lucene.search.Weight、org.apache.lucene.codecs.Codec等类并实现对应方法来扩展Lucene的codec。

  2. 通过Jni调用C++完成具体索引的构建和使用。

ElasticSearch 层次实现 – 利用 ElasticSearch Plugin 机制

为了在ElasticSearch中添加 KNN 插件的入口,我们定义了 knn_vector 这种 mapper type(数据类型) 和 knn 这种 query clause(查询子句)

图片

KNN 插件兼容性测试

KNN 插件完美兼容 ElasticSearch 及 Lucene,可与 Lucene 内置的各种检索方法自由组合

图片

生产部署与监控

生产部署:

目前,基于ES向量检索系统生产部署使用自运维方式,需要手动将ES安装包和插件拷到机器上面,然后进行配置。

监控:

prometheus(普罗米修斯) 和grafana可视化看板,需要在机器上面安装ES的探针

图片

如何提升性能?

  1. 合理设置分片数量

  2. 尽量使用过滤器

  3. 过滤器经常用在查询分类结果上。它可以用查询子句限制来替换,区别在于使用Query将影响文档的得分,而Filter不会

  4. 预热

  5. 提前进行搜索

  6. 段合并

  7. 索引中拥有更少的Segment,搜索速度将更快

如何估算向量检索机器内存和磁盘?

  1. ES JVM大约12G到16G。

  2. 1千万512维向量大约占20G,两倍数据冗余需要内存乘以3。

  3. faiss IVF算法,训练需要额外内存。

  4. ES会保存额外倒排索引,词字典等额外索引信息,一些小文件会常驻内存。

  5. 对于不常用索引,会从内存中卸载。

  6. 磁盘占用包括:ES lucene的索引文件,faiss 向量序列化文件。

向量检索后续探索实践

图片

相关文章:

基于ElasticSearch的向量检索技术实践

基于ElasticSearch的向量检索技术实践 作者:Tableau 原文地址:https://zhuanlan.zhihu.com/p/620260383 图片、视频、语音、文本等非结构化数据可以通过人工智能技术(深度学习算法)提取特征向量,然后通过对这些特征向量…...

Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南

Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南 日志系统是应用程序不可或缺的组成部分,良好的日志实践能极大提升开发调试和线上问题排查的效率。本文将全面介绍Spring Boot项目中各种日志框架的配置与使用方案,包…...

【设计模式】责任链模式

简介 很多公司都有请假的流程,当员工提交请假申请时,请求会沿着 组长 → 经理 → CEO 的链条传递,直到有对应层级的领导处理。 适用场景 一个请求需要多个对象中的一个或多个处理(如审批流程、过滤器链)。处理对象和…...

智能气候前沿:AI Agent结合机器学习与深度学习在全球气候变化驱动因素预测

全球气候变化已成为21世纪最严峻的环境挑战,其复杂的驱动因素如温室气体排放、气溶胶浓度、野火、海冰融化以及农业和生态系统变化等,交织影响着全球的气候格局。 第一:气候变化驱动因素与数据科学基础 1.1气候变化 全球气候变化 中国碳中…...

es 原生linux部署集群

背景 目的: 1. 理解不同部署方式的架构差异 2. 对比环境配置的复杂度 3. 评估性能与资源管理 4. 探索扩展性与高可用性 5. 学习安全与隔离机制 6. 实践监控与维护 7. 掌握混合部署与云原生场景 实验的最终目标 技能提升: 全面掌握Elasticsear…...

Springboot 同时支持不同的数据库,Oracle,Postgresql

## 关键字 Java,Springboot,Vscode,支持多种数据库 ## 背景环境 我在实际项目开发工程中遇到这样一个问题,用户 A 使用 Oracle 数据库,用户 B 使用 Postgresql 数据库,但是用户 AB 都使用我们的项目。所以…...

go --- go run main.go 和 go run .

目录 go run main.gogo run .示例 go run main.go 功能:只编译和运行指定的文件(main.go),忽略同目录下的其他文件。适用场景: 当你只需要运行一个独立的文件,且该文件不依赖其他文件时。适合单文件程序或…...

关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践

以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…...

deepseek使用记录26——从体力异化到脑力异化

我们的一切发现和进步,似乎结果是使物质力量具有理智生命,而人的生命则化为愚钝的物质力量。AI快速发展的现实中,人面临着比工业革命更深刻的异化。在工业革命中,人的身躯沦为了机器的一部分,而现在人的脑袋沦为了AI的…...

Ubertool 的详细介绍、安装指南及使用说明

Ubertool:多协议网络分析与调试平台 一、Ubertool 简介 Ubertool 是一款开源的 多协议网络分析工具,专为物联网(IoT)、嵌入式系统和工业自动化领域设计。它支持蓝牙、Wi-Fi、LoRa、CAN总线等多种通信协议的实时监控、数据包捕获…...

用 HTML、CSS 和 jQuery 打造多页输入框验证功能

在网页开发中,输入框验证是至关重要的一环,它能确保用户输入的数据符合特定要求,提升交互的准确性与流畅性。今天,我们就来深入剖析一个运用 HTML、CSS 和 jQuery 实现多页输入框验证的精彩实例,带你领略前端开发中表单…...

在CentOS上安装Docker需要注意的事项

文章目录 前言Docker Engine如何设置仓库设置镜像加速器获取镜像加速器地址 写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-…...

Chrome 135 版本新特性

Chrome 135 版本新特性 一、Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动态网站,同时也将 OpenID Connect (OIDC) 的隐式流程迁移到授权码流程。这样做的目的是进一步提升第…...

CMake实战指南一:add_custom_command

CMake 进阶:add_custom_command 用法详解与实战指南 在 CMake 构建系统中,add_custom_command 是一个灵活且强大的工具,允许开发者在构建流程中插入自定义操作。无论是生成中间文件、执行预处理脚本,还是在目标构建前后触发额外逻…...

K8S学习之基础七十五:istio实现灰度发布

istio实现灰度发布 上传镜像到harbor 创建两个版本的pod vi deployment-v1.yaml apiVersion: apps/v1 kind: Deployment metadata:name: appv1labels:app: v1 spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec…...

7-1 列出连通集

作者 陈越 单位 浙江大学 给定一个有 n 个顶点和 m 条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。进行搜索时,假设我们总是从编号最小的顶点…...

XML Schema 指示器

XML Schema 指示器 引言 XML Schema 是一种用于定义 XML 文档结构的语言,它能够确保 XML 文档的合法性。在 XML 文档的解析和应用中,XML Schema 指示器(XML Schema Indicator)扮演着至关重要的角色。本文将详细介绍 XML Schema 指示器的概念、作用、应用场景以及如何使用…...

Linux内核中TCP协议栈的实现:tcp_close函数的深度剖析

引言 TCP(传输控制协议)作为互联网协议族中的核心协议之一,负责在不可靠的网络层之上提供可靠的、面向连接的字节流服务。Linux内核中的TCP协议栈实现了TCP协议的全部功能,包括连接建立、数据传输、流量控制、拥塞控制以及连接关闭等。本文将深入分析Linux内核中tcp_close…...

17-产品经理-创建发布

点击“发布”-“创建发布”。 填写发布名称,选择测试的版本。还可以设置此次发布是否为“里程碑”。 点击“保存”后,进入该发布详情页面。需要为此次发布关联需求、已解决BUG、以及遗留BUG。可以通过设置条件,进行“搜索”,然后批…...

了解Spring的统一功能

目录 一、统一数据返回格式 1.引入统一数据返回格式 2.学习使用统一数据返回格式 support方法 beforeBodyWrite方法 统一数据返回格式具体逻辑 使用统一数据返回格式存在的问题 解决方法: 统一数据返回格式的优点 统一数据返回格式代码实现(包含了…...

123213

根据道路在道路网的地位、交通功能、对沿线的服务功能划分可分为快速路、主干路、次干路及支路 快速路完全为交通功能服务, 主干路以交通功能为主, 次干路是城市区域性的交通干道,为区域交通集散服务,兼有服务功能,结合主干路组成干路网 …...

通过 axios 请求回来的 HTML 字符串渲染到 Vue 界面上并添加样式

1. 通过 axios 获取数据 使用 axios 发起请求,获取返回的 HTML 字符串数据。 2. 在 Vue 中处理和渲染数据 由于 HTML 字符串中可能包含一些标签和样式,直接插入到 Vue 的模板中可能会导致样式问题。可以通过以下方式处理: 方法一&#xf…...

P1162 填涂颜色(BFS)

题目描述 由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2。例如:66 的方阵(n6),涂色前和涂色后的方阵如下: 如果从某个 0 出发,只向上下…...

【笔记】VS中C#类库项目引用另一个类库项目的方法

VS中C#类库项目引用另一个类库项目的方法 在 C# 开发中,有时我们需要在一个类库项目中引用另一个类库项目,但另一个项目可能尚未编译成 DLL。在这种情况下,我们仍然可以通过 Visual Studio 提供的项目引用功能进行依赖管理。 🎯 …...

进程内存分布--之smaps呈现memory-layout.cpp内存分布

上一篇介绍了:进程内存分布--之单线程代码来内存分布呈现memory-layout.cpp 这里我们使用smaps将更加形象的的体现内存分布,smaps文件是Linux的proc文件系统提供的一种可以查看内存资源使用情况的方法,Linux系统中运行的库、堆、栈等信息都可在smaps中查…...

再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG

当大语言模型开始"怀疑人生":一场关于知识检索的AI内心戏 各位看官,今天我们要聊一个AI界的"哲学难题"——当大语言模型突然意识到自己可能是个"半瓶子醋",会发生什么奇妙反应? 想象一下这个场景:某天深夜,ChatGPT正对着用户提问"如…...

DNS服务(Linux)

DNS 介绍 dns,Domain Name Server,它的作用是将域名解析为 IP 地址,或者将IP地址解析为域名。 这需要运行在三层和四层,也就是说它需要使用 TCP 或 UDP 协议,并且需要绑定端口,53。在使用时先通过 UDP 去…...

探秘PythonJSON解析深度剖析json.loads处理嵌套JSON字符串的奥秘

哈喽,大家好,我是木头左! 在当今数字化时代,数据以各种格式呈现,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在众多领域广泛应用。Python作为一门强大的编程语言,其内置的json模块为处理JSON数据提供了便捷的方法。然而,当遇到像{"name&q…...

Day7 FIFO与鼠标控制

文章目录 1. harib04a例程(获取按键编码)2. harib04b例程(加快中断处理)3. harib04c例程(FIFO缓冲区)4. harib04d例程(改善FIFO缓冲区)5. harib04e例程(整理FIFO缓冲区&a…...

软件工程第一章习题

第1章软件与软件工程 1.选择题 (1)下列说法中正确的是( )o A.20世纪50年代提出了软件工程的概念 B.20世纪60年代提出了软件工程的概念 C.20世纪70年代出现了客户机/服务器技术 D.20世纪80年代软件工程学科达到成熟 (2)软件危机的主要原因是( Do B.软件生产…...

Ollama 手动高速下载Win/Linux/Mac安装包及安装方法

前言 Ollama下载速度太慢,按这个方式,速度嘎嘎的快----下载地址 手动安装 如果要从以前的版本升级,则应删除旧库。比如:sudo rm -rf /usr/lib/ollama 解压 tar -C /usr -xzf ollama-linux-amd64.tgz # 解压到/usr文件夹# 如…...

Jmeter+Jenkins+Ant自动化持续集成环境搭建

一、安装准备 1.JDK:jdk-8u121-windows-x64 2.jmeter工具:apache-jmeter-2.13 3.ANT工具:apache-ant-1.9.7-bin 4.jenkins工具:jenkins-2.32.2 二、软件安装 1.JDK的安装 >双击JDK安装包,选择安装路径(本人是…...

【11】Redis快速安装与Golang实战指南

文章目录 1 Redis 基础与安装部署1.1 Redis 核心特性解析1.2 Docker Compose 快速部署1.3 Redis 本地快速部署 2 Golang 与 Redis 集成实战2.1 环境准备与依赖安装2.2 核心操作与数据结构实践2.2.1 基础键值操作2.2.2 哈希结构存储用户信息 3 生产级应用场景实战3.1 分布式锁实…...

ISP算法.红外图像增强

在图像处理领域,常见的图像处理一般都是白光相机,实际红外相机也是常见的一种相机,它可以用来对发热的东西进行成像,也可以作为白光相机夜晚不可见的一种辅助手段,为白光相机赋能夜视能力。 红外相机的成像原理在于辐射…...

Spring Boot中使用RedisTemplate操作Redis的几种数据类型详解

Redis作为高性能的键值存储系统,在现代Java应用中扮演着重要角色。Spring Boot通过RedisTemplate为开发者提供了便捷的Redis操作方式。本文将详细介绍如何使用RedisTemplate操作Redis的五种主要数据类型。 一、RedisTemplate简介 RedisTemplate是Spring Data Redi…...

大数据与人工智能之大数据架构(Hadoop、Spark、Flink)

一、核心特性与架构设计 1. Hadoop:分布式批处理的基石 核心组件: HDFS:分布式文件系统,支持大规模数据存储。MapReduce:基于“分而治之”的批处理模型,适合离线分析。 架构特点: 批处理主导&…...

VSCode中Marp插件

VSCode神级插件Marp,用Markdown来做PPT 优秀教程:https://zhuanlan.zhihu.com/p/582872955...

C++20 数学常数:<numbers> 头文件的革新

文章目录 一、<numbers> 头文件中的数学常数二、使用示例三、优势与应用场景&#xff08;一&#xff09;提高代码可读性&#xff08;二&#xff09;提高精度&#xff08;三&#xff09;适用于多种数据类型&#xff08;四&#xff09;简化数学计算 四、总结 C20 标准引入了…...

OpenCV--图像平滑处理

在数字图像处理领域&#xff0c;图像平滑处理是一项极为重要的技术&#xff0c;广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下&#xff0c;我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理&#xff0c;…...

【KMP】P7114 [NOIP2020] 字符串匹配|省选-

本文涉及知识点 较难理解的字符串查找算法KMP P7114 [NOIP2020] 字符串匹配 题目描述 小 C 学习完了字符串匹配的相关内容&#xff0c;现在他正在做一道习题。 对于一个字符串 S S S&#xff0c;题目要求他找到 S S S 的所有具有下列形式的拆分方案数&#xff1a; S A …...

C++20 统一容器擦除:std::erase 和 std::erase_if

文章目录 一、std::erase 的用法1.1 语法1.2 参数1.3 返回值1.4 示例 二、std::erase_if 的用法2.1 语法2.2 参数2.3 返回值2.4 示例 三、优势与应用场景3.1 统一的接口3.2 简化代码3.3 适用范围广 四、总结 C20 引入了两个非常实用的函数模板&#xff1a; std::erase 和 std…...

阿里云oss视频苹果端无法播放问题记录

记录一下苹果端视频不可以播放的原因. 看了一下其他视频可以正常播放,但是今天客户发来的视频无法正常播放.咨询过阿里云售后给出的原因是编码格式过高. 需要调整编码格式为:baseline, 下面记录如何使用ffmpeg修改视频的编码格式. 下载文件(可从官方下载) 配置环境变量(系统变…...

10-MySQL-性能优化思路

1、优化思路 当我们发现了一个慢SQL的问题的时候&#xff0c;需要做性能优化&#xff0c;一般我们是为了提高SQL查询更快&#xff0c;一个查询的流程由下图的各环节组成&#xff0c;每个环节都会消耗时间&#xff0c;要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化…...

Postman之参数化详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 小伙伴们&#xff0c;好久不见呀&#xff0c;今天呢笔者想和大家聊聊postman参数化&#xff0c;在接口测试中&#xff0c;部分参数每次发送请求是唯一的数值&a…...

【c++深入系列】:类和对象详解(下)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 你的人生剧本&#xff0c;不是父母的续集&#xff0c;不是子女的前传&#xff0c;更不是朋友的外传——你是自己故事的主角 ★★★ 本文前…...

浅谈「分词」:原理 + 方案对比 + 最佳实践

在文本搜索、自然语言处理、智能推荐等场景中&#xff0c;「分词」 是一个基础但至关重要的技术点。无论是用数据库做模糊查询&#xff0c;还是构建搜索引擎&#xff0c;分词都是提高效率和准确度的核心手段。 &#x1f50d; 一、什么是分词&#xff1f; 分词&#xff08;Tok…...

第十八:GC 垃圾回收

2.1 三色标记# 灰色&#xff1a;对象已被标记&#xff0c;但这个对象包含的子对象未标记黑色&#xff1a;对象已被标记&#xff0c;且这个对象包含的子对象也已标记&#xff0c;gcmarkBits对应的位为1&#xff08;该对象不会在本次GC中被清理&#xff09;白色&#xff1a;对象…...

【微机及接口技术】- 第七章 可编程定时/计数器

文章目录 第一节 定时/计数器的概述一、定时与计数二、定时方法 第二节 可编程定时/计数器8254一、8254-2的基本功能二、8254的内部结构和外部引脚三、8254 的工作方式1. 方式0&#xff1a;计数到零产生中断方式2. 方式1&#xff1a;硬件可重触发单稳方式3. 方式2&#xff1a;速…...

MES生产工单管理系统,Java+Vue,含源码与文档,实现生产工单全流程管理,提升制造执行效率与精准度

前言&#xff1a; MES生产工单管理系统是制造业数字化转型的核心工具&#xff0c;通过集成生产、数据、库存等模块&#xff0c;实现全流程数字化管理。以下是对各核心功能的详细解析&#xff1a; 一、生产管理 工单全生命周期管理 创建与派发&#xff1a;根据销售订单或生产计…...

【区块链安全 | 第三十五篇】溢出漏洞

文章目录 溢出上溢示例溢出漏洞溢出示例漏洞代码代码审计1. deposit 函数2. increaseLockTime 函数 攻击代码攻击过程总结修复建议审计思路 溢出 算术溢出&#xff08;Arithmetic Overflow&#xff09;&#xff0c;简称溢出&#xff08;Overflow&#xff09;&#xff0c;通常分…...