给静态博客加上全文搜索:从 40MB 索引压到 1.2MB

我的博客用纯静态生成器部署在对象存储上,文章涨到 300 多篇后站内搜索成了刚需。第一版直接用构建脚本把全部正文塞进一个 JSON,产物 40MB,首屏要等好几秒,移动端基本不可用。这次改成构建期切词建倒排索引:用 jieba 对标题和正文分词,过滤停用词,记录每篇文章的词频与位置偏移,同时写入文章元数据表。查询时先匹配词项再按词频和标题命中加权排序,只返回摘要片段和锚点,不加载全文。索引分片成若干小文件按需拉取,gzip 后 1.2MB。踩的坑是中文分词对英文技术词会切碎,加了英文词表保护;另外停用词过滤太狠会漏召回,把高频虚词保留但降权。结论是静态站也能有可用的全文搜索,关键是索引体积和首屏加载的权衡。

我的博客用纯静态生成器部署在对象存储上,文章涨到 300 多篇后站内搜索成了刚需。第一版直接用构建脚本把全部正文塞进一个 JSON,产物 40MB,首屏要等好几秒,移动端基本不可用。这次改成构建期切词建倒排索引:用 jieba 对标题和正文分词,过滤停用词,记录每篇文章的词频与位置偏移,同时写入文章元数据表。查询时先匹配词项再按词频和标题命中加权排序,只返回摘要片段和锚点,不加载全文。索引分片成若干小文件按需拉取,gzip 后 1.2MB。踩的坑是中文分词对英文技术词会切碎,加了英文词表保护;另外停用词过滤太狠会漏召回,把高频虚词保留但降权。结论是静态站也能有可用的全文搜索,关键是索引体积和首屏加载的权衡。

相关实践 →