
【免费下载链接】WindInput清风输入法 | 轻量、快速、可定制的开源中文输入法专为五笔和码表输入方案设计支持全拼/双拼Windows / macOS / Linux项目地址https://gitcode.com/gh_mirrors/wi/WindInput点击查看免费下载WindInput清风输入法是一款轻量、快速、可定制的开源中文输入法专为五笔和码表输入方案设计支持全拼/双拼覆盖 Windows / macOS / Linux。它的越用越懂你背后是一套基于嵌入式 KV 数据库 redb 的持久化层用户词、词频统计、Shadow 候选调序规则全部落在一个.redb单文件里。本文带你完整拆解这套设计的核心思路无需阅读全部源码也能看懂它是怎么做的。为什么选 redb输入法的学习数据有几个典型特点数据量小但写频繁每次选词都要记录一次用了哪个词需要崩溃安全写一半断电词库不能坏需要按前缀范围扫描打了sh开头的码要能列出所有sh…的用户词单文件可携带备份、导入导出时直接拷走即可。用 SQLite 当然也行但 redb 是 Rust 原生的嵌入式 KV 引擎零外部依赖、自带事务、key 有序天然支持 range 扫描和词库 一组有序 KV的模型严丝合缝。清风输入法的存储层 wind-store 就是围绕它构建的是整个系统中最底层、无内部依赖的 crate。设计演进过程记录在 docs/redesign/store.md里面详细对比了旧版 Go 实现bbolt的问题例如时间戳单位不一致、记录用 JSON 序列化偏臃肿等Rust 重写时一并修正。扁平表 复合 keyredb 里没有嵌套目录redb 不支持数据库嵌套不像 bbolt 有 bucket 树所以用扁平 table 复合 key来表达层次。核心设计是key 用\0做字段分隔符把方案 id编进 key 前缀靠 key 的字典序天然实现按方案隔离 前缀范围查询。主要表一览定义见 store.rs表名key 编码存什么user_words方案\0输入码\0词语用户词自己造的词temp_words同上临时学习词自动造词freq同上词频{count, last_used}定长 12 字节shadow方案\0输入码Shadow 调序/删除规则phrases输入码\0文本全局短语不分方案draft_words方案\0输入码\0词语自动造词草稿层待验证stats_daily/meta日期 / 固定键打字统计 / 版本号、设备 ID这个编码是范围查询的基础查某方案下某输入码的所有词就是一次range前缀扫描短语刻意不带方案前缀因为手机号、住址这类短语与用五笔还是拼音无关。用户词定长二进制比 JSON 香每条用户词是一条记录字段包括weight权重、count使用次数、created_at创建时间、boundary音节边界等。设计上有几个值得学习的点user_words.rscode 和 text 存在 key 里value 只放定长二进制字段。词库动辄十万条JSON 序列化的体积和解析开销都是浪费字段演进走惰性升级记录从 16 字节长到 28 字节旧记录读出来缺的字段按默认值处理不需要写迁移脚本流式遍历不物化遍历设置页词库列表时回调直接借用 redb 页里的字节UserWordView只对真正要保留的少数几条做拷贝避免翻一页先创建 38 万个 String。词的学习规则也很直观重复添加同码同词取最大权重每次选中该词count 1达到阈值就提升权重。词频系统与权重彻底解耦这是整个设计中含金量最高的决策权威文档是 docs/redesign/frequency.md旧版把使用频率算成一个 boost加到词的 weight 上但词库权重量级巨大拼音可达千万级有上限的 boost 加上去几乎不起作用——用了几十次还是排不上去。新版彻底推翻概念含义作用权重 weight词库自带默认排序维度词频 frequency只记真实使用数据{count, last_used}独立的排序维度词频只在 freq.rs 里存 12 字节count u32 last_used i64排序时才作为独立维度参与绝不修改 weight。不同方案用不同策略码表方案用过的词置顶used-first可选一次到顶MRU或逐次提升count 累积两种策略拼音方案按半衰期衰减分参与排序——(base_scale × log2(count1)) × exp(-ln2 × 时长 / 半衰期)最近用过的词上浮久未用自然回落且整句候选恒定豁免不被词频挤下。一句话总结码表的用过是永久的拼音的用过是会褪色的。Shadow 规则候选置顶与删除的影子层打错了想置顶某个候选、或者屏蔽一个永远用不上的候选这些手动干预就是 Shadow 规则实现见 shadow.rs按方案 输入码分组记录pinned置顶到某位置和deleted屏蔽两类规则置顶优先于删除新规则插队首LIFO语义简单可预测cand_id精准去重是个细节亮点像今天日期这种动态候选文本每天都不一样只比文本会导致规则删不掉、恢复默认恒灰显所以引入候选稳定 id 作为匹配键。Shadow 的妙处在于它是排序后的应用点而非数据层——词库本身不动规则单独存随时可恢复默认。工程细节缓存回收、热替换与版本迁移redb 用得好不好差距在细节。wind-store 的 AGENTS.md 把几个血泪教训写得很直白唯一安全入口with_db所有读写必须经这个闭包它持锁并检查暂停态避免绕过 pause/resume 语义页缓存是只涨不落的高水位redb 的读缓存实测 19 万词的库全表扫描后会常驻 41 MB 不还。解法是双档回收——批量写完成后立即drop_page_cache关库重开一次约 6 ms全表扫描只做标记等库空闲 3 秒后由后台线程回收绝不打扰按键链路。相关测试见 tests/redb_cache_high_water.rspause / resume 释放文件锁Windows 下原子替换.redb文件前必须解锁文件这对热更新很关键版本迁移框架meta表存schema_version全新库直接打版本号旧库按版本链逐步升级当前CURRENT_VERSION 1store.rs。动手验证wind-store不依赖任何平台特定代码任意系统上都能直接跑测试临时.redb文件建在系统临时目录cargo test -p wind-store配套的架构文档 docs/architecture/ 与 docs/redesign/store.md 记录了从 Go 到 Rust 重写的完整决策链想深入为什么这么设计的同学值得一读。小结redb 用扁平表 方案前缀复合 key优雅表达了按方案隔离 前缀扫描的词库模型定长二进制 value 惰性字段升级让十万级词库的小而快成为可能词频与权重彻底解耦是修掉学了不灵顽疾的关键Shadow 作为排序后的影子层让用户的手动干预可存、可查、可恢复缓存回收、文件锁热替换、版本迁移三件套把嵌入式数据库的生产级坑填平了。这套设计对任何需要本地学习数据 崩溃安全 前缀检索的桌面应用都有很强的参考价值。赞分享【免费下载链接】WindInput清风输入法 | 轻量、快速、可定制的开源中文输入法专为五笔和码表输入方案设计支持全拼/双拼Windows / macOS / Linux项目地址https://gitcode.com/gh_mirrors/wi/WindInput点击查看免费下载相关推荐清风输入法 WindInput 图形设置详解热键、词库与智能过滤一图流配置清风输入法 WindInput 图形设置详解热键、词库与智能过滤一图流配置 清风输入法WindInput是一款轻量、快速、可定制的开源中文输入法专为五笔如何用深蓝词库转换清理输入法词库12 种过滤规则实战指南词频/长度/中英文去重如何用深蓝词库转换清理输入法词库12 种过滤规则实战指南词频/长度/中英文去重 深蓝词库转换 是一款开源免费的输入法词库转换程序内置 12 种过滤规则桌面应用CLI开发工具如何用世界最小CSS框架lit.css快速构建现代化网站如何用世界最小CSS框架lit.css快速构建现代化网站 在当今追求极致性能的Web开发世界中lit.css以其仅395字节的超轻量级体积脱颖而出成为世界上创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考