用 Hister 自建本地搜索引擎:把一半的 Google 搜索留在自己的浏览器历史里
2026/9/19 22:11:22 网站建设 项目流程

用 Hister 自建本地搜索引擎:把一半的 Google 搜索留在自己的浏览器历史里

【免费下载链接】histerYour own search engine项目地址: https://gitcode.com/GitHub_Trending/hi/hister

这是一篇基于 Hister 项目的一手实践记录与实现解析:作者用 6 周时间自建了一个"本地化网页历史搜索引擎",将自己日常约一半的 Google 搜索转化为对自己已浏览内容的回忆型检索(recall search)。读完本文,你将理解"发现型搜索"与"回忆型搜索"的本质区别,掌握 Hister 的本地全文检索、字段化查询语言、skip/priority/versioning 规则、别名机制等核心能力,并了解如何以近乎零成本的方式开始使用这套方案。


问题:在线搜索已经不是过去的样子

作者(一位开发者与知识工作者)发现,自己每天都会无数次打开 Google 搜索,这个动作已经成为几乎无意识的条件反射——它不断把注意力从实际工作上拉开。然而,这种体验在不知不觉中已经变差了很多,主要体现在四个方面:

  • 广告过多:曾经干净的链接列表,如今要翻过多条赞助结果、购物推荐和推广内容才能到达自然结果。真正需要的信息往往要等用户在心里过滤完所有商业噪音之后,才出现在页面中段。
  • SEO 操纵:自然结果本身也被 SEO 技巧操纵,排名反映的更多是"对搜索引擎的优化程度"而不是"对用户的价值"。面向机器优化、而非面向人类写作的网站霸占前排,真正有用的小站和个人博客被挤到第二、第三页,信噪比严重下降。
  • AI 摘要:Google 在许多结果顶部新增了 AI 生成的摘要。它偶尔有用,但常常丢失关键细节、给出过度简化甚至错误的信息,在用户和原始材料之间又加了一层。对精度要求很高的技术检索场景,这些 AI 答案可能产生误导。
  • 隐私缺失:每一次查询都被记录,形成关于兴趣、工作模式和信息需求的详细画像,用于广告定向和更多未知用途。搜索的便利以交出工作与生活的私密细节为代价。

洞察:我经常在搜索"自己已经看过的页面"

促使作者动手解决问题的真正契机是这样一个观察:自己经常在搜索已经访问过的页面——上周读过却忘了收藏的文档页、昨天评论过却记不清项目名的 GitHub issue、包含基础设施关键信息的内网 wiki。也就是说,作者一直在把 Google 当作个人记忆的外包服务,而且每次调用都要付出隐私代价;更糟的是,对于需要登录的内容(内部工具、私有文档、私有仓库),Google 根本无法索引,自然也就帮不上忙。

两种搜索:发现型与回忆型

把"如何替代 Google"这个问题想透之后,作者得出了一个关于搜索本质的关键结论:尽管我们在同一个搜索框里输入同样的查询,实际做的事情其实分为两种截然不同的类型:

  • 发现型搜索(Discovery Search):寻找从未遇到过的信息。这是真正的探索,进入未知领域,发现新资源,学习不熟悉的主题。这类搜索确实需要 Google 那样的全互联网索引,需要广撒网。
  • 回忆型搜索(Recall Search):找回已经遇到过的信息。不是在发现新东西,而是在回忆"在哪里见过它"。典型场景包括:"上个月修的那个认证 bug……"(记得解决过问题但想不起确切解法)、"Bleve 文档里讲 result highlighter 的那一页……"(确定读过文档但记不清 URL 或章节标题)、"那篇讲 async/await 的 Stack Overflow 回答……"(记得有段解释特别清楚但没存链接)。

作者的关键判断是:日常搜索中很大一部分(很可能超过一半)是回忆型搜索,而不是发现型搜索。但 Google 的界面把两类搜索等同对待,没有任何针对"找回你自己的内容"的优化;对于登录墙或私有网络内的页面,Google 根本无能为力。

由此得出的解决方案呼之欲出:为什么不做一个专门为回忆型搜索优化的工具——本地索引自己的全部浏览历史,只在真正需要发现新信息时才回退到 Google?

潜在收益非常可观:

  • 结果更快
  • 隐私更好
  • 能检索需要登录的内容
  • 结果针对个人兴趣与工作量身定制

解决方案:在本地索引一切

一旦把问题说清楚,答案就显而易见了:能否在本地、私密地检索完整浏览历史——包括全文内容,而不仅仅是 URL 和标题?这将得到一个专门为回忆型搜索优化的个人搜索引擎,同时在需要时仍可回退到 Google 做发现型搜索。

作者先寻找过现成方案,但没有一个能满足全部需求:

  • 浏览器历史只保存 URL 和页面标题,几乎无法按内容找页面;
  • Evernote、Notion 等笔记应用有网页剪辑功能,但每保存一页都需要手动操作;
  • Omnom 等个人知识管理工具聚焦于精选笔记,需要不断做"该保存什么"的有意识决策,而非覆盖完整浏览历史。

作者需要的,是"浏览器历史的全面自动捕获 + 搜索引擎的全文检索能力 + 本地软件的即时响应 + 自托管方案的隐私性"的组合体。既然没有现成工具能满足全部条件,作者决定自己构建——于是有了 Hister。

需求清单

作者的理想方案需要满足以下 11 项要求,这也是理解 Hister 设计意图的最佳索引:

  1. 快速查找(Fast lookup):如果本地检索比 Google 还慢,就永远不会用它。需要亚秒级响应和键盘快捷键,让本地搜索比切换到 Google 更快。
  2. 自动索引(Automatic indexing):不想手动保存页面、不想做任何有意识决策;浏览时自动捕获,工具应隐身在后台默默工作。
  3. 认证感知索引(Authentication aware indexing):日常引用的大量内容在登录墙后面——内网 wiki、私有文档、认证 API 文档、内部仪表盘。任何无法处理认证内容的方案都会漏掉实际浏览的一大部分。
  4. 全文搜索(Full-text search):检索页面正文而不是仅检索 URL 和标题。浏览器历史在"记得读过关于 microservice authentication patterns 的东西但想不起是哪个博客或文档站"的场景下毫无用处。
  5. 强大的查询能力(Powerful query capabilities):布尔运算符(AND/OR/NOT)、字段限定检索(只搜 URL 或只搜标题)、通配符匹配,以快速缩小结果范围。
  6. 零认知负担(Zero cognitive overhead):无缝融入现有工作流,自然贴合已经习惯的浏览与搜索方式。
  7. 透明回退到在线搜索引擎(Transparent fallback):本地没搜到想要的内容时,应能用同一个查询立即跳到 Google,让迁移是渐进式的而不是工作流的彻底变更。
  8. 可微调(Fine-tuning capabilities):黑名单屏蔽永远不想再看到的无关站点、给重要来源加权、为常见搜索创建关键字别名。
  9. 已存内容的离线预览(Offline preview):即使原站点下线或页面被删除,也能阅读已索引的页面;偶尔能从链接失效(link rot)中救回内容。
  10. 导入既有历史(Import existing history):希望从"已有数年浏览数据已索引"开始,而不是花几个月从零积累索引。
  11. 自由软件(Free software):自托管、无持续成本、无供应商锁定。浏览历史是自己的个人数据,不应归公司所有。

Hister:把浏览历史变成个人搜索引擎

Hister 是一个自托管(self-hosted)的网页历史管理工具,核心理念是把你的浏览历史当作一个个人搜索引擎来对待。它在架构上分为 server 端(索引、搜索、API)与 client 端(TUI 终端客户端、浏览器扩展、Web 界面、Qutebrowser companion 等),下文结合仓库源码逐项验证上面的需求是如何落地的。

亚秒级本地全文检索:Bleve 驱动的索引与查询

Hister 的索引层基于 Bleve),查询的解析与构建位于 server/indexer/querybuilder 目录。builder.go中的Build函数把用户输入的字符串词法解析为 Bleve 查询对象:

  • 多个关键词按AND 语义生成组合查询(builder.go),同时叠加一条整串的短语匹配查询来获得精确命中;
  • 单个非字段限定词会自动追加一个高加权的url正则查询(boost 100),优先命中对应网站首页,方便"记住域名、忘了路径"的场景(builder.go)。

字段定义统一维护在 server/indexer/searchschema/schema.go 中,包括domaintitleurlurl_retexttypelanguagelabelvisitsupdatedaddeduser_id等字段,并声明了各字段的索引权重(如 title 12、domain 8、url 4、text 1)与默认搜索范围。客户端的搜索调用见 client/search.go,它将indexer.Query序列化后请求/search接口——这正是"快速查找"要求中 TUI/浏览器扩展共用的一条路径。

查询语言:字段、短语、通配符与布尔逻辑

需求 5(强大的查询能力)在 Hister 中体现为一套完整的查询语言,完整指南见 查询语言文档。常用能力包括:

  • 基本搜索:直接输入词,默认在标题、正文、URL、域名等所有默认字段中检索;
  • 短语"privacy policy"匹配精确短语;
  • 字段限定title:encryptiondomain:github.comurl:*/security/*language:envisits:10..(访问次数范围)、updated:>90d(相对时间)、updated:>=2026-04-01(绝对日期)、metadata.source:linkding(元数据精确匹配)、user_id:3(多用户场景)等;
  • 通配符secur**privacy*,字段内通配如domain:*.github.io
  • URL 正则url_re:^https?://([^/]+\.)?example\.com/private/,与索引规则共用 Goregexp.MatchString语义(见 builder.go);
  • 否定privacy -facebooktitle:hister -url:*/issues/*
  • 或逻辑(Alternation)(security|privacy|encryption)domain:(github.com|gitlab.com) title:security
  • 排序sort:datesort:-datesort:visitssort:domain,排序选项定义在 schema.go。

词法层面,parser.go 实现了带递归括号与引号处理的 tokenizer,支持(|)或表达式、"..."短语、-否定前缀、\转义,以及url_re:等字段中反斜杠的保留。

自动索引:浏览器扩展 + 抓取管道

需求 2(自动索引)由浏览器扩展承担。扩展源码位于 webui/ext,它只在浏览器本身已加载的页面中收集数据,不会向正在访问的站点发起任何网络请求(仅获取页面 favicon),因此对目标网站完全透明。配合 server 端抓取与持久化管道(server/crawler 目录下的 crawler、persistent、robots、proxy、bidi、chromedp、http 等组件),新访问的页面会被自动索引为可检索文档。

需求 3(认证感知索引)是架构上的一大优势:索引发生在用户已登录的浏览器会话里,因此登录墙后的内网 wiki、私有文档、认证 API 文档都能被索引——这是任何公开搜索引擎都无法做到的。

规则与别名:skip / priority / versioning

需求 8(可微调)落地为 规则文档 中描述的四类规则,单用户模式下保存在数据目录的rules.json,多用户模式下按用户存储在数据库中:

  • Skip 规则:URL 命中即静默丢弃、不入索引。典型用途:广告网络、登录页、cookie 同意墙。例如^https://ads\.example\.com^https?://(login|mail)\.example\.com/.*\?utm_source=。也可在 Web 界面对既有文档批量执行"删除匹配文档"。
  • Priority 规则:命中 URL 的文档无论相关度得分如何都会被大幅加权、推到结果顶部,适合常驻显示个人 wiki、公司内部文档。例如^https://wiki\.example\.com/
  • Versioning 规则:命中 URL 的文档在每次重新索引时与上一版本做 diff,以 diff match patch 形式把 HTML 与文本变更存入数据库,可查看变更历史并重建存档版本。适合监控隐私政策、文档、新闻页的改动(对应需求 9 的离线预览与版本重建,API 结构见 server/types/preview.go)。
  • 别名(Aliases):查询时把关键字展开为完整查询,例如"gh": "domain:github.com""work": "domain:(internal.example.com|jira.example.com)",之后输入work deployment等价于完整的域限定查询。

规则模式的匹配要点(源自 规则文档):匹配目标是完整 URL(含 scheme、host、path、query);使用 Go 正则语法,不支持 look-ahead/look-behind;锚定必须包含 scheme(^https://foo.com合法,^foo.com不合法);匹配前剥离 URL hash,仅剔除utm_*查询参数;带查询串的 URL 无法被尾部$锚定命中。客户端的规则管理 API 见 client/rules.go(/api/rules/api/add_alias/api/delete_alias)。

导入既有历史与本地文件

需求 10(导入既有历史)由 cmd 下的导入命令实现:hister import支持导入浏览器历史、Linkwarden 书签等(相关实现见 cmd/import_*.go、cmd/linkwarden.go),并支持目录监听(files/watcher.go)把本地文件也纳入索引。这意味着你不需要从零开始——先导入多年数据,索引立刻就有可用性。

无缝工作流:TUI、Web 界面与回退

需求 6(零认知负担)与需求 7(透明回退)体现在多个入口上:

  • TUI 终端客户端(cmd/tui):提供键盘驱动的搜索界面,无需离开终端即可检索本地索引;
  • Web 界面(webui/app):搜索页内置把当前查询转发给 DuckDuckGo / Google 等外部搜索引擎的按钮——本地没命中,一键用同一查询去线上搜,迁移成本趋近于零;
  • 浏览器地址栏搜索:把 Hister 实例注册为浏览器自定义搜索引擎后,可在地址栏直接搜本地索引。

运行方式见 快速入门:启动./hister listen(Windows 为.\hister.exe listen),服务默认监听http://127.0.0.1:4433,仅本机可访问,适合单机个人使用;之后安装 Chrome / Firefox 扩展(Firefox 还支持移动端)并确认扩展默认指向该地址即可。

结果:6 周内 Google 依赖下降约 50%

使用 Hister 六周后,作者复盘了自己的搜索行为:

  • 约 50% 的 Google 搜索改为由本地索引直接回答
  • 找到了 Google 找不到的内容:认证页面、已删除的内容;
  • 零隐私顾虑:无追踪、无画像;
  • 针对个人需求的更好结果——因为这是"我的历史"。

而且索引用得越多越好:本地索引在常见查询上比 Google 更相关,响应速度与打开新标签页相当,覆盖了所有需要登录的服务,变成了一部"读过的一切"的个人知识库。

意外收益

  • 再发现(Rediscovery):找回了早已遗忘的有价值内容——两年前收藏却再没打开过的文章,现在会在相关检索中出现;
  • 学习模式(Learning patterns):观察自己的搜索记录能暴露知识盲区与兴趣走向;
  • 离线访问(Offline access):文档站宕机或页面被删时,内容依然在手(配合 versioning 规则,连页面历史版本都能追溯)。

使用前 vs 使用后

使用 Google 时:打开 Google → 搜 "bleve query" → 点第一个结果(多半是错的)→ 点第二个(眼熟……)→ 意识到以前来过 → 终于找到想要的页面。耗时约 1~2 分钟、5~10 次点击。

使用 Hister 时:打开 Hister → 输入 "bleve query" 回车 → 第一个结果就是上个月访问过的那一页。耗时约 5 秒、几次击键。

结论:找回你的搜索

作者强调:我们习惯性地把"搜索"等同于"去 Google",以至于忘了还有别的选择。但日常搜索的很大一部分并不需要整个互联网,需要的是**"我们的互联网"**:读过的页面、打开过的文档、每天在用的内部工具。

Hister 的目标不是替代 Google 的发现能力,而是替代 Google 的回忆能力——而在这个领域,它天然优于 Google:它知道 Google 永远看不到的认证页面;它搜索的是"你的历史"而非整个网络;它即时、私密、无广告;并且越用越好。1.5 个月后 Google 依赖已减半,随着索引增长这个数字还在继续上升。

如果你也经常重复搜索自己已经找到过的信息,可以这样开始:

  1. 按 安装文档 安装 Hister 二进制;
  2. 运行./hister listen启动本地服务;
  3. 安装浏览器扩展,之后新访问的页面会自动进入索引;
  4. 通过 导入文档 一次性导入既有历史;
  5. 在 Web 界面或 TUI 中配置 skip / priority 规则与别名(见 规则文档),并熟悉 查询语言;
  6. 需要更定制化配置(存储、认证、语义搜索、本地目录索引)时,参考 配置文档。

作者也在持续推进 Hister 的未来路线:易用性改进、基于索引与已打开结果的自动索引能力、以隐私安全的方式连接分布式搜索引擎、搜索结果导出、高级分析与搜索洞察。项目以 AGPLv3 开源,接受社区贡献,欢迎通过提交 issue、pull request(尤其是 good first issues)、改进文档等方式参与。

最后更新:2026 年 2 月

【免费下载链接】histerYour own search engine项目地址: https://gitcode.com/GitHub_Trending/hi/hister

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询