站内搜索
为静态站点添加搜索功能的开源与商业方案。
简介
静态网站也能有动态搜索功能吗?可以。对于静态网站,Hugo 提供了 Google 或其他搜索引擎嵌入式脚本之外的另一种选择:Hugo 允许你直接为内容文件建立索引,从而给访客提供自定义的搜索功能。
常见做法有两种。一种是在构建阶段生成索引文件——Hugo 可以输出 JSON 或 HTML 形式的索引,再由浏览器端的脚本读取并匹配,整个过程不需要服务器。另一种是接入第三方的搜索服务,把内容推送到对方的索引中,通过 API 或嵌入的脚本返回结果,适合内容量大或需要多语言分词的站点。
开源方案
- Pagefind
- 一个完全静态的搜索库,目标是在大型站点上也有良好表现,同时尽可能少占用用户的带宽。
- GitHub Gist for Hugo Workflow
- 这个 gist 包含一套简单的工作流,用于为静态网站创建搜索索引。它用一个简单的 Grunt 脚本为所有内容文件建立索引,并用 lunr.js 提供搜索结果。
- hugo-lunr
- 用 lunr.js 为静态 Hugo 站点添加站内搜索的简单方式。hugo-lunr 会为 Hugo 项目中的 HTML 与 Markdown 文档创建索引文件。
- hugo-lunr-zh
- 与 Hugo-lunr 有些相似,但 Hugo-lunr-zh 能帮你切分中文关键词。
- GitHub Gist for Fuse.js integration
- 这个 gist 演示了如何利用 Hugo 现有的构建期处理,生成可供客户端 Fuse.js 使用的可搜索 JSON 索引。虽然这个 gist 用 Fuse.js 做模糊匹配,但任何能读取 JSON 索引的客户端搜索工具都可以。除了 Hugo 之外,不需要 npm、grunt 或其他构建期工具。
- hugo-search-index
- 一个包含 Gulp 任务与预构建浏览器脚本的库,用于实现搜索。Gulp 会根据项目中的 Markdown 文件生成搜索索引。
- hugofastsearch
- 对「GitHub Gist for Fuse.js integration」的可用性与速度改进——全局的、为键盘操作优化的搜索。
- JS & Fuse.js tutorial
- 一个简单的客户端搜索方案,使用 FuseJS(不需要 jQuery)。
- hugo-zbsearch
- 一个 Hugo 模块,提供由 ZBSearch 驱动的客户端全文搜索。支持 27 种语言的分词、拼写容错、字段权重提升,并可用于任何主题。以 Hugo 模块的形式分发,除
hugo mod get外无需任何配置。 - INFINI Pizza for WebAssembly
- Pizza 是一个用 Rust 编写的超轻量却功能完整的搜索引擎。只需三行代码,你就可以在五分钟内为 Hugo 网站快速加上离线搜索功能。关于与 Hugo 集成的分步指南,请查看这篇博客教程。
- searchmysite.net
- 一个无广告、注重隐私的 Google Programmable Search 替代品,聚焦于个人网站:把你的站点加入 searchmysite.net(如果还没有的话),然后用一行代码给你的 Hugo 站点加上站内搜索框。免费档会在你的站点上显示搜索框,结果页在 searchmysite.net 上;付费档会把结果嵌入你的站点(并允许你按需重建索引等)。全部开源,也支持自行托管。参见 Website Search Tool 以及一篇带 Hugo 示例的博客文章。
商业方案
- Algolia DocSearch
- Algolia DocSearch 对公开的技术文档站点免费,且易于设置。其他场景可以使用 Algolia 的搜索 API,在应用与网站中轻松提供出色的搜索体验。Algolia Search 提供托管的全文本、数值、分面与地理位置搜索。
- Bonsai
- Bonsai 是全托管的 Elasticsearch 服务,速度快、可靠,设置简单。按照官方文档中的这篇指南,可以轻松地把 Hugo 中的文档导入 Elasticsearch。
- ExpertRec
- ExpertRec 是托管的搜索即服务方案,快速且可扩展。设置与集成极其简单,几分钟即可完成。搜索设置可以通过仪表盘调整,无需编写代码。