给静态站加全文搜索:从零搭 SQLite FTS5 索引
站点文章过百后,前端 Fuse.js 全量加载 JSON 已让首屏明显变慢,遂改为构建期生成 SQLite FTS5 索引、后端只暴露一个查询接口。做法是写脚本遍历 Markdown 的 front matter 与正文,用 better-sqlite3 建表并插入,正文走 unicode61 分词、标题加权,同时把每篇的 slug 与摘要存成普通列便于回显。踩坑有三:一是中文分词默认按字切,长词检索命中差,改为在写入前做一次简单的二元切分并保留原串;二是索引文件随构建产物一起发布,被静态托管当普通文件下载,改用反向代理只允许 POST 查询;三是增量构建时表结构不一致导致查询报错,最终每次全量重建并加版本号校验。结论:百来篇文章索引不到 2MB,查询延迟稳定在毫秒级,比纯前端方案省下首屏体积。
站点文章过百后,前端 Fuse.js 全量加载 JSON 已让首屏明显变慢,遂改为构建期生成 SQLite FTS5 索引、后端只暴露一个查询接口。做法是写脚本遍历 Markdown 的 front matter 与正文,用 better-sqlite3 建表并插入,正文走 unicode61 分词、标题加权,同时把每篇的 slug 与摘要存成普通列便于回显。踩坑有三:一是中文分词默认按字切,长词检索命中差,改为在写入前做一次简单的二元切分并保留原串;二是索引文件随构建产物一起发布,被静态托管当普通文件下载,改用反向代理只允许 POST 查询;三是增量构建时表结构不一致导致查询报错,最终每次全量重建并加版本号校验。结论:百来篇文章索引不到 2MB,查询延迟稳定在毫秒级,比纯前端方案省下首屏体积。