VS Code 的 docfind:用 Rust 和 WebAssembly 构建快速客户端搜索
VS Code 官方博客发表文章,由 João Moreno 撰写,介绍 docfind——VS Code 官网文档搜索背后的客户端搜索引擎。它完全在浏览器中用 WebAssembly 运行,提供近乎即时的搜索体验。技术栈:有限状态转换器(FST)实现快速关键词查找、RAKE(Rapid Automatic Keyword Extraction)提取文档关键词、FSST(Fast Static Symbol Table)压缩字符串。本文基于 VS Code 官方文章,解读 docfind 的构建历程、技术选型与实现思路。
问题:网站搜索体验的差距
- VS Code 网站之前是基础搜索:输入查询后跳转到由传统搜索引擎驱动的结果页
- 希望搜索结果随输入即时出现,类似 VS Code 的 Quick Open(Ctrl+P)
- 目标是:快速、纯客户端、紧凑、易于托管和运维
备选方案评估
| 方案 | 特点 | 问题 |
|---|---|---|
| Algolia | 搜索即服务的标杆 | 想要纯客户端方案 |
| TypeSense | 强大的开源搜索 | 需要服务端代码,多一个服务要维护监控 |
| Lunr.js | 客户端 JavaScript 搜索 | 3 MB 文档生成约 10 MB 索引文件,太大 |
| Stork Search | WebAssembly 客户端搜索,演示不错 | 索引仍偏大,项目似乎无人维护 |
没有选项同时满足:快速、客户端、紧凑、易托管。
灵感:三块技术拼图
FST(有限状态转换器)
- 灵感来自 Andrew Gallant(burntsushi,ripgrep 作者)近十年前的文章《Index 1,600,000,000 Keys with Automata and Rust》
- FST 可以紧凑的二进制格式索引海量字符串数据,支持快速查找(包括正则和模糊匹配)
- FST 将排序的字符串键存储在状态机中,内存高效且查询快速
- Andrew 发布了实现这一点的 Rust 库:fst
RAKE(Rapid Automatic Keyword Extraction)
- 从文本中提取有意义关键词和短语的算法
- 输入文档,返回按重要性排序的关键词
- 用于从文档中提取需要索引的关键词
FSST(Fast Static Symbol Table)
- 针对短字符串优化的压缩算法
- 需要在内存中存储文档标题、类别和片段,压缩帮助保持索引小巧
技术基础:FST 做快速关键词查找 + RAKE 提取关键词 + FSST 压缩字符串。
实现:docfind
- 创建了一个 CLI 工具 docfind,在构建网站时从文档生成索引文件
- 完全在浏览器端运行(WebAssembly)
- 无服务端往返
构建过程
- 用 Rust 编写
- 文档 → RAKE 提取关键词 → FST 索引 → FSST 压缩字符串
- 生成紧凑的索引文件,随网站一起发布
查询过程
- 用户输入查询 → 在浏览器中用 FST 匹配关键词 → 返回相关文档列表
- 即时响应,无需服务端请求
技术要点
为什么 FST 适合
- 存储排序字符串键的状态机
- 内存高效(共享前缀)
- 快速查找(包括模糊和正则)
- Rust 库 fst 直接可用
为什么 RAKE 适合
- 无监督关键词提取
- 自动从文档提取可索引的关键词/短语
- 无需人工标注
为什么 FSST 适合
- 短字符串压缩优化
- 文档标题、类别、片段等短文本压缩效率高
- 让索引文件保持在可接受的体积
实践启示
客户端搜索的适用场景
- 静态文档站点的搜索
- 需要即时响应、无服务端依赖的场景
- 索引体积可控时(docs 规模)
技术选型思路
- 从问题出发评估备选(搜索即服务、开源服务端、JS 客户端、WASM 客户端各有取舍)
- 关键约束:纯客户端 + 紧凑索引 + 快速查询
- 成熟的算法组件(FST/RAKE/FSST)组合可以解决看似需要专业搜索引擎的问题
实现注意
- 索引文件体积是核心指标(对比 Lunr.js 的 10MB)
- 压缩(FSST)+ 紧凑结构(FST)是控制体积的关键
- WebAssembly 让 Rust 高性能代码在浏览器运行
总结
docfind 是 VS Code 官网文档搜索的客户端搜索引擎,完全用 Rust 和 WebAssembly 在浏览器运行。背景是备选方案都不满足"快速、纯客户端、紧凑、易托管"的组合:Algolia/TypeSense 要服务端,Lunr.js 索引 10MB 太大,Stork 未维护。三块技术拼图:FST(burntsushi 的 fst 库)做紧凑的字符串键索引和快速查找、RAKE 自动提取文档关键词、FSST 压缩短字符串控制索引体积。实现为一个构建期 CLI(文档 → 索引文件),查询完全在浏览器端完成,无服务端往返。启示:客户端搜索在静态文档站点场景可行,核心指标是索引体积和查询速度;成熟的算法组件组合可以替代重量级搜索服务;FST 这类"十年老技术"在现代 WebAssembly 加持下依然有效。对需要即时、零运维搜索体验的静态站点,docfind 的架构是一个可复制的参考。
来源:https://code.visualstudio.com/blogs/2026/01/15/docfind