搜索引擎核心链路:倒排索引、排序模型与实时检索架构
做搜索的人都绕不开一个问题一个日请求量以亿计的头部搜索引擎从用户敲下关键词到结果展示这中间到底发生了什么倒排索引、Ranking模型、实时检索架构这三个词几乎串起了搜索引擎工程的全部骨架。很多人把概念背得很熟但真正把它们连成一条完整链路、理解每一步背后的工程取舍才是从“会用搜索引擎”到“能搭搜索引擎”的分水岭。这篇文章我想用做业务的视角来拆把倒排索引的数据组织方式、排序模型的线上部署、实时索引的流式处理讲透顺便把一路踩过的坑和排查思路也一并交代。内容不追求面面俱到但凡是关键环节都会给出可以落地的方案和参数选择逻辑。正在做搜索、推荐系统或者想从零理解搜索内核的同学这篇文章应该能帮你省下不少自己摸索的时间。1. 倒排索引搜索系统的地基工程1.1 为什么搜索引擎非要倒着来先说一个最基本的问题为什么搜索引擎不用正排表非得维护一份“倒排”的索引正排表的思路很直观——以文档为主键记录文档里有哪些词查询的时候把每篇文档扫一遍看它包不包含用户搜的词。这在文档量小的时候没问题但文档量一旦到千万、亿级一次查询就要扫全量数据单次延迟直接奔着秒级去完全没法用。倒排索引的思路反过来以词为主键记录“这个词出现在哪些文档里”。查询的时候只需要去词典里找到这个词然后顺着它的文档列表把结果取出来。这个转换把一次“全表扫描”变成了“按需读取”复杂度从O(文档总量)直接降到O(包含该词的文档数)。用生活里的话说正排索引就像你读一本没有目录的书想知道“成本”这个词在哪页只能从头翻到尾倒排索引就是书末尾的术语索引表翻到对应条目就知道所有出现页码效率完全不是一个量级。这套数据结构之所以至今仍是搜索系统的绝对地基是因为它把“读”的代价压到了最低。搜索引擎的读请求量远大于写请求量索引结构的设计就是为了让查询路径尽可能短、磁盘IO尽可能少。理解了这一点后面所有的索引优化方向其实都是围绕同一个目标让倒排链更短、更紧凑、更好跳。1.2 词典与倒排链的结构演进倒排索引分两大部分词典和倒排链。词典解决“用户输入的词是否存在”倒排链解决“这个词对应哪些文档”。词典结构常见的有哈希表、B树、双数组Trie、FST。哈希表查找最快O(1)但没法做前缀查询、也没法高效做序列化加载B树支持范围查询但内存占用偏高双数组Trie适合做前缀匹配和词条自动补全FST有限状态转换器在这几年的头部搜索引擎里用得较多它在保证查询速度快的同时能把词典压缩到很小的体积特别适合加载到内存里常驻。我实际见过的一个方案是热词词典用FST常驻内存冷词走B树或分片文件加载。词典层的核心考验不只是查询速度还有内存占用。一个千万量级的词典如果用简单HashMap存原始字符串内存开销可以到几百MB甚至上GBFST能把同样的词表压到十分之一左右。选型的时候先看你手头词表量级再决定要不要上压缩结构不要一上来就追求最复杂的技术方案。倒排链则是按文档ID有序排列的数组每个条目通常记录三件事文档ID、词频、词在文档内的位置信息。位置信息不是所有场景都要如果只做文档级检索可以砍掉位置项索引体积能缩很多但要做短语查询、邻近度计算位置信息就省不掉。这就是一个典型的“按需存储、按查询模式裁剪”的工程取舍。1.3 压缩与跳表让索引又小又快倒排链有好几个痛点单个高频词的倒排链可能上亿条直接存int数组内存吃不消查询时如果要从头扫到尾高频词场景依然很慢。解决思路有两个方向压缩和跳跃。整数压缩的主流方案是PForDelta和Varint。Varint用变长编码小整数占一个字节大整数占多个字节实现简单但解码有分支开销PForDelta先做增量编码——把文档ID差值算出来大多数差值都很小然后用固定位数打包存储批量解码速度极快。实测下来用PForDelta这类批量解码方案倒排链的解码速度可以比逐条Varint解码快2到3倍CPU缓存友好性是关键。跳表Skip List则是给倒排链加“路标”。在倒排链上每隔固定间隔存一个“跳点”记录当前偏移和下一个文档ID。做交集运算的时候如果某个链的当前文档ID远小于另一条链的当前文档ID就直接通过跳点跳到更接近的位置避免逐条比较。布尔查询AND里多条倒排链取交集的耗时能从O(链长之和)降到近似O(短链长度)这是搜索延迟大幅降低的重要因素。提示倒排链的压缩和跳点是配套使用的——压缩减小IO开销跳点减少解码范围。两者不要分开优化联合设计的效果远大于各自独立优化。1.4 索引分片与多副本单机放不下全量索引这是大体量搜索系统必须面对的问题。常规做法是按文档ID范围分片比如把全部文档哈希到64个分片每个分片独立建索引每个分片再放多个副本提升吞吐容错。查询时一次请求广播到所有分片各分片返回局部TopK最终在协调节点做归并排序。这里有个容易被忽略的点分片数量和TopK取值要联动考虑。如果总分片数是N每个分片返回K条最终你能拿到N×K条候选归并后才能选出全局TopK。K太小可能漏掉真正的高质量结果K太大会让排序层压力倍增。工程上一般会让N×K是目标返回量的5到10倍留足召回冗余。2. Ranking模型从相关性打分到排序决策2.1 BM25为什么至今没被淘汰检索召回之后多篇文档谁排前面要靠相关性打分。传统模型里BM25是绕不开的经典它把词频、逆文档频率、文档长度归一化组合成一个可解释的打分公式。词频用饱和函数做非线性变换——某个词出现次数很多时再多出现一次带来的增益会越来越小这符合直觉文档长度归一化则避免长文档因为“词多”而天然占便宜。BM25经久不衰的原因有三个。第一是效果下限高参数就那么几个调一版就能达到不错的水准第二是可解释性强线上出问题能直接拆解到是哪一项贡献过高第三是计算开销极小纯CPU计算不需要额外模型推理。直到现在很多头部搜索引擎的系统里BM25依然承担着粗排甚至部分精排的底座角色。但BM25本质上是词面匹配模型它感知不到同义词、感知不到句法结构、感知不到用户个性化。所以现代搜索系统普遍采用“BM25兜底机器学习模型调序”的组合召回阶段用BM25保证相关性底线排序阶段再让模型去学更复杂的偏好。2.2 学习排序从LTR到深度排序模型LTRLearning to Rank学习排序把排序问题建模成一个监督学习任务。训练数据是“查询-文档-标签”三元组标签可以是人工标注的相关性等级也可以是用户点击行为转化出的偏序关系。方法上有三条路线Pointwise把每个文档单独打分Pairwise让模型学习文档两两之间的先后关系Listwise直接对整条结果列表做优化。工业界用得最多的还是Pairwise和Listwise。Pairwise的代表思路是LambdaRank它会给每个文档对计算一个梯度权重这个权重和排序指标的变化挂钩——即使两个文档的分数差一样如果交换它们的位置能带来NDCG的收益梯度就更大。这个设计很巧妙相当于让模型直接优化目标指标而不是单纯拟合标签。到了深度学习阶段模型结构从单点特征MLP逐渐演进到可以同时建模Query和Doc交互的深度结构。早期的做法是把Query和Doc各自编码成向量再拼接后过全连接层后来业界发现让用户输入的词和文档在模型内部做早期交互效果会明显好于后期拼接。这带出一个连续的经验排序模型的表达力不在层数多少而在于特征交互发生在哪一层。线上深度排序模型的分层也很有讲究。一次查询召回几千条如果每条都过完整的大模型延迟直接超标。常见的做法是分两段粗排用一个轻量模型从几千条里快速选几百条精排再用大模型对几百条做精细化打分。粗排模型求快特征少、模型小精排模型求准特征全、计算重两者各司其职。2.3 特征工程与在线推理的延迟预算排序效果的差异很大程度在特征工程。文本特征、静态质量特征、用户行为特征三类特征组合起来才有区分度。文本特征包括BM25得分、重叠词数、命中的字段权重标题命中权重大于正文命中静态特征包括文档的权威度、时效性、来源质量行为特征包括该文档的历史点击率、平均停留时长、同一Query下过往的点击偏好。特征上线时要特别小心“未来特征”问题——有些特征在预测时点是拿不到的比如“当天结束前的全文点击率”这类特征只能做滞后统计或预估值用错了会造成线上线下不一致模型上线后效果断崖式下跌。在线推理的延迟预算要提前划好。一个搜索请求总延迟按几百毫秒预算的话排序模型只能分到很小的份额。精排模型通常要做特征拼接、模型推理、结果后处理能用的时间窗口可能只有几十毫秒。所以在工程实现上特征要提前算好存成稠密向量模型要量化或裁剪到目标延迟以内推理框架要支持批处理来摊薄开销。我见过不少团队因为只优化模型AUC忽略了推理耗时最后模型做出来了却上不了线白白浪费一个迭代周期。3. 实时检索架构让新内容秒级可见3.1 从全量重建到增量索引搜索引擎的写入场景不如数据库频繁但对时效性的要求越来越高。资讯类内容希望发布后几秒内能被搜到社交类内容更是要求近实时可见。早期方案是周期性全量重建索引——每天凌晨跑几个小时把全量文档重新灌一遍这种模式下新内容隔天才能上线已经完全满足不了需求。从全量重建演进到增量索引核心思路是只处理新增和变更的文档不动历史的倒排链。每次写入的新文档生成一个小的索引片段查询时同时读取内存中的新片段和磁盘上的历史片段结果合并后返回。这个过程不需要重写全量索引写入成本从“小时级”降到“秒级”。增量索引带来的复杂度也很明显碎片化。索引被拆成无数个小片段后一次查询要读很多个片段再合并单次查询的开销会随着片段数量增加而劣化。解决思路是后台做Segment合并——把多个小片段定期合并成一个大片段让片段数量保持在一个低位。合并策略通常是分层合并跟日志系统的compaction思路很像小片段先合并成中片段中片段再合并成大片段全链路异步执行不阻塞线上查询。3.2 实时索引的Pipeline全链路设计一条新文档从进入系统到能被搜索到中间会经过一条完整的流水线。文档先被写入消息队列做到削峰填谷索引构建服务消费消息对文档做清洗、分词、字段解析、倒排构建生成索引片段写入内存索引区。内存索引区达到一定阈值后被异步落盘成Segment文件同时后台触发合并任务。写入这一侧的实时性关键指标是“从发布到可搜”的延迟。全链路延迟 消息队列堆积延迟 构建耗时 内存索引可见延迟。排查延迟超标时先看队列消费积压再看构建服务是否出现GC停顿最后看内存索引刷盘策略是否过于保守。多数情况下积压在消息队列是最常见的瓶颈需要动态扩容消费者或做优先级分流而不是盲目调构建逻辑。查询这一侧数据可见性用的是典型的近实时Near Real-Time模型新数据先进内存索引查询直接读内存索引和磁盘Segment的快照。这里有一个工程上必须接受的事实——索引数据是最终一致的。写入方发出更新后查询端在极短时间窗口内可能还看到旧数据这是近实时索引的固有特性需要在业务上允许。如果要做到严格线性一致就得加分布式锁或者版本校验成本会高很多。搜索场景对一致性的容忍度一般都比较高绝大多数团队会选近实时而不是强一致。3.3 查询路径上的缓存与加速查得快不光靠索引结构缓存是必不可少的一层。搜索系统的缓存分很多层查询词级别的结果缓存、倒排链级别的块缓存、文档正排字段的RowCache、词典的字典缓存。热点词的结果缓存命中率可以做到非常高一次完整的索引查询和排序计算都可以被跳过延迟能大幅下降。缓存选型的核心考量是哪些数据适合缓存、缓存多长期限。结果缓存适合高频Query但要注意更新时机——索引有新数据写入后旧缓存必须失效。常见做法是给缓存带上索引版本号索引版本一旦变更整层缓存自动过期。这个方法简单粗暴但有效避免了逐条清理的麻烦。还有一个被低估的加速点查询改写与DCDynamic Collection动态限定集合。不是所有Query都需要扫全量分片。热门大词可以走专属的短倒排链集合意图实时性强的Query可以限定只扫最近N小时的新索引片段带地域属性的Query也可以先按地域过滤掉无关分片。这些手段本质都是在缩小检索范围让系统把算力集中在真正需要的地方。4. 常见问题与排查实录4.1 索引延迟与一致性问题排查线上最常见的问题是“新内容搜不到”。排查链路从写入端开始先确认文档有没有进消息队列消费积压有多大再确认构建服务有没有正常产出Segment内存索引的可见性开关有没有打开最后确认查询端有没有读到最新版本。整个过程可以用一条日志链路串起来关键节点打上时间戳一查就能定位瓶颈。如果“搜不到”只发生在部分节点上那通常是分片间数据不一致。某个分片的副本可能落后了查询如果随机路由到滞后副本就会漏结果。排查方法是看各副本的索引版本号是否齐平落后的一方赶紧从正常副本拉增量补齐。这里有个实操细节副本健康检查不能只看进程存活要看索引版本是否足够新否则返回的“健康”是假健康。删除和更新的可见性也有坑。倒排链上删文档很多系统用的是墓碑机制——不真正抹掉文档而是记录一个删除标记查询时过滤掉。墓碑要等Segment合并时才会真正清理。如果墓碑太多查询时过滤成本上升索引体积也开始膨胀。需要定期监控墓碑数量占比触发阈值后强制合并对应Segment段组。4.2 排序质量下降的归因分析线上排序效果变差原因通常集中在三块特征漂移、模型老旧、候选集收缩。特征漂移指线上特征分布和训练时候不一致了比如某个统计特征从均值10漂到均值100模型输入分布变了输出自然不可信。排查时把线上特征的均值、方差拉出来跟训练样本做对比差异超过阈值就要触发特征校准或重新训练。模型老旧的典型症状是新Query的表现明显变差但老Query还好。原因是模型没有持续吸收新数据用户行为的分布已经变了模型还停在过去。对策有三档最低档是定期用新样本重训中档是引入全量/增量训练流水线每天或每小时刷新模型高档是做在线学习让模型在推理完成后立刻从用户真实反馈中更新参数。具体选哪一档取决于你的系统对延迟和稳定性的容忍度不必盲目追求最高档。候选集收缩的原因则藏在召回阶段。可能是某条倒排链因为压缩bug丢失了尾部文档也可能是分片副本掉线导致某个分片的候选缺失。这类问题最隐蔽特征和模型都正常但候选里根本没有相关内容。判断方法是把召回候选数、各分片返回数、TopK合并数三层指标都监控起来任何一个数值异常下降马上顺着链路往下钻。4.3 性能优化的实战技巧表最后给一张速查表按“现象→方向→手段”梳理方便现场对照现象定位方向常用手段单次查询延迟升高倒排链解码耗时检查压缩算法是否为批量解码对长链启用跳点前置过滤高频词查询超时词的热度分布不均高频词单独走优化链路倒排链预聚合或结果缓存索引写入积压构建服务消费慢扩容消费者把解析和构建拆成多级流水线新内容可见慢内存索引刷盘策略调低落盘阈值打开可见性开关做近实时查询排序模型耗时超标精排模型过重改用粗排精排两级模型量化或特征裁剪磁盘索引体积膨胀墓碑/废弃Segment堆积触发合并清理墓碑调整合并阈值参数优化的时候有个顺序建议先看缓存命中率再看索引结构最后才动模型。缓存是最容易出效果的一层往往调几个参数就能让整体延迟指标降下来索引结构改动风险小、收益稳定模型层面的优化空间大但周期长不要把它当作性能问题的第一反应。5. 一些掏心窝的经验写到这里倒排索引、排序模型、实时架构的工程链路基本串完了。按我个人的体会这个领域最核心的能力不是背公式而是“在任何一层出问题时能快速判断问题到底在哪一层”。搜索系统的调用链实在太长任何一个环节都可能成为瓶颈没有全局视野就只能靠瞎试。最后再分享一个小技巧无论架构多复杂一定要在全链路的每个关键节点埋好时间戳和日志。延迟从哪一段涨的、候选从哪一层开始漏的、模型推理在哪个分片变慢的这些数据是排查问题的半条命。很多团队花大价钱优化模型和索引却舍不得花时间在观测体系上结果线上出问题只能靠猜这是最可惜的事。希望你读到这里的同学能少走这段弯路。

