背景

我的 Markdown 知识库写了上百篇文章,放在一个 Git 仓库里,每篇文章都有规范的 front matter(标题、日期、标签、分类)。但日常使用时发现几个痛点:

  • 检索困难 — 想找某篇文章要靠 grep 或翻文件树
  • 标签不可视 — 不知道有哪些标签、每个标签多少文章
  • 跨文章导航 — 想看某个领域的所有文章,只能手动维护目录表

一、引入 Obsidian

起初认为 Obsidian 不必要,“写 markdown 用编辑器就够了”。实际用下来发现几个编辑器做不到的能力。

1. Tags 面板 — 可视化的元数据聚合

编辑器只能靠 grep 搜索某个标签,例如 grep -r '"go"' content/。但无法做到 Obsidian Tags 面板这样一目了然地看到所有标签及其文章数量,也无法点击一个标签就列出所有匹配文章,更无法组合多个标签来缩小范围

编辑器方案每次检索都要手写正则,而 Obsidian 零操作。

2. Dataview — 按元数据实时查询

编辑器中的 Markdown 表格是静态文本。新增一篇文章后,必须手动找到对应的索引页并插入一行。删除文章后,表中那行变成死链,同样需要手动处理。

Dataview 的查询是实时计算的。索引页打开时自动扫描所有文件的 front matter,按条件过滤、排序、渲染表格。维护成本从"每次改 N 处"降为"改 0 处"。

例如在索引页中写入如下查询,即可自动列出所有带 go 标签的文章:

3. Quick Switcher 的标签感知

编辑器(VSCode)的文件搜索(Cmd+P)只能按文件名或路径匹配。

Obsidian 的 Quick Switcher(Cmd+O)理解 #tag 语法,输入 #test AND #jmeter 精确匹配,比编辑器快一个数量级。

4. Front Matter 不再是纯文本

在编辑器中,YAML 头就是一段普通文本,不会因为改了 title 字段而影响任何其他操作。

Obsidian 将 front matter 视为结构化元数据

  • 文件列表可显示 front matter 中的字段
  • Dataview 可以直接查询这些字段
  • 标签搜索直接读取 tags 列表
  • 插件(如 Templater)可以读取 front matter 来自动生成模板内容

5. 可视化导航 — Graph View

编辑器没有 Graph View。当一个技术领域的文章较多时,在图谱上看到所有节点的视觉分布,能帮助你快速发现"我在这块写过哪些文章",比文件树的线性列表更直观。

6. CSS 自定义渲染

编辑器显示的是 Markdown 源码,表格宽度无法按需调整。Obsidian 通过 CSS 代码片段可以自定义预览模式下一切元素的样式——表格宽度、列比例、字体大小等。

二、用 MOC 集中管理索引

Dataview 解决了"查"的问题,但还需要一个导航入口。做法是按主题域创建 MOC(Map of Content)索引页,每个 MOC 就是一个 Dataview 查询表格。

例如 _moc_go.md

之后所有带 go 标签的文章会自动出现在这个表格里,新增或删除文章后自动更新,不需要手动维护。

在每个 MOC 页的底部,还可以用 [wikilink](../wikilink.md) 相互引用:

➡️ 探索其他领域:[Java 与 SpringBoot](../_mocs/_moc_java_springboot.md)

三、不在每个文章里内嵌 Dataview

最初尝试在每个文章底部加一段 Dataview 查询来显示"相关文章",发现维护成本高——改一次查询条件要逐个文件改。

更好的方案是MOC 集中维护 + 简单链接引用:在每篇文章末尾加一行指向所属 MOC 的链接:

markdown

  • 新增/删除文章 → MOC 表格自动更新
  • 要改查询条件 → 只改 MOC 一个文件
  • 底部链接是纯文本,全局搜索替换即可

四、一点 CSS 调整

Obsidian 默认表格宽度较窄,新建一个 CSS 代码片段让表格占满宽度:

.markdown-preview-view table {
  width: 100% !important;
  table-layout: fixed;
}
.markdown-preview-view table th:nth-child(1),
.markdown-preview-view table td:nth-child(1) {
  width: 55%;
}
.markdown-preview-view table th:nth-child(2),
.markdown-preview-view table td:nth-child(2) {
  width: 25%;
}
.markdown-preview-view table th:nth-child(3),
.markdown-preview-view table td:nth-child(3) {
  width: 20%;
}

五、总结

管理的不是 markdown 文件,而是文件的元数据——这是 Obsidian + Dataview 区别于编辑器的本质差异。

核心思路:

  1. 统一 front matter — 标题、日期、标签是所有自动化的基础
  2. 用 Dataview 替代手动维护 — MOC 一次配置,永久自动更新
  3. 集中优于分散 — 一个 MOC 页面好过在每个文章里嵌查询
  4. 标签状态化 — 用 status/xxx 标签管理内容生命周期(如 status/outdated

用 Obsidian 打开你的 Markdown 仓库就能直接用,不需要迁移或转换格式。

相关文章