给静态博客加全站搜索:Lunr 预构建索引实践
站点文章过百后,翻归档找内容变得很烦,于是决定给纯静态博客加搜索。做法是在构建阶段用 Lunr.js 生成索引:写一个 Node 脚本遍历 content 目录下的 Markdown,用 gray-matter 取 front matter,用 remark 把正文转成纯文本,再截取前若干字符作为摘要,逐篇 add 进 Lunr 索引后序列化写入 public/search-index.json。前端搜索页只在用户聚焦输入框时才 fetch 这个文件并 lunr.Index.load,避免首屏白白下载几百 KB。踩的坑有三个:中文分词默认按空格切,整句进不去索引,改成对正文按单字和二元组合建 token;索引里带原始正文导致文件膨胀到近 1MB,压缩成仅标题加摘要后降到 120KB 左右;日期字段必须转成时间戳,否则按时间排序会错乱。结论是静态站完全能拥有可用的本地搜索,代价是每次构建多花两秒,换来零后端依赖和即时响应。
站点文章过百后,翻归档找内容变得很烦,于是决定给纯静态博客加搜索。做法是在构建阶段用 Lunr.js 生成索引:写一个 Node 脚本遍历 content 目录下的 Markdown,用 gray-matter 取 front matter,用 remark 把正文转成纯文本,再截取前若干字符作为摘要,逐篇 add 进 Lunr 索引后序列化写入 public/search-index.json。前端搜索页只在用户聚焦输入框时才 fetch 这个文件并 lunr.Index.load,避免首屏白白下载几百 KB。踩的坑有三个:中文分词默认按空格切,整句进不去索引,改成对正文按单字和二元组合建 token;索引里带原始正文导致文件膨胀到近 1MB,压缩成仅标题加摘要后降到 120KB 左右;日期字段必须转成时间戳,否则按时间排序会错乱。结论是静态站完全能拥有可用的本地搜索,代价是每次构建多花两秒,换来零后端依赖和即时响应。