Skip to content

项目开发进度日志 (progress.md)

已完成

  • [x] 排查中文搜不出结果的根本原因:之前使用连续中文匹配正则 [\u4e00-\u9fa5]+ 将整句话作为单一 token 存入索引,导致非句首关键词无法通过前缀匹配检索到。
  • [x] 实现现代化混合多粒度中文分词器(Intl.Segmenter + 连续词组 + 单字索引)
    1. 调用现代 JS 原生 Intl.Segmenter 提取自然中文词汇(如“系统”、“架构”、“设计”、“干净”);
    2. 结合英文单词正则提取与 2~10 字连续词组提取;
    3. 补充单汉字索引,保证无论搜单字、复合词还是专业术语都能 100% 准确命中;
    4. 配合 Mark.js 长词优先匹配机制,确保高亮时连续整词标黄,绝不产生零散破碎色块。
  • [x] 解决多级标题每次被当作独立文章重复出现的问题
    • 文章建立唯一的顶级主条目(boost.title = 8);
    • 降低子小节 titles 权重(0.1),搜标题时仅出现文章主卡片。
  • [x] 正文文本摘要提取机制验证与排查
    • 明确 VitePress 原生内置 detailedView: true(正文摘要模式 / Excerpt);
    • 阐明分章节锚点(Anchor)提取、Mark.js 自动聚焦命中词段落并高亮展示的技术底层;
    • 优化 CSS 摘要容器 .excerpt-wrapper.excerpt 与暗黑模式支持。
  • [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 样式与自动定位