相关新闻

FastAPI文件上传下载实战:流式响应与后台任务状态追踪

FastAPI文件上传下载实战:流式响应与后台任务状态追踪

如果你能一路刷到这篇 FastAPI 学习教程的第 7 部分,说明前面那些路由、请求参数、依赖注入的关卡已经过得差不多了。但我猜你心里早就堆着一个问题:光会用 GET、POST 返回 JSON 根本不够,真实系统里永远离不开文件上传、文件下载、后台跑一个…

2026/10/18 20:02:39 阅读更多 →
银行卡BIN号资源落地实战:从Excel到MySQL与PG的完整链路

银行卡BIN号资源落地实战:从Excel到MySQL与PG的完整链路

简介:这份资源面向金融数据分析、风控开发及数据库运维人员,提供2020年4月25日版银行卡BIN号数据集合,用于识别发卡行、卡片类型与归属机构,支撑交易验证、反欺诈与客户分析等场景。压缩包共7个文件,以5个xls表格和2个…

2026/10/18 20:01:39 阅读更多 →
360评估和绩效考核评估有何区别,2026 怎么选才对

360评估和绩效考核评估有何区别,2026 怎么选才对

LinkedIn 2025年的一项调研显示,72%的职场人认为绩效评估不公平是离职的重要原因之一。当单一上级的评分成为决定一个人去留和回报的唯一依据,焦虑几乎是结构性的。很多企业试图用360评估来“纠偏”,结果却把多角色反馈做成了另一种形式的打分…

