今天在 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 编译器。

安装步骤

  1. 从 latest release 下载对应平台二进制,重命名为 hister(Windows 为 hister.exe)。

  2. Linux / macOS 赋予可执行权限:

    chmod +x hister
    
  3. 启动服务:

    # Linux / macOS
    ./hister listen
    
    # Windows(PowerShell)
    .\hister.exe listen
    
  4. 打开 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