Hister 规则四件套速成:skip/priority/versioning/alias 让搜索听你的
Hister 规则四件套速成skip/priority/versioning/alias 让搜索听你的【免费下载链接】histerYour own search engine项目地址: https://gitcode.com/GitHub_Trending/hi/hister自托管搜索引擎最常被问到一个问题索引内容是一回事能不能让搜索结果听我指挥Hister 给出的答案是规则系统——一套以 Go 正则语法为基础、贯穿索引与检索两个阶段的 URL 匹配机制。它解决了私有搜索场景下最真实的痛点索引里混进了广告站和登录墙、重要文档永远排不到前面、跟踪的页面悄悄改版却毫无察觉、常用查询每次都要敲一长串过滤条件。本文基于仓库源码与官方文档拆解 skip、priority、versioning、alias 四类规则的作用域、匹配语法与完整配置流程。读完后你会发现让搜索听你的其实只需要一个rules.json。一个规则系统两个作用阶段理解 Hister 规则的关键是分清它们各自发生在管线的哪一环。四类规则并不是均匀地分布在搜索引擎的各个角落而是被清晰地划分为两组索引阶段写路径skip以及同族的allow在文档进入索引前执行决定这条 URL 值不值得存versioning在文档被重复索引时执行决定这条 URL 的内容变化要不要留档。检索阶段读路径priority在查询执行时对命中文档施加分数加成alias在查询文本进入解析器之前做关键词替换。这个划分在源码里非常直观。规则的类型定义集中在 config/config.gotype Rules struct { Allow *Rule json:allow Skip *Rule json:skip Priority *Rule json:priority Versioning *Rule json:versioning Aliases Aliases json:aliases }每一类规则都以正则模式列表ReStrs的形式存储加载时统一编译。也就是说四类规则共享同一套正则语法区别只在于在哪个时机、对谁生效。skip在写入前把噪音挡在门外skip 规则是最容易上手的URL 一旦匹配任一 skip 模式该文档就会在索引和hister reindex期间被静默丢弃。官方文档给出的典型用例是广告网络、登录页、Cookie 同意弹窗以及任何你永远不想看到的内容见 webui/website/src/content/docs/rules.md^https://ads\.example\.com ^https?://(login|mail)\.example\.com/ .*\?utm_source注意最后一条默认情况下 Hister 只会剥离utm_*查询参数但如果你连带utm_source的整条 URL 都不想要一条规则就能把所有营销追踪链接挡在索引外。skip 与 allow 的组合逻辑在 config/config.go 的IsSkip方法中有精确定义func (r *Rules) IsSkip(s string) bool { if r nil { return false } if r.Allow ! nil len(r.Allow.ReStrs) 0 !r.Allow.Match(s) { return true } return r.Skip ! nil r.Skip.Match(s) }语义是allow 列表非空时URL 必须至少匹配其中一条而 skip 始终拥有更高优先级——你完全可以放行整个站点但排除特定路径。一个值得注意的逃生舱如果某条页面确实被规则误伤浏览器扩展的Index this page now、CLI 的hister index --ignore-rules、或 API 提交时的metadata.ignore_skip_rules: true都能显式覆盖规则并把这个选择随文档一起持久化reindex也不会把它清掉参见 webui/website/src/content/docs/rules.md。而 Web 界面的 Rules 页还提供同时删除已匹配文档的选项让存量文档与规则保持同步。priority把关键来源钉在结果顶部priority 规则解决的是排序问题无论相关性分数如何匹配 priority 模式的文档都会被推到顶部。它的实现是检索阶段的一次分数加成位于 server/indexer/indexer.goconst priorityScoreBoost 100 // boostPriorityURLs scores only candidates from the original query, preserving // its text and ownership filters. func boostPriorityURLs(base query.Query, patterns []string) (query.Query, error) { // 编译所有模式命中 URL 的文档 score priorityScoreBoost }注意priorityScoreBoost 100这个量级——它不是一次微弱的加权而是近乎强制置顶的硬性提升足够把个人 wiki、公司内部文档或你信任的权威源稳定地顶到其他结果前面。代码注释还解释了为什么要用 Go 正则而非 Bleve 自带的语法保持与规则校验一致的匹配语义。典型配置^https://wiki\.example\.com/ ^https://docs\.example\.com/versioning给关注页面装上变更留档versioning 规则的用途是追踪变化URL 匹配 versioning 模式、且内容与上次索引版本不同时Hister 会计算 HTML 与纯文本的 diff match patch 并存入数据库形成可回溯的版本史。这对隐私政策、发布说明、新闻页这类悄悄改版的页面尤其有价值——你可以审计一个可信资源最后变更的时间甚至把每次变更拼成个人 changelog。它的触发点在 server/endpoints.go 的文档提交流程中索引前先取旧文档索引完成后对比新旧内容有差异则调用SaveDocumentVersion存储 diffif d.Type ! document.RemoteFile rules.IsVersioning(d.URL) { existingDoc c.Indexer.GetByURLAndUser(d.URL, d.UserID) } // ...索引完成后... htmlDiff, textDiff : computeDocumentDiff(existingDoc, newDoc) if htmlDiff ! || textDiff ! { model.SaveDocumentVersion(newDoc.URL, newDoc.UserID, htmlDiff, textDiff) }版本查看入口在预览面板一旦某文档积累过至少一次 diff预览区会出现历史版本计数点开后可以按时间浏览每次变更的 diff或重建并展示归档版本。也就是说versioning 不只是一条索引期规则它还顺带点亮了预览区的时光机能力。alias把长查询浓缩成一个词alias 是唯一作用于查询文本本身的规则。在执行搜索之前Hister 会把查询里出现的 alias 关键词替换为其展开形式实现路径在 config/config.gofunc (r *Rules) ResolveAliases(s string) string { sp : strings.Fields(s) changed : false for i, ss : range sp { for k, v : range r.Aliases { if ss k { sp[i] v changed true } } } ... }它按空白分词做精确的整词替换所以你定义的缩写可以被拼进任意查询。官方示例webui/website/src/content/docs/rules.md{ gh: domain:github.com, local: type:file, work: domain:(internal.example.com|jira.example.com) }之后输入work deployment等价于完整查询domain:(internal.example.com|jira.example.com) deployment。日常的高频过滤条件限定域名、限定文件类型、限定站点组从此只需要两个键击。Go 正则语法与 URL 匹配细节allow/skip/priority/versioning 都匹配完整 URL含 scheme、host、path 与查询串并遵循 Go 正则语法。几个关键细节最容易踩坑锚定必须包含 scheme^https://foo.com有效^foo.com无效因为它匹配的是字符串中间位置而非 URL 开头零宽断言look-ahead / look-behind不支持这是 Goregexp的硬限制不是 Hister 的取舍hash 片段在匹配前被剥离https://foo.com/#section会先被规整为https://foo.com/尾部$锚定与查询串互斥/login$匹配不到https://foo.com/login?auth1因为$要求字符串在此处结束而查询串还在后面。所有模式在加载时统一编译非法正则会在LoadRules阶段被拒绝见 config/config.go 的Compile与Rules.Compile避免规则写错导致静默失效。从默认配置到个人化规则一条完整链路规则文件位于单用户模式的数据目录下名为rules.json启用多用户模式后每个用户拥有存在数据库中的私有规则副本。手动编辑、Web 界面 Rules 页、TUI 的规则表单以及 client/rules.go 中封装的/api/rules、/api/add_alias接口都通向同一个结构。一个典型的个人化配置长这样{ skip: [ ^https?://(login|mail)\\.example\\.com/, .*\\?utm_source ], allow: [ ^https://example\\.com/, ^https://docs\\.example\\.org/ ], priority: [ ^https://wiki\\.example\\.com/, ^https://docs\\.example\\.org/ ], versioning: [ ^https://example\\.com/privacy-policy$ ], aliases: { work: domain:(internal.example.com|jira.example.com), local: type:file } }效果是登录页与带营销参数的外链不进索引索引范围被收紧到两个站点的白名单个人 wiki 与内部文档永远排最前隐私政策页每次改版都被留档而每次敲work都会自动展开为整个内部域名组的过滤。这套规则随hister reindex对存量文档生效也可以通过界面一键清理匹配的旧文档。从索引写入前的挡到检索时的顶与换四类规则把搜索引擎最核心的两个自由度——收录什么、如何呈现——完整地交还给了使用者。这恰恰是私有搜索与公共搜索引擎之间最本质的分野前者不是替你决定答案而是让你有能力定义答案。【免费下载链接】histerYour own search engine项目地址: https://gitcode.com/GitHub_Trending/hi/hister创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