2026/10/18 20:01:39 阅读更多 →

最新新闻

Agent 系统线上监控指标设计:Token 消耗速率、幻觉拦截率与工具调用延迟

Agent 系统线上监控指标设计:Token 消耗速率、幻觉拦截率与工具调用延迟

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 21:11:40 阅读更多 →
Layui2.5.6 + ThinkPHP6.0.2 权限管理后台搭建实战与避坑指南

Layui2.5.6 + ThinkPHP6.0.2 权限管理后台搭建实战与避坑指南

简介:这是一套基于 layui2.5.6 前端组件库与 ThinkPHP6.0.2 后端框架搭建的权限管理后台源码,面向需要快速构建企业级管理系统的 PHP 开发者,也适合初学者理解前后端协同开发流程。资源包共 1098 个文件,约 6.1MB,以 4…

2026/10/18 21:11:40 阅读更多 →
IntelliJ IDEA插件开发:文件、类、包选择器实战详解

IntelliJ IDEA插件开发:文件、类、包选择器实战详解

1. 项目概述与整体设计思路做插件做到 UI 这一层,大家遇到的第一道坎往往是“让用户选东西”。文件选择器、类选择器、包选择器,这三个东西光听名字就知道是干嘛的:弹一个原生对话框,让用户挑一个文件、挑一个 Java 类、挑一个包&…

2026/10/18 21:11:40 阅读更多 →
Claude Code knowledge-work-plugins 安装配置与实战指南

Claude Code knowledge-work-plugins 安装配置与实战指南

1. 从零认识 knowledge-work-plugins:它到底解决什么问题第一次看到knowledge-work-plugins这个仓库名,很多人会下意识以为它又是一个“插件市场”或者“扩展合集”。但真正翻过它的目录结构、跑过几个 slash commands 之后,你会发现它的定位…

2026/10/18 21:11:40 阅读更多 →
knowledge-work-plugins 插件体系:Claude Code 知识工作自动化实战

knowledge-work-plugins 插件体系:Claude Code 知识工作自动化实战

1. 从零认识 knowledge-work-plugins:它到底解决什么问题第一次看到knowledge-work-plugins这个仓库名,很多人会以为它又是一个“插件合集”,点进去才发现它其实是一套围绕知识工作场景设计的扩展体系。简单说,它把日常重复性的知…

2026/10/18 21:11:40 阅读更多 →
knowledge-work-plugins 实战:Claude Code 插件安装配置与知识工作自动化

knowledge-work-plugins 实战:Claude Code 插件安装配置与知识工作自动化

1. 从零认识 knowledge-work-plugins:它到底解决什么问题第一次看到knowledge-work-plugins这个仓库名,很多人会以为它又是一个“插件合集”,点进去才发现它其实是一套围绕知识工作场景设计的扩展体系。简单说,它把日常重复性的知…

2026/10/18 21:10:39 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →