集成sqlite数据库
全文搜索能力
- 集成SQLite FTS 全文索引
- 将从文件编辑器升级为知识工作台
搜索能力:
⌘P:快速打开文件,支持模糊匹配、最近使用、收藏、固定文件。⌘⇧F:全文搜索,展示内容片段、关键词高亮、文件夹/标签过滤。⌘⇧P:命令面板,执行新建笔记、切换主题、拆分编辑器、导出、创建提醒等动作。
搜索时如何得到行号和摘要
每次只读取少量候选文件,而不是读取整个工作区:
- SQLite 快速筛出候选文件
- Worker 读取候选文件当前内容
- 计算准确行号、上下文和高亮位置
- 最多返回例如 100 条匹配
- 文件在索引后发生变化时,以磁盘上的最新内容为准,并补充更新索引
索引如何维护
- 打开工作区时,根据规范化路径生成工作区 ID。
- 索引保存在 Electron
userData/search-indexes/<workspace-id>.sqlite。 - 扫描
.md文件,只比较路径、修改时间和大小。 - 只有新增或修改的文件才读取正文并更新 FTS。
- 删除文件时同步删除对应文档记录和 FTS 条目。
- 文件监听事件合并后批量提交,避免连续保存时频繁写数据库。
- 所有 SQLite 操作放进独立 Worker;主进程只负责 IPC,不会被同步数据库操作卡住。
- 索引带版本号,结构升级或损坏时自动重建。
- 定期 checkpoint 和增量回收空闲页,限制 WAL 临时空间。
SQLite FTS 全文搜索实现
- 使用 Electron 内置的
node:sqlite和 SQLite FTS5,无需增加第三方原生依赖。 - 索引保存在 Electron
userData目录,不污染用户的 Markdown 工作区。 - 每个工作区建立独立 SQLite 索引,通过工作区路径生成唯一 ID。
- 只索引当前工作区的
.md文件。
搜索流程:
- 用户通过
⌘⇧F输入关键词。 - 渲染进程经过短暂防抖后发送 IPC 请求。
- 独立 Worker 查询 FTS5,筛选前 30~50 个候选文件。
- Worker 只读取这些候选 Markdown 的当前内容。
- 在文件中定位具体匹配位置,计算行号和上下文。
- 返回文件名、相对路径、行号、摘要、高亮范围和相关度。
- 界面最多展示约 100 条结果。
- 点击结果后打开文件、定位文件树,并跳转到对应匹配位置。
索引维护:
- 首次打开工作区时异步建立索引,并显示建立进度。
- 后续根据路径、修改时间和文件大小判断是否需要更新。
- 文件新增、修改、删除时,通过现有文件监听机制增量同步。
- 高频文件事件合并后批量写入,减少磁盘操作。
- 索引损坏、版本升级或工作区内容不一致时自动重建。
- SQLite 操作全部放入 Worker,避免阻塞 Electron 主进程。
- 使用 WAL checkpoint 和增量空间回收控制临时文件及空闲页。