软件测试面试高频考点全解析:从理论到自动化实战

软件测试面试高频考点全解析:从理论到自动化实战

面试季又快到了,每年这个时候总有朋友来问我软件测试到底怎么准备。我也在测试行业摸爬滚打了十多年,从功能测试做到自动化测试架构,期间面试过别人,也被别人面试过。说实话,市面上的面试题集锦很多,但大部…

2026/10/10 10:37:45 阅读更多 →
钉钉出差人员自动调整外勤考勤组:审批联动配置与实践指南

钉钉出差人员自动调整外勤考勤组:审批联动配置与实践指南

出差考勤这件事,处理不好比出差本身还让人头疼。尤其是人一多、项目一杂,钉钉后台里几十号人出差时间重叠,考勤组却还挂在原来的办公室考勤组里,系统每天给你标红一片,HR得挨个解释“他去外地了”,老板看到…

2026/10/10 10:36:41 阅读更多 →
腾讯AI应用开发一面实录:13道硬核面试题全解析(TaoToken视角)

腾讯AI应用开发一面实录:13道硬核面试题全解析(TaoToken视角)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:36:41 阅读更多 →

最新新闻

代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录刷到第67天,说实话,这一天比我想象中来得平静。没有“终于结束了”的解脱感,也没有“我全都学会了”的兴奋,更多的是一种踏实的收束感。从第一天的数组二分查找开始,到后来二叉树、回溯、动规、单调栈&#…

