本地搜索改进
负责人:OINK 维护者。受影响契约:Shell。 本文描述的搜索行为随 OINK 1.4.0 发布。
证据与范围
此前 CJK 路径要求整条查询连续出现在同一字段中。英文使用 Lunr,两者都只返回页面链接, 没有小节上下文。保留每语言一个本地索引、现有命令、输入法组字、排除规则、关键词权重和 正数页面加权。不引入词典、服务、账号、外部可执行程序、配置键或额外构建步骤。
已接受的行为
按空白及拉丁文字与 CJK 边界拆分查询,保留 shared_buffers、pg_basebackup、
--baseURL 和 /pg/data 等技术标识符。关键词可以分布在不同索引字段中。优先返回
包含全部关键词的页面,其中连续短语优先;仅当没有页面覆盖全部词时,显示明确标注
覆盖数量的部分匹配。在这些层级内部应用页面加权。通过已内置的 Lunr 保留英文词干
匹配和有界的拼写回退。
每页只显示一条结果,选取最相关小节及摘要。直接读取渲染后的标题 ID,不重新推导 slug。 保留语言和部署子路径。正文只存储一次,小节边界使用 UTF-8 字节偏移。 heading 和 summary 范围保留标题锚点,不隐式收录全文。
在现有面板中增加带标签的原生单选组,可选择全站或当前顶层内容栏目。 默认全站,命令与页面操作继续可用。播报结果数量和部分匹配覆盖率,保留键盘选中、 焦点约束及输入法组字期间延迟查询的行为。
兼容性与检查
现有页面元数据与范围配置继续有效。小节是新增索引元数据;引擎仍接受没有小节的旧索引。
主题归属检查包括 check-search.py、搜索引擎与运行时测试以及面板检查。
站点归属检查包括双语真实内容查询预期、根路径及子路径锚点验证、浏览器键盘、组字、
栏目限定、响应式、深浅色和 axe 检查。
在相同真实语料上比较改造前后的结果与延迟,记录页面和小节数量、工具版本、预热和重复次数、
原始及 gzip 字节数。每语言保持在 2 MiB 原始、512 KiB gzip 预算内。
合成案例覆盖易混淆标识符,以及重复、Unicode、显式和含特殊字符的标题 ID。
决策与验收
2026-10-25:记录最小设计后完成本地实现。行为现由 Shell 契约、搜索与命令面板指南负责。
主题检查覆盖四种索引范围、真实 UTF-8 小节偏移、多语言及子路径 ID、旧索引兼容、加权和
按根栏目缓存的对话框。站点维护 tests/search/queries.json 和
scripts/check-search-corpus.mjs,根路径与子路径集成构建均执行 summary 查询门禁。
固定文档源码 ab2747a 每语言包含 149 页、1,321 个标题。43 条查询包含两条摘要范围的
负向案例。预期页面进入前五的数量分别为:英文摘要 7/7 → 7/7、中文摘要 2/7 → 7/7、
英文全文 10/10 → 10/10、中文全文 6/17 → 17/17。这是人工选定的回归预期,不是通用相关性评分。真实语料没有同时包含 连接池 超时 的页面,该项特意检查有标记的
部分匹配;主题合成案例检查完整匹配。
固定摘要索引的原始体积为 185,183/184,281 字节,gzip 为 39,529/43,208 字节 (英文/中文),均在预算内。全文诊断索引原始体积为 1,640,294/1,516,283 字节, gzip 为 536,971/578,674 字节,超过 gzip 预算。维护中的站点保留 summary 范围; 包含全部历史研究正文的配置不能通过预算要求,实现也不会静默截断这些内容。
浏览器验收覆盖中英文、390/1440 px、深浅色、真实锚点跳转、可见且可播报的部分匹配、
原生范围选择、博客与书籍根栏目、组字和命令保留。本地验收制品目录为
/Users/vonng/tmp/oink-search-20261025/,保存准确命令、JSON 计时、日志与截图。
这些带日期的测量仅针对当时语料;已接受的行为随 1.4.0 发布。
2026-10-26:修复索引读取时的跨输出上下文污染,增加多输出归属检查, 完成此前失败路由的无障碍与文件树复验。
2026-10-26:根据视觉反馈优化面板。两个范围选项改为紧凑的分段样式,保留原生单选组的 键盘行为与 44 px 点击区域;收紧桌面面板和列表间距,减淡选中背景,将实时状态与 键盘提示合并为统一底栏。
2026-10-26:对抗性审查修正了规范化匹配后的摘要与高亮偏移,区分标题 ID、数据属性与 脚本字符串,并将英文拼写回退限制在当前栏目。回归覆盖兼容字符、组合字符、短代码标题 以及结果文本中的 HTML 字面内容。