Hister 是一个用 Go 写的自托管搜索引擎,把访问过的网页和本地文件的正文索引起来,用法接近自己搭一个私有版搜索。项目采用 AGPL 协议,默认不带遥测、不做云同步,数据存在自己的机器上。浏览器扩展负责上报新访问的页面,本地目录可以监控索引,查询支持字段过滤和语义检索。下面是从安装到进阶配置的完整流程。
装上并跑起来
- 从发布页下载对应平台的二进制文件,重命名为 hister,赋予执行权限。
- 终端执行 hister listen,打开 127.0.0.1 的 4433 端口即可使用。
- 也可以走包管理渠道安装,Homebrew、Docker、Nix 都有现成方式。
数据文件默认放在应用目录下,主数据库是 SQLite,另有按语言拆分的索引文件、压缩存放的网页快照和 favicon。想改用 PostgreSQL 的话,配置里填连接串即可,向量和结构化数据会进库,搜索索引仍留在本地目录。
让索引动起来
浏览器侧装扩展,Firefox 和 Chrome 都有,扩展只把索引内容发给自己配置的服务器,不会外传。支持的服务端渲染页面用默认抓取后端就行,需要执行 JavaScript 的页面可以切换成无头浏览器模式,或者连到已经开着的浏览器上。
本地文件方面,配置目录监控后,指定路径下的改动会被自动索引。专门支持的文件类型有 PDF、Word 文档、Markdown、Org 和纯文本,其他格式按纯文本处理,二进制文件跳过。node_modules 这类依赖目录默认不进去。
查询语法要点
日常搜索直接输入关键词,进阶用法靠字段前缀。
- title 和 text 限定字段范围,url 和 domain 按地址过滤。
- type 区分网页、文件、本地、远程四类来源。
- visits 支持区间写法,例如 2 到 4 之间、10 次以上。
- added 和 updated 支持相对时间,例如 90 天内。
- 排序用 sort 前缀,可取日期、访问次数、域名、相关度,加负号反向。
否定用减号前缀,OR 用括号竖线,通配符支持但前导通配符性能差,尽量少用。
打开语义搜索
默认的语义检索走 OpenAI 兼容的嵌入接口,本机跑 Ollama 或者 llama.cpp 就能用,默认模型是 8B 级别的嵌入模型,向量维度 2000。关键词权重和语义权重分开配置,混合检索的效果比单一方式稳。
要注意数据边界。开启语义搜索之后,文档文本会发给你配置的嵌入端点,端点在本机就没问题,指向外部服务就等于把内容交出去。SQLite 后端用 sqlite-vec 存向量,PostgreSQL 后端用 pgvector。
接入 AI 助手
服务暴露 MCP 接口,走 Streamable HTTP 传输,提供搜索、取预览、查历史三个工具。客户端在 Claude Desktop 的配置文件或 Cursor 的 MCP 配置里加一段即可。
工具返回结果时会把来源内容标记为不可信,用来提示注入风险,但这个标记不能保证每个消费模型都抗得住。给助手开放索引时,把敏感目录排除掉更稳妥。
运维与边界
- 服务器要一直开着,否则索引和检索都停。
- 磁盘占用按每页几十到上百 KB 估算,网页快照、版本差异、语义向量是主要增长项。
- 删除命令不会动源文件、浏览器历史和其他记录,清理命令也不删网页文档,别把它当完整数据清理工具。
- 导出不是完整备份,账号、历史、任务这些不在里面。
- 大量文档时内存占用会偏高,关掉语言检测能降内存,代价是语言分析精度下降,而且要重建索引。
常见问题
- 支持多用户吗。支持,同一服务器上可以按用户隔离文档与搜索结果。
- 抓取会遵守 robots 规则吗。默认遵守,可以按需关闭,抓取间隔也能调。
- 和浏览器自带的搜索历史比强在哪。索引的是正文全文,支持字段和语义查询,还能覆盖本地文件。