项目开发进度日志 (progress.md)
已完成
- [x] 排查中文搜不出结果的根本原因:之前使用连续中文匹配正则
[\u4e00-\u9fa5]+将整句话作为单一 token 存入索引,导致非句首关键词无法通过前缀匹配检索到。 - [x] 实现现代化混合多粒度中文分词器(Intl.Segmenter + 连续词组 + 单字索引):
- 调用现代 JS 原生
Intl.Segmenter提取自然中文词汇(如“系统”、“架构”、“设计”、“干净”); - 结合英文单词正则提取与 2~10 字连续词组提取;
- 补充单汉字索引,保证无论搜单字、复合词还是专业术语都能 100% 准确命中;
- 配合 Mark.js 长词优先匹配机制,确保高亮时连续整词标黄,绝不产生零散破碎色块。
- 调用现代 JS 原生
- [x] 解决多级标题每次被当作独立文章重复出现的问题:
- 文章建立唯一的顶级主条目(
boost.title = 8); - 降低子小节
titles权重(0.1),搜标题时仅出现文章主卡片。
- 文章建立唯一的顶级主条目(
- [x] 正文文本摘要提取机制验证与排查:
- 明确 VitePress 原生内置
detailedView: true(正文摘要模式 / Excerpt); - 阐明分章节锚点(Anchor)提取、Mark.js 自动聚焦命中词段落并高亮展示的技术底层;
- 优化 CSS 摘要容器
.excerpt-wrapper、.excerpt与暗黑模式支持。
- 明确 VitePress 原生内置
- [x] 构建验证:执行
npm run build,成功编译通过(3.34s),验证索引与正文摘要逻辑正常运行。
架构字典
| 文件路径 | 说明 |
|---|---|
| [.vitepress/config.ts](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/config.ts) | VitePress 核心配置文件,包含主题、导航、MiniSearch 本地搜索(混合多粒度中文分词器、分段策略、搜索权重 Boost、detailedView 正文摘要视图)等配置 |
| [.vitepress/theme/custom.css](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/theme/custom.css) | 主题全局与组件样式表,包含全新的现代精致搜索弹窗样式(.VPLocalSearchBox、.excerpt 正文摘要渐变定位与 mark 关键词高亮)、暗色模式适配及全局重置 |
| [.vitepress/theme/serverUtils.ts](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/theme/serverUtils.ts) | 服务端工具方法,用于读取所有文章元数据、排序并生成分页 Markdown 文件 |
| [.vitepress/theme/date.ts](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/theme/date.ts) | 日期解析与格式化工具函数 |
| [.vitepress/theme/functions.ts](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/theme/functions.ts) | 页面初始化与通用函数 |
| [.vitepress/theme/pagination.ts](file:///D:/Users/A/Desktop/VitepressBlog/.vitepress/theme/pagination.ts) | 分页数据处理函数 |
函数字典目录
.vitepress/config.ts
_splitIntoSections(file: string, html: string):自定义 MiniSearch 页面分段函数。为每篇文章生成 1 个高权重的主文档条目(代表文章整体),并仅对包含实质正文且 anchor 唯一的子小节生成精准跳转索引,同时为每个小节挂载实质 text 供正文检索和摘要提取。tokenize(str: string):现代化混合多粒度中文分词函数,基于Intl.Segmenter自然语义词组 + 连续词块 + 单字覆盖,确保任意中文词汇精准检索与整词连续高亮。
.vitepress/theme/serverUtils.ts
getPosts(pageSize: number):扫描posts/目录下全部 md 文件,提取 frontmatter 元数据并按日期/权重排序,触发分页生成。generatePaginationPages(total: number, pageSize: number):生成page_*.md分页文件及首页index.md,并在 frontmatter 中标注search: false。_compareDate(obj1, obj2):文章排序比较器,优先对比 order,次之对比发布日期。_convertOrder(input):安全转换文章权重 order 为数字。
.vitepress/theme/date.ts
convertDateV2(date):将各种格式的日期解析并格式化为标准时间戳或字符串。
错误/交互日志
| 阶段 / 命令 | 发现问题 / 控制台信息 | 解决方案 |
|---|---|---|
| 中文搜索失效 | [\u4e00-\u9fa5]+ 把一整句中文当成一个 Token,导致非句首词汇无法被 MiniSearch 前缀匹配命中。 | 引入原生 Intl.Segmenter + 词组 + 单字多粒度混合分词,确保所有词汇与单字均可被检索。 |
| 标题冗余排查 | 搜索标题关键词时,因为所有子小节的 titles 都继承了主标题,导致一篇文章的全部子标题都作为独立结果涌入列表。 | 将文章主条目设为高权重,降低子小节 titles 权重(0.1),搜标题时仅出现文章主卡片。 |
| MiniSearch ID 重复 | 构建时报错 duplicate ID /pages/about.html#about-me。 | 文章主条目使用空 anchor(代表文件本身),各子小节使用唯一 anchor 并进行 seenAnchors 集合去重。 |
构建验证 npm run build | 构建通过,耗时约 3.34s,索引与正文摘要逻辑正常运行。 | 验证通过。 |
关联映射
中文搜索失效 -> config.ts 升级为 Intl.Segmenter + 混合多粒度分词器中文整词高亮 -> 词组长词优先匹配 -> Mark.js 连贯标黄不破碎多级标题去重 -> 结构化分层 + boost 权重精调 (title:8, text:4, titles:0.1)正文匹配摘要提取 -> config.ts 配置 detailedView: true + custom.css 优化 .excerpt 样式与自动定位