2026/10/11 13:10:49 阅读更多 →
探索地块建立全解析:Java+JS+Python三端协作实战

探索地块建立全解析:Java+JS+Python三端协作实战

从赛题公布到最终提交,我前后花了将近两周时间。“新卷200分”里的这道“探索地块建立”,要求用三种语言各完成一轮闭环,确实不是单纯考某个语法点能应付过去的。很多朋友一看到“探索地块建立(Java & JS & Python&#x…

2026/10/11 13:10:49 阅读更多 →
Cursor 智能提交实战:用 AI 生成规范 Git Commit Message 的完整工作流

Cursor 智能提交实战:用 AI 生成规范 Git Commit Message 的完整工作流

最近我的 git 提交流程发生了不小的变化。以前写完代码顺手敲一句“fix bug”“update code”“改了一堆东西”就推了,等过了两周回来看历史记录,完全想不起来当时改了啥。后来我开始试着让 Cursor 的 AI 帮我生成 commit message,再进一步让…

2026/10/11 13:10:49 阅读更多 →
微信小程序实时语音识别接入指南:从鉴权到帧流处理

微信小程序实时语音识别接入指南:从鉴权到帧流处理

简介:微信小程序语音识别项目是一套面向微信小程序开发者的完整工程示例,围绕科大讯飞语音识别接口展示语音转文字、实时语音输入与智能语音交互的实现思路,适合具备一定JavaScript基础、希望在小程序中快速接入AI语音能力的开发者学习。压缩…

2026/10/11 13:10:49 阅读更多 →
基于SSM的软件缺陷管理系统:从选题到答辩全流程详解

基于SSM的软件缺陷管理系统:从选题到答辩全流程详解

每到毕业季,群里最热闹的问题永远是“毕设做什么题目好”。作为一个经常带学生做项目的过来人,我的回答一般都很直接:软件缺陷管理系统,这个题目别嫌弃它老,放到2026年依然是性价比极高的选择。只要有SSM框架和Java基础…

2026/10/11 13:10:49 阅读更多 →
如何看懂 Portabase 安全机制:AES-256-GCM凭据加密、RBAC与Passkey登录完整指南

如何看懂 Portabase 安全机制:AES-256-GCM凭据加密、RBAC与Passkey登录完整指南

【免费下载链接】portabase Portabase - Database backup & restore tool for PostgreSQL, MySQL, MsSQL, MariaDB, Firebird SQL, SQLite, MongoDB, Redis and Docker Volume 项目地址: https://gitcode.com/gh_mirrors/por/portabase 点击查看 免费下载 Por…

2026/10/11 13:09:49 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →