OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 

点击下载  OceanBase 社区版 4.3.5 BP1 >> 

全文索引(Full-Text Index),是一种专为加速数据库中文本数据检索而设计的特殊索引类型,尤其擅长处理包含大量文本字段(例如文章内容、评论、博客等)的查询请求。它能够支持高效的关键词匹配查询,允许在文本中搜索一个或多个词语,并迅速返回相关结果。全文索引广泛应用于搜索引擎和文本分析系统中,助力企业和用于迅速查找关键信息,显著提升搜索效率。

在企业的实际生产中,全文索引功能可以应用于系统日志分析、用户分析等众多场景,全文索引能够对数据做到高效率过滤筛选、或是高质量相关性评估。在 AI 领域,OceanBase 基于稀疏稠密向量与全文索引相结合的多路召回架构,能在具有特殊知识领域的 RAG 系统中实现更高效、更精准的召回效果。本文将深入解析其背后的技术原理,并展示其在实践中的表现。

一、全文索引企业级功能四大核心价值

最新版本的全文索引,在以下方面帮助用户解决更多搜索使用上的痛点:

🚩 支持分区表,索引数据和分区数据就近存储,提高性能。

🚩 支持主表上建立多种混合索引(普通二级、全文、多值、向量等),一套数据应对不同查询目标和加速场景。

🚩 支持 IK 中文分词器和词典修改,在一些需要中文专业术语的业务里,字典维护和匹配更加易用和精准。

🚩 支持常用的自然语言和布尔模式,性能优于 MySQL,功能与性能两方面支撑业务做平替。

二、核心技术解析:BM25算法与查询优化

数据库中全文索引要解决的基本问题是如何通过查询里的关键词快速有效地找到对应的文档。在 OceanBase  存储引擎内部,用户的文档(doc)会被分词器(parser)拆分成若干关键词(word/token)。这些关键词连同文档的统计信息特征被存储在内部的辅助表(tablet)上,用于信息检索阶段的相关性评估算法(ranking)。OceanBase 采用能够更好评估信息关联性的 BM25 算法,对用户查询语句中的关键词和存储的文档计算相关性分数,并最终输出有关联的文档和其评分。

结合 OceanBase 已有的高性能查询引擎能力,在全文索引查询流程内,我们针对性地做了 TAAT/DAAT 流程优化、对标 Oracle 的 functional lookup 功能以及多索引间的 index merge 等,让全文能结合更多复杂的查询特性,完成用户想要的数据检索。

图片

三、实战测评:以中文体育新闻搜索为例

接下来,我们以中文体育新闻搜索为例,动手体验 OceanBase 的全文索引,同时展示常用的视图和查询技巧。

集群部署与数据导入

首先用最新版 OceanBase 4.3.5 BP1 搭建两副本,一个 2C4G 的 MySQL 模式租户。

OceanBase 内置支持中文语言的 IK 分词器,以及比传统自然语言模式更好用的布尔模式。所以实验的数据集使用中文足球体育新闻(https://github.com/ej0cl6/SportsSum)。在 OceanBase 内创建一张无主键分区表,包含三列变长字符串(event,date,news)。对 news 字段使用了 IK 中文分词器,并指定 max_word 模式。IK 分词器的另一种 smart 模式,和 max_word 的区别是,其在匹配到最长词语后就停止匹配更短的词语。

OceanBase 内置分词器还包括适合英语的 space 和 beng。以及按照字符长度分割的 ngram。

-- 建表语句CREATE TABLE sport_data_whole(  event varchar(64),  date varchar(16),  news varchar(65535),  fulltext INDEX (news) WITH parser ik PARSER_PROPERTIES =(ik_mode = "max_word"));

通过客户端本地文件的方式,将新闻数据集导入到表格内,时间大概在十五秒左右。

-- 导入语句load data /*+ parallel(8) */  local infile "/home/jiahua.cjh/sports_data_whole.csv"  into table sport_data_whole  fields terminated by ',' lines terminated by '\n';

导入后共 5268 条新闻,平均文档长度在 2700 个中文字。原始数据是 57MB 左右。实际存储的总空间大小,在经过存储引擎的压缩后,连同索引不到 30MB。可以看到其中比较大的是全文索引中倒排和正排辅助表,内部存储了比较多的分词记录。

-- 体育新闻数据集select  avg(length(news)),  count(*)from  sport_data_whole;+-------------------+----------+| avg(length(news)) | count(*) |+-------------------+----------+|         2781.6900 |     5268 |+-------------------+----------+1 row in set (0.03 sec)select  *from  oceanbase.DBA_OB_TABLE_SPACE_USAGE\G*************************** 1. row ***************************     TABLE_ID: 500007DATABASE_NAME: test   TABLE_NAME: sport_data_whole  OCCUPY_SIZE: 8349796REQUIRED_SIZE: 10489856*************************** 2. row ***************************     TABLE_ID: 500008DATABASE_NAME: test   TABLE_NAME: __idx_500007_news  OCCUPY_SIZE: 30247553REQUIRED_SIZE: 31461376*************************** 3. row ***************************     TABLE_ID: 500009DATABASE_NAME: test   TABLE_NAME: __idx_500007_fts_rowkey_doc  OCCUPY_SIZE: 70125REQUIRED_SIZE: 77824*************************** 4. row ***************************     TABLE_ID: 500010DATABASE_NAME: test   TABLE_NAME: __idx_500007_fts_doc_rowkey  OCCUPY_SIZE: 73171REQUIRED_SIZE: 77824*************************** 5. row ***************************     TABLE_ID: 500011DATABASE_NAME: test   TABLE_NAME: __idx_500007_news_fts_doc_word  OCCUPY_SIZE: 28302737REQUIRED_SIZE: 29364224

利用全文索引查询

利用存储进数据库中的新闻数据集和索引,可以做多条件自由组合,达到高过滤性信息检索的目的。例如作为球迷,想搜索包含有 “拜仁” 和 “乌龙球” 的新闻,推荐使用布尔模式。相较于没有索引的字符串 like 匹配,布尔模式语法上更简洁易懂,查询速度也会更快。

-- 布尔模式select  count(*)from  sport_data_wholewhere  match (news) against ('+乌龙球 +拜仁' in boolean mode);+----------+| count(*) |+----------+|        2 |+----------+1 row in set (0.03 sec)select  count(*)from  sport_data_wholewhere  news like '%乌龙球%'  and news like '%拜仁%';+----------+| count(*) |+----------+|        2 |+----------+1 row in set (0.08 sec)

对于返回的多条新闻,在输出结果中增加分值,能用来帮助判断哪条新闻更有关联。OceanBase 的全文支持经过 BM25 算法计算得到的相关性分数。下面可以看到 date 是 0278 的新闻,和我们查询的目的更具关联性。

-- rankingselect  event,  date,  match (news) against ('乌龙球 拜仁') as scorefrom  sport_data_wholewhere  match (news) against ('+乌龙球 +拜仁' in boolean mode);+-------+------+---------------------+| event | date | score               |+-------+------+---------------------+| ucl   | 0278 |  0.4657063867776557 || ucl   | 0201 | 0.41760566608994765 |+-------+------+---------------------+2 rows in set (0.04 sec)

布尔模式相较于自然语言,还能反向剔除一些关键词。例如每场足球比赛中几乎都有犯规行为,如果想知道哪些比赛很激烈,但是没有红黄牌甚至没有犯规,则可以用到布尔模式里的 “-” 运算符。

-- 布尔模式运算select  count(*)from  sport_data_wholewhere  match (news) against ('+激烈 -黄牌 -红牌 -犯规' in boolean mode);+----------+| count(*) |+----------+|       31 |+----------+1 row in set (0.04 sec)

一个调试的小技巧,当发现全文索引的查询结果不符合预期时,通常是因为分词结果不理想。OceanBase 提供了一个快速的 TOKENIZE 函数来辅助测试分词结果。函数支持所有分词器和对应属性。例如下面手动的分词结果,反映了词典中对于国外体育明星人名的支持还不是很好(博阿滕、格策),因此用这些人名去检索新闻的效果可能达不到预期。

-- tokenize 函数select  tokenize(    '博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内',    'ik',    '[{"additional_args": [{"ik_mode": "smart"}]}]'  );+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内', 'ik', '[{"additional_args": [{"ik_mode": "smart"}]}]')                                                                                          |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ["亚", "格", "夫", "阿", "门内", "从", "下钻", "后点", "右路", "分过", "传中", "低", "转身", "球", "射", "闪开", "博", "进", "反击", "门前", "停", "人", "皮", "裆", "策", "滕", "8米处", "托", "在", "角度"]                                           |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.03 sec)select  count(*)from  sport_data_wholewhere  match (news) against ('+格策 +博阿滕' in boolean mode);+----------+| count(*) |+----------+|        0 |+----------+1 row in set (0.04 sec)

如果想提升分词器的精准性,OceanBase 支持修改系统词典表。当我们将上述中文人名插入到系统词典表后,重新分词的效果立竿见影。

🧡 注意:词典修改后,原索引分词效果不变,需要重建索引生效。

-- 中文人名分词效果select  tokenize(    '博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内',    'ik',    '[{"additional_args": [{"ik_mode": "smart"}]}]'  );+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内', 'ik', '[{"additional_args": [{"ik_mode": "smart"}]}]')                                                                  |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ["门内", "从", "下钻", "后点", "右路", "分过", "传中", "低", "转身", "球", "皮亚托夫", "射", "闪开", "进", "反击", "门前", "停", "人", "裆", "8米处", "在", "角度", "格策", "博阿滕"]                                           |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.04 sec)select  count(*)from  sport_data_wholewhere  match (news) against ('+格策 +博阿滕' in boolean mode);+----------+| count(*) |+----------+|       79 |+----------+1 row in set (0.05 sec)

实验最后,对全文索引与普通索引混合查询下 union merge 带来的性能提升做一个对比。对 sport_data_whole 表的 date 列再建立一个普通局部索引。可以通过 show index 观察索引生效情况。

-- 构建普通索引alter table sport_data_whole add index (date);show index from sport_data_whole\G*************************** 1. row ***************************        Table: sport_data_whole   Non_unique: 1     Key_name: news Seq_in_index: 1  Column_name: news    Collation: A  Cardinality: NULL     Sub_part: NULL       Packed: NULL         Null: YES   Index_type: FULLTEXT      Comment: availableIndex_comment:      Visible: YES   Expression: NULL*************************** 2. row ***************************        Table: sport_data_whole   Non_unique: 1     Key_name: date Seq_in_index: 1  Column_name: date    Collation: A  Cardinality: NULL     Sub_part: NULL       Packed: NULL         Null: YES   Index_type: BTREE      Comment: availableIndex_comment:      Visible: YES   Expression: NULL2 rows in set (0.00 sec)

当两个索引条件使用 OR 连接时,过滤性好的情况下,union merge 带来的收益会比扫描普通索引后再过滤(计划中有 has_functional_lookup=true)更快。从两种计划最后预估的时间上可以看到有数量级的提升。

-- union merge 计划对比explainselect  /*+UNION_MERGE(sport_data_whole date news)*/  *from  sport_data_wholewhere  date = '0322'  or (match (news) against ('+乌龙球' in boolean mode));+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Query Plan                                                                                                                                                        |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ===================================================================================                                                                               || |ID|OPERATOR                    |NAME                       |EST.ROWS|EST.TIME(us)|                                                                               || -----------------------------------------------------------------------------------                                                                               || |0 |DISTRIBUTED INDEX MERGE SCAN|sport_data_whole(date,news)|45      |9102        |                                                                               || ===================================================================================                                                                               || Outputs & filters:                                                                                                                                                || -------------------------------------                                                                                                                             ||   0 - output([sport_data_whole.event], [sport_data_whole.date], [sport_data_whole.news]), filter([sport_data_whole.date = '0322' OR MATCH(sport_data_whole.news)  ||       AGAINST('+乌龙球' IN BOOLEAN MODE)]), rowset=256                                                                                                            ||       access([sport_data_whole.__pk_increment], [sport_data_whole.date], [sport_data_whole.news], [sport_data_whole.event]), partitions(p0)                       ||       is_index_back=true, is_global_index=false, keep_ordering=true, use_index_merge=true, filter_before_indexback[false],                                        ||       index_name: date, range_cond([sport_data_whole.date = '0322']), filter(nil)                                                                                 ||       index_name: news, range_cond(nil), filter(nil)                                                                                                              ||       lookup_filter([sport_data_whole.date = '0322' OR MATCH(sport_data_whole.news) AGAINST('+乌龙球' IN BOOLEAN MODE)])                                          |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+14 rows in set (0.03 sec)explainselect  *from  sport_data_wholewhere  date = '0322'  or (match (news) against ('+乌龙球' in boolean mode));+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Query Plan                                                                                                                                                        |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ===========================================================                                                                                                       || |ID|OPERATOR       |NAME            |EST.ROWS|EST.TIME(us)|                                                                                                       || -----------------------------------------------------------                                                                                                       || |0 |TABLE FULL SCAN|sport_data_whole|79      |526939      |                                                                                                       || ===========================================================                                                                                                       || Outputs & filters:                                                                                                                                                || -------------------------------------                                                                                                                             ||   0 - output([sport_data_whole.event], [sport_data_whole.date], [sport_data_whole.news]), filter([sport_data_whole.date = '0322' OR MATCH(sport_data_whole.news)  ||       AGAINST('+乌龙球' IN BOOLEAN MODE)]), rowset=256                                                                                                            ||       access([sport_data_whole.__pk_increment], [sport_data_whole.date], [sport_data_whole.news], [sport_data_whole.event]), partitions(p0)                       ||       is_index_back=false, is_global_index=false, filter_before_indexback[false],                                                                                 ||       range_key([sport_data_whole.__pk_increment]), range(MIN ; MAX)always true, has_functional_lookup=true                                                       |+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+12 rows in set (0.04 sec)

四、性能对比:OceanBase 远超 MySQL

OceanBase 的全文索引性能横向比较如何?我们以 MySQL 的全文索引为例。MySQL 的中文分词能力不是很好,因此对比数据集选定在英文数据集 wikir1k(369721行,平均每行100词)上。以下分别是自然语言模式,以及布尔模式下多种场景的对比结果。

结果上:

💡 OceanBase 在需要大量分词或是返回结果的场景中,都远优于 MySQL。

💡 小结果集上,因为计算量占比不高,查询引擎的优势不明显,两者十分接近。

测试环境如下:

  • OceanBase 租户规格 8c 16g

  • MySQL Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL)

自然语言模式​​​​​​​

# Query# q1select * from wikir1k where match (document) against ('and');# q2select * from wikir1k where match (document) against ('and') limit 10;# q3select * from wikir1k where match (document) against ('librettists');# q4select * from wikir1k where match (document) against ('librettists') limit 10;# q5select * from wikir1k where match (document) against ('alleviating librettists');# q6select * from wikir1k where match (document) against ('black spotted white yellow');# q7select * from wikir1k where match (document) against ('black spotted white yellow') limit 10;# q8select * from wikir1k where match (document) against ('between up and down');# q9select * from wikir1k where match (document) against ('between up and down') limit 10;# q10select * from wikir1k where match (document) against ('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire');# q11select * from wikir1k where match (document) against ('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire and');# q12select * from wikir1k where match (document) against ('alleviating librettists modifications retelling intangible hydrographic administratively berwickshire strathaven dumfriesshire lesmahagow transhumanist musselburgh prestwick cardiganshire montgomeryshire and') limit 10;

图片

布尔模式

# Query# q1: +高频词 -中频词select * from wikir1k where match (document) against ('+and -which -his' IN BOOLEAN MODE); # q2: +高频词 -低频词select * from wikir1k where match (document) against ('+which  (+and -his)' IN BOOLEAN MODE); # q3: +中频词 (+高频词 -中频词)select * from wikir1k where match (document) against ('+and -carabantes -bufera' IN BOOLEAN MODE);# q4: +高频词 +低频词 select * from wikir1k where match (document) against ('+and +librettists'  IN BOOLEAN MODE);

图片

五、未来路线:OceanBase 全文索引将持续演进

OceanBase 全文索引的能力还远不止于此,结合新的技术趋势和新的数据检索场景,在后续版本,我们还会推出更多易用性功能。例如:

🔎 能支持交集能力的全面的 index merge;

🔎 以插件方式支持更丰富流行的多语言分词器;

🔎 更灵活的用户自定义词典和停词;

🔎 更常用的 term query、phrase query,compound query 功能;

🔎 在检索方面,结合 OceanBase 的多模稀疏向量,进一步增强文档的语义理解力;

🔎 使用多路召回、动态剪裁以及底层例如 WAND 的加速算法,在质量和速度两个方面提升检索体验等等。

全文索引不仅是数据库能力的延伸,更是企业实现数据智能化的关键基础设施。经过全面升级的 OceanBase 全文索引,在中文处理能力、混合查询性能、生产可用性等方面已建立显著优势。

无论是在传统日志分析场景,还是结合 AI 的智能检索需求,OceanBase 的全文索引都能提供企业级解决方案。未来,OceanBase 将持续深化"数据库+搜索+AI"的技术融合,助力企业构建新一代智能数据平台。

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

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

相关文章

海康摄像头AI报警、移动侦测报警等通过Ehome/ISUP协议上报到LiveNVR流媒体平台时如何进行报警配置

海康摄像头AI报警、移动侦测报警等通过Ehome/ISUP协议上报到LiveNVR流媒体平台时如何进行报警配置 1、LiveNVR介绍2、如何配置海康摄像头、录像机通过Ehome/ISUP注册到LiveNVR设备 EHOME 接入配置示例设备 ISUP 接入配置示例直播流接入类型 海康ISUP海康 ISUP 设备ID启用保存 3…

golang gmp模型分析

思维导图: 1. 发展过程 思维导图: 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有: 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 处于对CPU资源的利用&…

Redis基础指令(Windows)

1.cmd命令行启动redis 直接cmd打开整个文件 1.1.启动server 输入指令: redis-server.exe redis.windows.conf 会进入serve端 1.2.启动客户端 !!重新打开一个cmd,方法和上面一样!! 之后输入 redis-…

vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf

一、本文目标 <iframe> 方法预览 pdf 、word vue-pdf 预览pdf 二、<iframe> 方法 2.1、iframe 方法预览需要 浏览器 设置为&#xff1a; chrome&#xff1a;设置-隐私设置和安全性-网站设置-更多内容设置-PDF文档 浏览器访问&#xff1a; chrome://settings/co…

【C++游戏引擎开发】第11篇:GLFW、GLAD环境搭建与第一个三角形渲染

一、GLFW、GLAD安装 1.1 vcpkg安装相关库 跨平台C++包管理利器vcpkg完全指南 # 安装GLFW vcpkg install glfw3# 安装GLAD vcpkg install glad1.2 初始测试代码 #include <glad/glad.h> #include <GLFW/glfw3.h> int main() {glfwInit();GLFWwindow* window = g…

西门子S7-1500与S7-200SMART通讯全攻略:从基础配置到远程IO集成

以下是一篇关于西门子S7-1500与S7-200SMART通讯的详细教程&#xff0c;包含远程IO模块的配置方法&#xff0c;适用于工业自动化场景的博客发布&#xff1a; 西门子S7-1500与S7-200SMART通讯全攻略&#xff1a;从基础配置到远程IO集成 一、硬件与软件准备 硬件设备 主站&#x…

前端性能优化的全方位方案【待进一步结合项目】

以下是前端性能优化的全方位方案,结合代码配置和最佳实践,涵盖从代码编写到部署的全流程优化: 一、代码层面优化 1. HTML结构优化 <!-- 语义化标签减少嵌套 --> <header><nav>...</nav> </header> <main><article>...</arti…

前端快速入门——JavaScript变量、控制语句

1.JavaScript 定义 JavaScript 简称 JS. JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。 作为一种客户端脚本语言&#xff0c;JavaScript 可以直接嵌入 HTML&#xff0c;并在浏览器中执行。…

GitHub 趋势日报 (2025年04月01日)

