跳到主要内容

集成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 文件。

搜索流程:​

  1. 用户通过 ⌘⇧F 输入关键词。
  2. 渲染进程经过短暂防抖后发送 IPC 请求。
  3. 独立 Worker 查询 FTS5,筛选前 30~50 个候选文件。
  4. Worker 只读取这些候选 Markdown 的当前内容。
  5. 在文件中定位具体匹配位置,计算行号和上下文。
  6. 返回文件名、相对路径、行号、摘要、高亮范围和相关度。
  7. 界面最多展示约 100 条结果。
  8. 点击结果后打开文件、定位文件树,并跳转到对应匹配位置。

索引维护:​

  • 首次打开工作区时异步建立索引,并显示建立进度。
  • 后续根据路径、修改时间和文件大小判断是否需要更新。
  • 文件新增、修改、删除时,通过现有文件监听机制增量同步。
  • 高频文件事件合并后批量写入,减少磁盘操作。
  • 索引损坏、版本升级或工作区内容不一致时自动重建。
  • SQLite 操作全部放入 Worker,避免阻塞 Electron 主进程。
  • 使用 WAL checkpoint 和增量空间回收控制临时文件及空闲页。