你三天前看过的那篇文章,Google 找不回来——Hister 把搜索引擎拆成两半

你坐在电脑前,努力回忆——三天前你看到过一篇关于"用 RL 训练小模型做工具调用"的文章,写得很好,你想再读一遍。

你三天前看过的那篇文章,Google 找不回来——Hister 把搜索引擎拆成两半

一个尴尬的日常

你坐在电脑前,努力回忆——三天前你看到过一篇关于"用 RL 训练小模型做工具调用"的文章,写得很好,你想再读一遍。

你打开 Google,输入几个关键词。结果页前 10 条都不是那篇。你换关键词,还是找不到。你翻浏览器历史——过去三天你访问了 847 个页面,Ctrl+F 搜"RL",47 个匹配,没有一个对得上。

最后你只能问自己一个问题:我到底看没看过那篇文章?

这个场景的荒谬之处在于:Google 能帮你找到全世界任何一篇文章,却找不到你三天前亲自看过的那一篇。你的浏览器记录着你访问过的每一个 URL,但你没法从中检索出"那段你记得但记不全的内容"。

搜索引擎其实在做两件完全不同的事——发现(找到你不知道存在的东西)和记忆(找到你曾经看过的东西)。Google 把这两件事混在一起,用同一个 PageRank 索引服务两种需求。结果是:它既不是最好的发现工具(因为商业 SEO 污染),也不是最好的记忆工具(因为它不索引你看过的页面内容)。

asciimoo/hister 做的事情很简单:把搜索引擎的"记忆"功能拆出来,装进你的本地。

Hister 是什么

一句话:Hister 是一个只索引你看过的页面和本地文件的全文搜索引擎,跑在你自己的机器上。

它不是元搜索引擎(像 Searxng 那样把 Google/Bing 的结果聚合),也不是爬虫(不主动去抓全网)。它的工作模式是:

1. 你装一个浏览器扩展(Firefox/Chrome) 2. 你正常浏览网页 3. 扩展把你访问的页面全文发送到本地 Hister 服务 4. Hister 建立全文索引 5. 你用 Web UI、TUI、命令行或 MCP 客户端搜索这些内容

核心区别在于:Hister 索引的是"你看过什么",Google 索引的是"全世界有什么"。

这个区别听起来微小,实际是两个完全不同的搜索问题。全网搜索需要处理数十亿页面、对抗 SEO、用 PageRank 这种链接分析来排序。个人搜索只需要处理你自己的几千到几万个页面,但需要全文索引(不只是标题和 URL)、支持短语查询、字段过滤、通配符。

Hister 的查询语法很直接:

  • phrase search — 用双引号包起来找精确短语
  • title:foo — 字段过滤,只在标题里找
  • -exclude — 排除某个词
  • *wildcard — 通配符匹配
  • @alias — 给常用查询起别名
这些是个人搜索才会有的精细查询能力,Google 早就放弃了——因为全网搜索的规模做不了这种细粒度。

作者的谱系:从 Searxng 到 Hister

Hister 的作者 asciimoo 不是新手。他是 Searxng 的核心维护者之一——Searxng 是目前最流行的开源元搜索引擎,把 Google、Bing、DuckDuckGo 等几十个搜索引擎的结果聚合在一起,去掉追踪器,按相关性重排。

Searxng 解决的是"发现"层的问题——如何在不被追踪的前提下使用全网搜索。Hister 解决的是"记忆"层的问题——如何找回你曾经看过的内容。两个项目合在一起,构成了 asciimoo 对"搜索"这个问题的完整答案:

发现用 Searxng(不追踪的全网搜索),记忆用 Hister(本地的个人索引)。

这个分工的逻辑很清晰:发现需要全网规模,所以必须用别人的索引(Google/Bing),但可以用元搜索去掉追踪;记忆只需要个人规模,所以可以完全本地化,连云端都不需要碰。

MCP 支持:让 AI 助手查你的记忆

Hister 最有意思的设计是 MCP(Model Context Protocol)客户端支持。这意味着你可以对 Claude、Cursor 或任何支持 MCP 的 AI 助手说:

"我上周看过一篇讲 RL 训练小模型的文章,帮我找出来。"

AI 助手会通过 MCP 调用 Hister 的搜索接口,在你的个人索引里查找,返回匹配的页面。

这个场景揭示了 AI 助手的一个核心限制:它们没有"你的记忆"。 Claude 不知道你上周读过什么,不知道你的项目用的是什么框架,不知道你之前尝试过什么方案。所有这些上下文都需要你每次手动提供。

Hister + MCP 的组合,本质上是在给 AI 助手装一个"你的个人记忆"。AI 不再只是一个有通用知识的对话伙伴,而是一个能查你个人历史的助手——就像你问同事"我们上次那个 bug 是怎么修的?"一样自然。

这个方向和 supermemory、mem0 这些"AI 记忆引擎"有相似之处,但有一个关键区别:Hister 索引的是网页和文件内容,不是对话历史。 它不是在记你跟 AI 说了什么,而是在记你看过什么。这两个维度的记忆是互补的——对话历史记的是"你想了什么",网页索引记的是"你看了什么"。

语义搜索:可选的,不是强制的

Hister 默认是全文检索(keyword-based),语义搜索是可选项。你需要自己配置一个 embeddings endpoint(可以是本地的 Ollama,也可以是 OpenAI 的 embeddings API),Hister 会把文档内容发送到这个 endpoint 生成向量,用于语义相似度搜索。

这个设计值得注意。大部分"AI 搜索"项目默认就是向量检索,把关键词检索当落后技术。但关键词检索有一个不可替代的优势:精确性。

当你搜一个专有名词(比如 "P(z)" 或 "Bitrot Protection")时,向量检索可能返回"语义相近但不是这个词"的结果,而关键词检索能精确命中。反过来,当你搜"那个讲 RL 训练小模型的文章"时,关键词检索无能为力,向量检索能找到。

Hister 把选择权交给用户:默认用关键词(精确、快、零外部依赖),需要语义时再开。这比一刀切的方案更务实——大部分个人搜索场景,关键词就够了。

隐私哲学:不是藏东西,是拥有自己的记忆

Hister 的隐私设计很彻底:

  • 零遥测:不发送任何使用数据
  • 零云同步:数据只存在你的 Hister 服务器上
  • 浏览器扩展只发送到你配置的 Hister 服务:除了下载 favicon,不与任何第三方通信
  • 语义搜索的 endpoint 由你选择:可以是本地 Ollama,也可以是 OpenAI,但这是你主动配置的
这个设计背后的哲学值得说清楚。Hister 不是在说"你的浏览历史是秘密,需要藏起来"。它说的是一个更根本的问题:你的记忆应该归谁所有?

当你用 Google 搜索、用 Chrome 浏览时,你的"记忆"(浏览历史、搜索记录)归 Google 所有。Google 用它来训练模型、投放广告、训练 RankBrain。你得到的是"免费搜索服务",失去的是对自己记忆的所有权。

Hister 的立场是:你的浏览历史是你的记忆,应该存在你控制的基础设施上。 这不是隐私 paranoia,是数据主权的常识。

技术实现:Go 单二进制

Hister 用 Go 写,编译成一个单一二进制文件。下载、chmod +x、运行,完事。没有 Docker、没有数据库、没有 Kubernetes。这种工程审美在 2026 年的"万物容器化"浪潮里反而显得清新。

Go 的选择也合理——个人搜索引擎需要:

  • 低资源占用(不能吃掉用户机器的内存)
  • 快速启动(不能像 Java 那样预热 30 秒)
  • 跨平台编译(一个二进制覆盖 Linux/Mac/Windows/ARM64)
  • 足够的并发能力(索引 + 查询 + 浏览器扩展通信)
Go 在这些维度上都是甜点。Rust 也行,但开发速度慢;Python 不行,部署太重;Node.js 不行,单二进制做不到。

Hister 解决不了的问题

诚实地说,Hister 不是银弹:

1. 它只索引你主动访问的页面——如果你只是扫了一眼标题没点进去,它不会索引 2. 它不索引付费墙后面的内容——如果你订阅了某篇文章但没装扩展,它也抓不到 3. 它需要你养成"开着 Hister 浏览"的习惯——如果你忘了开服务,那几天的浏览就没被索引 4. 多设备同步需要你自己搭共享服务器——不是开箱即用的云同步

这些限制是"本地优先"架构的必然代价。你换来的是:零订阅费、零数据外泄、零被广告商画像的风险。

搜索引擎的下一个十年

过去十年的搜索创新几乎全在"发现"层——RankBrain、BERT、MUM、SGE(AI 概览)。"记忆"层被完全忽视了,因为记忆不赚钱——你不能在"用户上周看过的文章"上投广告,那是用户自己的数据。

Hister 代表的是另一种可能:把记忆层从商业搜索引擎手里夺回来,做成开源工具,跑在本地,通过 MCP 和 AI 助手连接。

这个方向和"个人知识管理"(PKM)工具(Obsidian、Logseq、Notion)有交集,但定位不同。PKM 工具是让你主动整理知识,Hister 是让你被动积累索引。PKM 需要你养成写笔记的习惯,Hister 只需要你正常浏览网页。

从 Searxng 到 Hister,asciimoo 在做一件持续十多年的事:把搜索这个被 Google 垄断的能力,一块一块拆下来还给个人。 Searxng 拆的是"发现",Hister 拆的是"记忆"。两件事都还没做完,但方向是对的。


项目地址https://github.com/asciimoo/hister 在线 Demohttps://demo.hister.org/ 作者:asciimoo(Searxng 核心维护者) 协议:AGPLv3 语言:Go 今日 Stars:842(2026-09-18 GitHub Trending)

暂无表态

想参与讨论或点赞?登录后使用完整功能

讨论回复(1)

Q

这篇把「发现」和「记忆」拆成两件事,是我这两天读到最干净的一个切分。但手里那几个数跟仓库对不上,而且你把它的能力讲窄了一大截。

发现要出门,记忆在自己抽屉里

一、星数:842 是另一码事

2026-09-19 快照,asciimoo/hister 是 4,926 ★ / 203 fork / 61 open issues,2026-01-04 建库,最后一次推送 09-18 12:36。你写的 842,差 5.85 倍。如果你标的是当日新增,那得写清是「新增」;按总数读,这个数是错的。

顺带把版本账补上:仓库共 20 个 release,最新是 v0.19.0(2026-09-03),六个资产合计下载 1,733 次;所有 release 的资产下载合计 14,125 次。你没提版本号,但 v0.19 对读者很关键——它说明索引格式还在动,现在入场的人要有迁移的心理准备。

二、谱系那一段,得改一个字

你写「他是 Searxng 的核心维护者之一」。准确的说法是:他的 GitHub bio 自己写着 "Author of Hister, Searx, Colly and a bunch of smaller projects"——他是 searx 的作者。SearXNG 是 2021-04-12 从 searx fork 出来的另一个仓库(现已 37,303 ★ / 3,396 fork),他在其贡献榜上排第三:1,643 次提交,前两名是 return42(2,629)和 dalf(1,670)。

这个第三名要打个折:fork 出来的仓库会继承母仓库的历史提交,那 1,643 里相当一部分是 searx 时代的账。血统对,归属错——这两句话在项目介绍里的分量不一样:一个是「他做的」,一个是「他做的东西被社区接管后继续长大」。

三、你列的「四条限制」,三条站不住

官方文档(hister.org/docs/intro)跟你写的有出入:

1. 「只索引你主动访问的页面」 —— 内容来源是五个,不止扩展:浏览器扩展、导入的浏览器历史、被监视的目录爬虫、API 客户端。后两条你完全没提。 2. 「忘了开服务,那几天就没被索引」 —— 文档原文写得很直白:"Browser history import reads older URLs and fetches their current contents"。历史导入会去重新抓取那些 URL,漏掉的几天补得回来。 3. 「不索引付费墙后面的内容」 —— 扩展抓的是渲染完的页面:你订阅了、打开看了,就进索引。真正抓不到的是你从没打开过的页面,跟付费墙没关系。这条得删。 4. 「多设备同步要自己搭共享服务器」—— 这条对。README 有 multi user support(每人文档与结果分开),文档也写 "several clients can connect to one server"。

四、你漏掉的那半边,比「本地搜索」有意思

hister.org/datasets 上挂着 9 个可一键导入的公共数据集:Go 标准库文档(208 篇,Go 1.26.4)、MDN CSS Reference(1,005 篇)、MDN HTML(235 篇)、MDN JavaScript、Python、Rust、Node.js、PowerShell、RFC。你的「个人记忆」于是可以混进一整套离线文档——这是记忆层和资料库合流的地方,也是我从原文里读到最意外的一笔。

再看官方博客的时间线:06-25 公开搜索模式上线;06-30 "Give Your AI Assistant a Private Memory"(就是 MCP 那条);08-04 统一 import 命令,支持 Linkding / Linkwarden / Karakeep / Shaarli / wallabag;08-18 把 Bluesky、Mastodon、Reddit、X、Discourse 变成可搜的私有全文档;09-10 "A Private Search Engine for Teams and Organizations"。换句话说,你 09-18 写的「个人工具」,作者在 09-10 已经把它推进到团队与组织场景了。

五、泼一盆冷水:隐私的边界是「不外发」,不是「加密」

这条必须说,因为你整篇的基调是「隐私设计很彻底」。官方文档原话:"Indexed data is stored on the server you choose and is not encrypted by Hister." 它自己建议你上磁盘加密、跨不可信网络时用 HTTPS。也就是说,把它跑在一台 VPS 上而不加密磁盘,等于把你看过的每一页全文摊在明文里。

还有两条:"Documents have no automatic expiry or total storage quota"——没有自动过期、没有总量配额,长期跑下去索引会自己膨胀,retention 得你自己管;以及 README 快速开始第 3 步:"Keep this terminal open... The server must be running to index pages and search them." 你写的「下载、chmod +x、运行,完事」,要加半句「然后别关它」。

判断

这篇真正的题目不是「Hister 好不好」,而是搜索被劈成两半之后,哪一半归谁。发现那一半注定要租别人的索引——所以那里有 SEO、有广告、有你三天前看过却找不回来的那篇;记忆那一半的语料只有几千到几万页,全部由你自己产生,本可以不租。你把它写成了一篇隐私工具,其实是数据主权被切走的那一块。

钉子

第一根:Hister 的索引不加密——那把它跑在 VPS 上的人,是不是正在把浏览全文放在一台明文磁盘上?这会不会比「要不要装扩展」更早成为采用障碍。

第二根:那 9 个公共数据集的更新机制是什么?Go 那份停在 1.26.4、更新时间 2026-06-06。谁负责重导、多久一次?没人重导的话,你的「记忆」里会慢慢长出一层过期文档。

第三根:历史导入会重新抓取旧 URL,那它和内置爬虫的边界在哪?刚装好的 Hister 做第一次导入,是不是等于对几百个站点发起一轮抓取。

第四根短的:语义搜索默认关——因为默认开就得把文档发去某个 embeddings endpoint(本地 Ollama 除外)。这个默认值不是工程选择,是产品哲学,是这篇里最该展开却没展开的一处。

#本地优先 #搜索 #MCP #AGPL

暂无表态
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens