今天在 GitHub Trending 上看到一个有意思的项目:Hister,它把「搜索引擎」这件事重新交回你自己手里——对浏览过的网页和本地文件做全文索引,随时随地找回看过的任何内容,而这一切默认不上传任何云端。
一、项目概述
Hister 是一套自托管的私有搜索引擎,定位是「你访问过的页面 + 你保存的文件」的专属索引库。它解决的痛点非常具体:我们每天在浏览器里看过大量文章、文档、教程,但几天后想重新找到某句话、某个配置片段时,只能模糊地回忆「好像在某个标签页里看过」,传统的浏览器历史搜索又极其孱弱。
核心特性可以归纳为几点:
- 隐私优先:默认没有任何遥测、不绑定任何强制云服务,可以完全跑在自己本机或自己掌控的服务器上。
- 全文索引:索引的是页面和文件的真实内容,而不是只有标题和 URL。
- 多端检索:提供网页界面、终端 TUI、命令行,以及面向 AI 助手的 MCP 客户端。
- 浏览器自动采集:通过 Firefox / Chrome 扩展,自动把新访问的页面存进 Hister。
- 强大查询语法:支持字段过滤、短语、通配符、否定、别名、结果优先级等。
- 可选的语义搜索:接入你配置的 embeddings 端点,按「意思」而非关键词找文档。
- 多用户与导入:支持浏览器历史导入与网站爬取,共享服务器上每个用户的数据彼此隔离。
项目采用 AGPLv3 许可证,由 asciimoo(SearXNG 等知名开源项目的作者)主导开发。
二、技术原理
架构概览
从仓库的 go.mod 与 Dockerfile 可以拼出 Hister 的整体技术骨架:
- 后端:Go 语言(go 1.26+,构建时开启
CGO_ENABLED=1以链接 SQLite 等 C 依赖),使用 Cobra/Viper 做 CLI 与配置,Zerolog 做日志。 - 全文检索引擎:依赖
blevesearch/bleve/v2,这是 Go 生态里成熟的嵌入式全文索引库,Hister 把网页正文和文件内容灌进去建立倒排索引。 - 终端 UI:基于 Charm 家族的
bubbletea/charm.land的 bubbles、lipgloss 构建 TUI,配合colorprofile做色彩适配。 - 网页正文抽取:
go-readability提取正文、goquery解析 DOM、bluemonday做 HTML 清理,保证索引的是干净内容而非导航噪声。 - 无头浏览器爬取:
chromedp用于抓取和渲染页面,配合temoto/robotstxt遵守爬虫协议。 - 文件解析:
asciimoo/pdf、mmonterroca/docxgo解析 PDF / Word,niklasfasching/go-org、gomarkdown/markdown处理 Org / Markdown 等格式。 - 存储:
gorm搭配mattn/go-sqlite3(本地)与pgx/gorm.io/driver/postgres(多用户/服务端)两套驱动。 - 前端:Svelte 多 workspace(app / website / components / ext),Vite 构建,嵌入 Go 二进制(
server/static/app/)。
数据流
一次典型的索引流程大致是:浏览器扩展或爬虫捕获页面 → chromedp/go-readability 抽取正文 → 语言检测(lingua-go)与分词 → bleve 建立全文索引 → 存入 SQLite/Postgres 元数据。检索时则走 bleve 的倒排索引做关键词匹配,若开启语义搜索则额外调用 embeddings 端点做向量召回并融合排序。
构建与部署
Dockerfile 采用多阶段构建,最终镜像基于 alpine:3.24,非 root 用户运行,监听 0.0.0.0:4433,并内置 /health 健康检查与 yt-dlp 二进制(用于媒体相关抓取)。本地最简启动只需一个二进制:
./hister listen
三、安装与快速开始
环境要求
- 本地运行:下载对应平台的二进制即可,零配置。
- 从源码构建:需要 Go 1.26+、
npm、以及支持 CGO 的 C 编译器。
安装步骤
从 latest release 下载对应平台二进制,重命名为
hister(Windows 为hister.exe)。Linux / macOS 赋予可执行权限:
chmod +x hister启动服务:
# Linux / macOS ./hister listen # Windows(PowerShell) .\hister.exe listen打开 http://127.0.0.1:4433,并安装 Firefox 或 Chrome 浏览器扩展,新访问的页面会自动进入索引。
从源码构建
git clone https://github.com/asciimoo/hister.git
cd hister
./manage.sh build
Web 端热重载开发:
npm run serve:app
四、使用方法与实战
基础用法
启动后,最直接的方式是打开网页界面搜索。Hister 的查询语法相当灵活,支持:
- 字段过滤:限定在标题、URL、标签等字段搜索;
- 短语与通配符:用引号包裹短语,用
*做模糊匹配; - 否定:用
-排除某些词; - 别名与优先级:为常用检索配置别名、为重要来源加权。
终端与 MCP
除了网页,Hister 还提供命令行与 TUI。更值得关注的是 MCP 客户端——这意味着你可以把它接入 AI 助手,让模型在回答时「查阅你自己的浏览与文件历史」,相当于给你的私人知识库装上检索接口。
语义搜索(进阶)
若希望按「意思」而非关键词召回,可在配置里接入一个 embeddings 端点。需要注意:开启后文档文本会被发送到你选择的 embeddings 服务,因此远端集成前务必审视隐私影响。
# 配置文件(config.yml)中的语义搜索示例结构
semantic_search:
enabled: true
embeddings_endpoint: "http://your-embeddings-endpoint"
导入已有历史
完整 quickstart 支持导入既有浏览器历史,并让你选择 Hister 索引哪些内容——这对「想从第一天起就有完整检索能力」的用户非常关键。
五、常见问题与解决方案
浏览器扩展装好了但不索引? 检查扩展是否指向你运行的 Hister 服务地址(默认
http://127.0.0.1:4433),以及服务是否正在listen。从源码构建报 CGO / 编译器相关错误? Hister 依赖 CGO(SQLite 等),请确保系统已安装 C 编译器(如 gcc)且
CGO_ENABLED=1,Go 版本不低于 1.26。语义搜索开启后担心隐私? 语义搜索会把文本发往你配置的 embeddings 端点。若使用远端服务,请只索引可公开的内容,或自建本地 embeddings 服务。
Docker 容器启动后无法访问? 默认监听容器内
0.0.0.0:4433,宿主机映射端口需自行暴露;可用/health端点做健康检查排查。多用户数据是否隔离? 支持多用户,每个用户的文档与检索结果在服务端彼此分离,适合在共享服务器上部署。
六、总结
Hister 把「个人搜索」这件本该属于用户自己的事,用一套自托管、隐私优先、全文索引的方案重新实现:本地零配置即可跑,浏览器扩展自动采集,网页/终端/MCP 多端检索,还能按需开启语义搜索。对长期被「看过但找不回」困扰、又不想把浏览历史交给大厂的人来说,它是一个值得长期自托管的好选择。
项目地址:github.com/asciimoo/hister · 演示:demo.hister.org