GitHub 趋势日报 (2025年04月01日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1punkpeye/awesome-mcp-serversA collection of MCP servers.⭐ 3280未指定2th-ch/youtube-musicYouTu…

windows手动添加鼠标右键弹窗快捷方式

此处以添加Git Bash Here为例 一.操作步骤 按 Win R 键打开 运行 对话框&#xff0c;输入 regedit&#xff0c;并按下回车&#xff0c;打开注册表编辑器。 导航到 HKEY_CLASSES_ROOT\Directory\Background\shell。 右键单击 shell&#xff0c;选择 新建 → 项&#xff0c;并…

2025.04.09【Sankey】| 生信数据流可视化精讲

文章目录 引言Sankey图简介R语言中的Sankey图实现安装和加载networkD3包创建Sankey图的数据结构创建Sankey图绘制Sankey图 结论 引言 在生物信息学领域&#xff0c;数据可视化是理解和分析复杂数据集的关键工具之一。今天&#xff0c;我们将深入探讨一种特别适用于展示数据流动…

GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——4.1版本升级到5.0.3

笔者在去年利用国庆时间&#xff0c;将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统&#xff0c;但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管&#xff0c;这样可以方便的使用gd32提供的…

【算法竞赛】树上最长公共路径前缀(蓝桥杯2024真题·团建·超详细解析)

目录 一、题目 二、思路 1. 问题转化&#xff1a;同步DFS走树 2. 优化&#xff1a;同步DFS匹配 3. 状态设计&#xff1a;dfs参数含义 4. 匹配过程&#xff1a;用 map 建立权值索引 5. 终止条件&#xff1a;无法匹配则更新答案 6. 总结 三、完整代码 四、知识点总…

开源免费虚拟化平台PVE软件定义网络

一、PVE SDN&#xff08;Software Defined Networking&#xff09;原理与使用逻辑 SDN&#xff08;软件定义网络&#xff09; 是一种将网络控制逻辑从传统交换机、路由器中分离出来的技术&#xff0c;使得网络可以通过软件集中管理和自动化配置。 Proxmox VE&#xff08;PVE&…

mysql 8.0.41下载安装教程(附安装包)mysql 8.0.41图文详细安装教程

文章目录 前言一、mysql 8.0.41 简介二、安装前准备三、MySQL 8.0 安装流程解析1.解压安装包2.启动安装程序3.选择安装类型4.选择安装组件5.开始安装6.配置设置&#xff08;部分步骤&#xff09;7.设置数据库密码8.完成安装配置9.配置环境变量&#xff1a;10.验证安装&#xff…

JAVA基础八股复习

1.局部变量一般存放在栈中&#xff0c;成员变量一般存放在堆中 2.什么是多态&#xff1f;谈谈对多态的理解&#xff1f; 在面向对象语言中&#xff0c;接口的多种不同的实现方式即为多态。用白话来说&#xff0c;就是多个对象调用同一个方法&#xff0c;得到不同的结果。 多态中…

10:00开始面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

k8s核心资源对象一(入门到精通)

本文将深入探讨Kubernetes中的核心资源对象&#xff0c;包括Pod、Deployment、Service、Ingress、ConfigMap和Secret&#xff0c;详细解析其概念、功能以及实际应用场景&#xff0c;帮助读者全面掌握这些关键组件的使用方法。 一、pod 1 pod概念 k8s最小调度单元&#xff0c;…

《Sqoop 快速上手:安装 + 测试实战》

推荐原文 见&#xff1a;http://docs.xupengboo.top/bigdata/di/sqoop.html Sqoop&#xff08;SQL-to-Hadoop&#xff09; 是 Apache 开源的工具&#xff0c;专门用于在 Hadoop 生态系统&#xff08;如 HDFS、Hive、HBase&#xff09; 和 关系型数据库&#xff08;如 MySQL、O…

数据结构刷题之贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09; 是一种在每个步骤中都选择当前最优解的算法设计策略。它通常用于解决优化问题&#xff0c;例如最小化成本或最大化收益。贪心算法的核心思想是&#xff1a;在每一步选择中&#xff0c;都做出局部最优的选择&#xff0c;希望…