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_wholefields terminated by ',' lines terminated by '\n';
导入后共 5268 条新闻,平均文档长度在 2700 个中文字。原始数据是 57MB 左右。实际存储的总空间大小,在经过存储引擎的压缩后,连同索引不到 30MB。可以看到其中比较大的是全文索引中倒排和正排辅助表,内部存储了比较多的分词记录。
-- 体育新闻数据集selectavg(length(news)),count(*)fromsport_data_whole;+-------------------+----------+| avg(length(news)) | count(*) |+-------------------+----------+| 2781.6900 | 5268 |+-------------------+----------+1 row in set (0.03 sec)select*fromoceanbase.DBA_OB_TABLE_SPACE_USAGE\G*************************** 1. row ***************************TABLE_ID: 500007DATABASE_NAME: testTABLE_NAME: sport_data_wholeOCCUPY_SIZE: 8349796REQUIRED_SIZE: 10489856*************************** 2. row ***************************TABLE_ID: 500008DATABASE_NAME: testTABLE_NAME: __idx_500007_newsOCCUPY_SIZE: 30247553REQUIRED_SIZE: 31461376*************************** 3. row ***************************TABLE_ID: 500009DATABASE_NAME: testTABLE_NAME: __idx_500007_fts_rowkey_docOCCUPY_SIZE: 70125REQUIRED_SIZE: 77824*************************** 4. row ***************************TABLE_ID: 500010DATABASE_NAME: testTABLE_NAME: __idx_500007_fts_doc_rowkeyOCCUPY_SIZE: 73171REQUIRED_SIZE: 77824*************************** 5. row ***************************TABLE_ID: 500011DATABASE_NAME: testTABLE_NAME: __idx_500007_news_fts_doc_wordOCCUPY_SIZE: 28302737REQUIRED_SIZE: 29364224
利用全文索引查询
利用存储进数据库中的新闻数据集和索引,可以做多条件自由组合,达到高过滤性信息检索的目的。例如作为球迷,想搜索包含有 “拜仁” 和 “乌龙球” 的新闻,推荐使用布尔模式。相较于没有索引的字符串 like 匹配,布尔模式语法上更简洁易懂,查询速度也会更快。
-- 布尔模式selectcount(*)fromsport_data_wholewherematch (news) against ('+乌龙球 +拜仁' in boolean mode);+----------+| count(*) |+----------+| 2 |+----------+1 row in set (0.03 sec)selectcount(*)fromsport_data_wholewherenews like '%乌龙球%'and news like '%拜仁%';+----------+| count(*) |+----------+| 2 |+----------+1 row in set (0.08 sec)
对于返回的多条新闻,在输出结果中增加分值,能用来帮助判断哪条新闻更有关联。OceanBase 的全文支持经过 BM25 算法计算得到的相关性分数。下面可以看到 date 是 0278 的新闻,和我们查询的目的更具关联性。
-- rankingselectevent,date,match (news) against ('乌龙球 拜仁') as scorefromsport_data_wholewherematch (news) against ('+乌龙球 +拜仁' in boolean mode);+-------+------+---------------------+| event | date | score |+-------+------+---------------------+| ucl | 0278 | 0.4657063867776557 || ucl | 0201 | 0.41760566608994765 |+-------+------+---------------------+2 rows in set (0.04 sec)
布尔模式相较于自然语言,还能反向剔除一些关键词。例如每场足球比赛中几乎都有犯规行为,如果想知道哪些比赛很激烈,但是没有红黄牌甚至没有犯规,则可以用到布尔模式里的 “-” 运算符。
-- 布尔模式运算selectcount(*)fromsport_data_wholewherematch (news) against ('+激烈 -黄牌 -红牌 -犯规' in boolean mode);+----------+| count(*) |+----------+| 31 |+----------+1 row in set (0.04 sec)
一个调试的小技巧,当发现全文索引的查询结果不符合预期时,通常是因为分词结果不理想。OceanBase 提供了一个快速的 TOKENIZE 函数来辅助测试分词结果。函数支持所有分词器和对应属性。例如下面手动的分词结果,反映了词典中对于国外体育明星人名的支持还不是很好(博阿滕、格策),因此用这些人名去检索新闻的效果可能达不到预期。
-- tokenize 函数selecttokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内','ik','[{"additional_args": [{"ik_mode": "smart"}]}]');+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内', 'ik', '[{"additional_args": [{"ik_mode": "smart"}]}]') |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ["亚", "格", "夫", "阿", "门内", "从", "下钻", "后点", "右路", "分过", "传中", "低", "转身", "球", "射", "闪开", "博", "进", "反击", "门前", "停", "人", "皮", "裆", "策", "滕", "8米处", "托", "在", "角度"] |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.03 sec)selectcount(*)fromsport_data_wholewherematch (news) against ('+格策 +博阿滕' in boolean mode);+----------+| count(*) |+----------+| 0 |+----------+1 row in set (0.04 sec)
如果想提升分词器的精准性,OceanBase 支持修改系统词典表。当我们将上述中文人名插入到系统词典表后,重新分词的效果立竿见影。
🧡 注意:词典修改后,原索引分词效果不变,需要重建索引生效。
-- 中文人名分词效果selecttokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内','ik','[{"additional_args": [{"ik_mode": "smart"}]}]');+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tokenize('博阿滕右路反击人球分过传中,格策后点停球转身闪开角度,在门前8米处低射从皮亚托夫裆下钻进门内', 'ik', '[{"additional_args": [{"ik_mode": "smart"}]}]') |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| ["门内", "从", "下钻", "后点", "右路", "分过", "传中", "低", "转身", "球", "皮亚托夫", "射", "闪开", "进", "反击", "门前", "停", "人", "裆", "8米处", "在", "角度", "格策", "博阿滕"] |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.04 sec)selectcount(*)fromsport_data_wholewherematch (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_wholeNon_unique: 1Key_name: newsSeq_in_index: 1Column_name: newsCollation: ACardinality: NULLSub_part: NULLPacked: NULLNull: YESIndex_type: FULLTEXTComment: availableIndex_comment:Visible: YESExpression: NULL*************************** 2. row ***************************Table: sport_data_wholeNon_unique: 1Key_name: dateSeq_in_index: 1Column_name: dateCollation: ACardinality: NULLSub_part: NULLPacked: NULLNull: YESIndex_type: BTREEComment: availableIndex_comment:Visible: YESExpression: NULL2 rows in set (0.00 sec)
当两个索引条件使用 OR 连接时,过滤性好的情况下,union merge 带来的收益会比扫描普通索引后再过滤(计划中有 has_functional_lookup=true)更快。从两种计划最后预估的时间上可以看到有数量级的提升。
-- union merge 计划对比explainselect/*+UNION_MERGE(sport_data_whole date news)*/*fromsport_data_wholewheredate = '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*fromsport_data_wholewheredate = '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"的技术融合,助力企业构建新一代智能数据平台。
相关文章:
OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…...
Qt中的信号与槽及其自定义
信号源:哪个控件发的信号 信号的类型:用户进行不同的操作就会触发不同的信号 如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框 信号的处理方式:槽(slot)----也就是函数,Qt中用con…...
【PFPGA学习】状态机思想编程HDLbitsFPGA练习
目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 4. 选型建议 三、HDLbitsFPGA练习记录(combinational logic…...
Android 中集成 Unity 工程的步骤
在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…...
Python从入门到精通全套视频教程免费
概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…...
关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践
以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js
文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中,Mark…...
【回眸】Linux 内核 (十四)进程间通讯 之 信号量
前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...
Redis的used_memory_peak_perc和used_memory_dataset_perc超过90%会怎么样
当Redis的used_memory_peak_perc(当前内存占历史峰值的百分比)和used_memory_dataset_perc(数据集内存占比)均超过90%时,可能引发以下问题及风险: 一、used_memory_peak_perc > 90% 的影响 内存交换风险…...
帆软fvs文件中某表格新增数据来声提醒
1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件(如 mp3 格式),并将其放置在合适的目录。 例如:%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」,输入以下 JavaScript …...
从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人
前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…...
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
深入理解 React useLayoutEffect:精准掌控 DOM 更新时机
一、useLayoutEffect 的核心定位 1.1 与 useEffect 的关键差异 特性useEffectuseLayoutEffect执行时机浏览器绘制后异步执行DOM 更新后、绘制前同步执行视觉影响可能产生布局闪烁避免布局抖动性能影响对渲染阻塞较小可能阻塞浏览器渲染适用场景数据获取、事件订阅等DOM 测量、…...
Spring Boot 3.x 中 WebClient 全面详解及示例
Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。核心特性: 支持所有 HTTP 方法&a…...
Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
系列文档目录 Vue3+Vite+TypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档…...
深入解析原生鸿蒙中的 RN 日志系统:从入门到精通!
全文目录: 开篇语📖 目录🎯 前言:鸿蒙日志系统究竟有多重要?🛠️ 鸿蒙 RN 日志系统的基础结构📜 1. 日志的作用⚙️ 2. 日志分类 🔧 如何在鸿蒙 RN 中使用日志系统🖋️ 1…...
下一代AI App架构:前端生成,后端消失
过去十年,Web 和 App 的开发范式基本稳定:前端负责交互体验,后端负责业务逻辑和数据管理。即使是“无服务架构”也只是将后端“拆散”而非“消失”。 但随着 AI 原生应用的兴起,特别是 大模型本地化、小模型部署、WebAssembly、L…...
$_POST 超级全局变量
$_POST 是一个超级全局变量,在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同,$_POST 允许发送大量数据,且数据不会显示在 URL 中,因此更适用于提交敏感信息,如用户登录信息、表单数据等。 使…...
开发一个环保回收小程序需要哪些功能?环保回收小程序
废品分类展示与识别 详细分类列表:清晰展示常见废品类型,如废纸(报纸、书本纸、包装纸等)、塑料(塑料瓶、塑料容器、塑料薄膜等)、金属(易拉罐、铁制品、铜制品等)、玻璃࿰…...
Debezium嵌入式连接postgresql封装服务
文章目录 1.项目结构:2.依赖:3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口(表处理抽象)7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…...
Mixed Content: The page at https://xxx was loaded over HTTPS
一、核心原因分析 Mixed Content 警告是由于 HTTPS 页面中引用了 HTTP 协议的资源(如脚本、图片、iframe 等),导致浏览器因安全策略阻止加载这些非加密内容。HTTP 资源可能被中间人攻击篡改,破坏 HTTPS 页面的整体安全性。 二、推荐解决方案 1. 强制资源升级为 HTTPS •…...
深度学习、图像算法学习记录
深度学习加速 综述文档: https://chenzomi12.github.io/02Hardware01Foundation/02ArchSlim.html winograd: https://zhuanlan.zhihu.com/p/260109670 ncnn 1.修改模型结构,优化模型内存访问次数,加速。 VGG 和 InceptionNet : …...
对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?
在Java中,对象的创建方式及其在虚拟机中的具体过程如下: 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式,直接调用类的构造方法。 MyClass obj new MyClass();反射(Reflection) 通过 Class 或 Constructor…...
Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南
在电商采购和供应链管理中,了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台,提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口,开发者可以获取工厂的详细信息,包括工厂名称、地址、联系方…...
15. git push
基本概述 git push 的作用是:把本地分支的提交推送到远程仓库。推送分支需要满足快进规则(Fast-Forward),即远程分支的最新提交必须是本地分支的直接祖先,这个是通过哈希值值进行判断的。 基本用法 1.完整格式 git…...
Perl 发送邮件
Perl 发送邮件 概述 Perl 是一种强大的编程语言,广泛应用于系统管理、网络编程和数据分析等领域。其中,使用 Perl 发送邮件是一项非常实用的技能。本文将详细介绍使用 Perl 发送邮件的方法,包括必要的配置、代码示例以及注意事项。 准备工…...
Rust所有权详解
文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理,手动申请和释放,即便有了智能指针,对于效率的影…...
大模型推理--Qwen2.5-Omni在A100上的初体验
过去的一周Qwen2.5-Omni产生了很高的热度,吸引了很多人的目光。它的多模态确实很吸引人,放出来的demo体验还算尚可(语音对话的延迟还是太大),所以就在A100 PCIe上实地部署了一下,初步对其速度进行了测试&am…...
CExercise_07_1指针和数组_2数组元素的逆序数组逆序(指针版 reverse_by_ptr 和下标版 reverse_arr)
题目: 数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。 关键点 arr[i] arr[len - 1 - i]; arr[0]arr[len-1]; 如果数组序列是偶数,则调换最中间一对为止;若为奇数,则单出一个不用反转. 思想就是长度取一半 eg:8/2, 9/24.5,反转一半,到5时固定…...
