思源笔记 v3.7.1 版本解析:FTS5 外部内容模式索引重构与跨平台细节改进
思源笔记 v3.7.1 版本解析FTS5 外部内容模式索引重构与跨平台细节改进【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan思源笔记SiYuanv3.7.1 是一个以「改进细节」为主题的维护型版本在功能层面引入了siyuan://bazaarURI 打开集市资源说明、Markdown 导入对音频/视频标签的解析支持、通知开关配置以及空闲时自动索引修复在架构层面则完成了一项关键的内核改造——将全文搜索索引表blocks_fts迁移至 SQLite FTS5 的 external content外部内容模式与blocks表去重存储。阅读完本文你将理解这些变更的底层实现原理、对应的源码位置以及它们如何影响日常使用中的搜索、导入、多端同步与数据库体验。一、核心架构变更blocks_fts 采用 FTS5 外部内容模式v3.7.1 最值得关注的技术改动是「blocks_fts 使用 FTS5 外部内容模式以与 blocks 去重」——这不再是普通的体验优化而是对内核全文索引机制的实质性重构。1.1 什么是 FTS5 external content 模式在标准 FTS5 用法中虚拟表自身会物理存储一份列值副本导致同一份内容在blocks表与blocks_fts表中重复存放。而 external content 模式则通过建表声明指定外部内容来源表让 FTS5 只维护倒排索引inverted index列值仍由blocks表统一持有从而在数据层面实现去重。从 database.go 的建表代码可以看到这一模式的落地细节db.Exec(DROP TABLE IF EXISTS blocks_fts) // 采用 external content 模式blocks_fts 不再物理存储列值仅维护倒排索引 // 行内容由 blocks 表提供实现数据去重同时保留 UNINDEXED 标记的元数据列 db.Exec(CREATE VIRTUAL TABLE blocks_fts USING fts5(id UNINDEXED, parent_id UNINDEXED, ... contentblocks, content_rowidrowid, tokenize\ ftsTokenize() \))其中contentblocks声明外部内容表为blockscontent_rowidrowid指定两者通过行 ID 关联。索引重建同样遵循该模式INSERT INTO blocks_fts(blocks_fts) VALUES(rebuild)见 database.go而删除操作则通过DELETE FROM blocks_fts WHERE rowid IN (...)与blocks表联动见 database.go。1.2 写路径的顺序约束external content 模式对写入顺序有严格要求必须先写blocks_fts再写blocks。这一点在 block.go 的注释中明确记录external content 模式下blocks_fts 的写操作需以此为定位键。下列局部更新索引列的路径updateRootContent、updateBlockContent、indexNode须先写 blocks_fts、再写 blocks。具体实现如UPDATE blocks_fts SET content ?, fcontent ?, ial ? WHERE rowid ?见 block.go。该顺序保证 FTS5 在读取外部内容时始终能看到与索引一致的数据版本。1.3 性能基准验证仓库为此提供了专门的性能基准测试 fts_bench_test.go用于「量化写入/查询/重建开销」。测试中对比了两种模式见 fts_bench_test.go标准模式CREATE VIRTUAL TABLE blocks_fts USING fts5(...)与blocks成对写入insertBlocksStandardexternal content 模式CREATE VIRTUAL TABLE blocks_fts USING fts5(..., contentblocks, content_rowidrowid, ...)仅向 FTS 写入定位键列。这说明该改动经过了写入、查询、重建三个维度的基准测试验证而非简单的开关切换。从源码结构可以推断此重构的核心收益在于减少磁盘占用与写入放大同时保持查询能力不变。二、新功能逐个拆解从 URI 协议到导入解析2.1 通过 siyuan://bazaar URI 打开集市资源说明v3.7.1 支持通过siyuan://bazaar/{type}/{name}/readmeURI 直接打开集市资源的说明文档其中{type}为资源类型如plugins、widgets、icons、themes等{name}为资源名称。该能力由前端 URI 分发器实现见 uri.ts// siyuan://bazaar/plugins/plugin-sample/readme // siyuan://bazaar/plugins/plugin-sample/readme-installed const processSiYuanUriBazaar (app: App, uriObj: URL): boolean { const [, _type, _name, target] uriObj.pathname.split(/); ... switch (target) { case readme: case readme-installed: { // readme 打开集市中的在线说明readme-installed 打开已安装资源的本地说明 const from target readme-installed ? downloaded : bazaar; const {openBazaarReadme} await import(../config); openBazaarReadme(app, resourceType, resourceName, from); } } }两种目标行为如下URI 目标含义数据来源readme打开资源在集市中的说明集市在线数据from bazaarreadme-installed打开已安装资源的说明本地已下载数据from downloaded此外URI 中的资源名会先经过decodeURIComponent解码解码失败时安全返回false避免异常 URI 破坏分发流程。整套 URI 处理统一由processSiYuanUri按hostname分发见 uri.tsbazaar正是其中一个分支。2.2 Markdown 导入解析 audio/video 标签此前在导入标准 Markdown 时audio与video标签会被识别为 HTML 块而非音视频块。v3.7.1 修复了这一问题实现位于 import.go。其实现思路是由于 Markdown 导入使用的是NewStdLute且未启用 Protyle WYSIWYGlute 不会将这两个标签解析为音视频块因此在导入完成后通过htmlBlock2Media将标签整体识别出来并还原为对应的音频/视频块// htmlBlock2Media 将导入标准 Markdown 时被识别为 HTML 块的 audio/video 还原为音频/视频块。 if bytes.HasPrefix(lower, []byte(audio)) bytes.HasSuffix(tokens, []byte()) { ... } else if bytes.HasPrefix(lower, []byte(video)) bytes.HasSuffix(tokens, []byte()) { ... }对用户而言导入含音视频标签的 Markdown 文档后内容会以正确的媒体块形态呈现可直接播放与管理资源。2.3 支持设置通知开关本版本新增外观通知开关配置支持按通知类型分别控制是否展示。配置结构定义在 appearance.goNotifications *util.Notifications json:notifications // 外观通知开关配置默认配置由NewNotifications()统一生成全部启用见 appearance.go// Notifications 外观通知开关配置。 // Appearance.Notifications 为 nil 时表示旧配置尚未迁移整体按默认启用处理。 type Notifications struct { ... } // NewNotifications 创建默认全部启用的通知配置。新增内置通知时在此统一调整默认值避免多处分散。 func NewNotifications() *Notifications { return Notifications{ ... } }该配置在应用层setting.go与内核启动阶段conf.go都会做 nil 迁移处理即旧版本配置升级后不会因缺字段而失效。通知开关在文档树列表、标签列表等场景均有对应消费逻辑见 filetree.go 与 tag.go。2.4 空闲时自动执行索引修复针对部分设备偶发的索引异常v3.7.1 引入了空闲时段自动索引修复机制当应用处于空闲状态时内核会在后台对索引数据进行一致性修复从而降低手动重建索引的频率。该能力与上一节所述 FTS5 索引重构共同服务于搜索与文档树可靠性的提升。三、桌面端与 Electron 相关改进3.1 Electron 停用混合内容的自动 HTTPS 升级Electron 应用默认会对混合内容HTTPS 页面中的 HTTP 子资源尝试自动升级到 HTTPS但在部分场景下会导致资源加载失败。v3.7.1 禁用了该自动升级行为让页面按原始协议加载资源避免因升级失败引发的功能异常相关修改见 electron 目录下的主进程配置。3.2 Microsoft Store 版本隐藏自动更新选项由于 Microsoft Store 分发的应用由商店渠道统一管理更新内核自带的自动更新逻辑与之冲突。v3.7.1 在 Microsoft Store 版本中隐藏了「自动更新」设置项避免用户误操作导致更新机制错乱。3.3 编辑器与拖放体验支持从左侧、右侧和底部内边距拖曳选取此前仅支持从内边距顶部区域开始拖选本版本扩展至左、右、底部提升了选区操作的容错性将区块拖曳到浮动文档树时停靠面板未出现修复了拖放过程中 Dock 面板响应缺失的问题在带固定表头的表格中输入数据不再重设滚动位置修复了固定表头场景下输入导致视口回跳的体验问题通过编辑器中的块引用创建新文档的改进优化了块引用转新文档的流程块引用锚文本未变更时跳过持久化引用文档这是一个性能优化——当块引用的锚文本没有实际变化时不再重复持久化引用关系减少无谓的写入开销将列表区块转换为段落后再撤销出现异常修复了该转换-撤销链路的异常。四、移动端与平台适配修复移动端iOS / Android / HarmonyOS在本版本获得了一批针对性修复变更影响平台说明横向超级区块中的栏位占满全宽移动端修复横向布局下栏位宽度不足的问题改进左侧栏顶栏移动端顶栏交互与视觉优化桌面模式时弹出屏幕键盘HarmonyOS / Android桌面模式布局下自动唤起软键盘长按并垂直滚动不再触发多选模式移动端区分长按与滚动手势闪卡中缺少区块标且 iPhone 无法延伸选取移动端修复闪卡区块标缺失与选区扩展问题从右到左选取文字意外关闭设置页面iPhone修复设置页文本反选触发页面关闭的问题iOS 分享面板缺少思源iOS补齐分享面板入口iOS 上图片不显示iOS修复图片渲染异常部分 Android/iOS 设备的索引问题Android / iOS修复索引初始化异常其中「删除未完成的拼音时游标意外跳到其他单元格」为 macOS 专属修复针对输入法拼音编辑状态下光标跳转异常的问题。五、缺陷修复清单数据库、PDF 与安全5.1 数据库相关修复数据库分组后无法新增字段修复分组视图下字段新增入口失效的问题数据库滚动加载相关问题修复大数据量下滚动加载的异常数据库建立时间字段筛选不生效修复基于Created time字段的筛选逻辑两设备同时开启时数据库视图无法同步修复多端并发场景下视图同步失败的问题。以上修复集中在属性视图Attribute View相关内核模块见 kernel/av 目录下的filter.go、group.go、layout.go等实现说明 v3.7.1 对数据库功能进行了系统性加固。5.2 PDF 搜索与启动问题无法在 PDF 文件中搜索文字修复了 PDF 文本检索失效的问题。PDF 相关的链接注释能力由 pdf.go 提供PdfListLinks、PdfListToCLinks搜索链路涉及 PDF 解析与索引的配合某些情况下启动时卡在「Finishing boot」修复了启动阶段偶发阻塞保证引导流程boot可正常完成。5.3 界面与其他修复区块标菜单在窗口左边缘处被裁剪修复弹出菜单位置计算修复一些安全漏洞本版本包含安全修复项建议及时升级。六、文档更新与下载6.1 新增工作空间文件系统布局文档v3.7.1 同步新增了「工作空间文件系统布局」文档WORKSPACE.zh-CN.md系统性地说明了思源工作空间目录中各子目录如data/、conf/、temp/、backup/等的职责与布局为数据管理、备份迁移与故障排查提供了权威参考。6.2 获取 v3.7.1本版本可通过以下方式获取B3log 官网下载访问思源官方下载页获取各平台安装包GitHub Releases通过项目 Release 页面下载对应版本内核源码内核侧实现位于 kernel 目录前端实现位于 app/src 目录可自行构建验证。总结思源笔记 v3.7.1 在「小而精」的细节改进之外完成了一次值得关注的内核升级blocks_fts迁移到 FTS5 external content 模式配合空闲自动索引修复从数据冗余与索引一致性两个层面加固了全文搜索的地基同时以siyuan://bazaarURI、Markdown 音视频导入、通知开关等能力扩展了可编程性与导入兼容性并在数据库、PDF、移动端多平台完成了一轮系统性缺陷修复。对于自托管用户而言升级本版本即可同时获得存储优化、可靠性提升与安全修复属于建议及时跟进的小版本。【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

WorkBuddy实战:从聊天AI到会干活的AI工作台

WorkBuddy实战:从聊天AI到会干活的AI工作台

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 13:34:02 阅读更多 →
Python编程入门:第一次作业实战指南

Python编程入门:第一次作业实战指南

1. Python第一次作业:从零开始的编程初体验 刚接触Python编程的新手们,第一次作业往往既兴奋又迷茫。作为一门以简洁优雅著称的编程语言,Python的入门门槛相对较低,但这并不意味着可以掉以轻心。我的第一次Python作业是在大学二年…

2026/9/11 13:34:02 阅读更多 →
JAVA毕设选题推荐:基于 SpringBoot 架构的自动化教学管理平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

JAVA毕设选题推荐:基于 SpringBoot 架构的自动化教学管理平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/11 13:33:02 阅读更多 →

最新新闻

SystemInformer 汉化 5 步走:免费系统监控工具中文界面改造完整指南

SystemInformer 汉化 5 步走:免费系统监控工具中文界面改造完整指南

SystemInformer 汉化 5 步走:免费系统监控工具中文界面改造完整指南 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars &…

2026/9/11 14:09:23 阅读更多 →
如何三步在 Docker 容器中运行 Android 模拟器:docker-android 完整使用指南

如何三步在 Docker 容器中运行 Android 模拟器:docker-android 完整使用指南

如何三步在 Docker 容器中运行 Android 模拟器:docker-android 完整使用指南 【免费下载链接】docker-android Android in docker solution with noVNC supported, video recording and mcp server 项目地址: https://gitcode.com/GitHub_Trending/do/docker-andr…

2026/9/11 14:09:23 阅读更多 →
动态规划优化:粉刷房子II算法详解

动态规划优化:粉刷房子II算法详解

1. 问题背景与核心挑战"粉刷房子 II"这道算法题表面上是关于房屋粉刷的颜色选择问题,实际上是一个经典的动态规划(DP)练习题。题目描述为:有n栋房子排成一排,每栋房子可以用k种不同颜色中的一种进行粉刷,且相邻两栋房子…

2026/9/11 14:09:23 阅读更多 →
macOS 上 LibreOffice 设置中文界面的完整指南

macOS 上 LibreOffice 设置中文界面的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 14:09:23 阅读更多 →
双指针算法:原理、应用与LeetCode实战

双指针算法:原理、应用与LeetCode实战

1. 双指针算法的本质与应用场景双指针算法是解决数组/链表类问题的经典技巧,其核心思想是通过两个指针的协同移动来降低时间复杂度。不同于暴力解法中常见的O(n)复杂度,双指针通常能将复杂度优化到O(n)。这种算法在LeetCode题库中出现的频率极高&#xf…

2026/9/11 14:09:23 阅读更多 →
多平台飞控 ArduPilot:SITL 仿真三步跑通,新手完整避坑指南

多平台飞控 ArduPilot:SITL 仿真三步跑通,新手完整避坑指南

多平台飞控 ArduPilot:SITL 仿真三步跑通,新手完整避坑指南 【免费下载链接】ardupilot ArduPlane, ArduCopter, ArduRover, ArduSub source 项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot 你多半经历过这个场景:机架装…

2026/9/11 14:08:23 阅读更多 →

日新闻

Axum 中 through `into_make_service_with_connect_info` 获取客户端连接信息:从 SocketAddr 到自定义 Connected 的完整指南

Axum 中 through `into_make_service_with_connect_info` 获取客户端连接信息:从 SocketAddr 到自定义 Connected 的完整指南

Axum 中 through into_make_service_with_connect_info 获取客户端连接信息:从 SocketAddr 到自定义 Connected 的完整指南 【免费下载链接】axum HTTP routing and request-handling library for Rust that focuses on ergonomics and modularity 项目地址: http…

2026/9/11 0:00:30 阅读更多 →
Metabase Embedding SDK 的 SdkDashboardId 类型:数值 ID、字符串 entity_id 与类型安全的仪表板标识

Metabase Embedding SDK 的 SdkDashboardId 类型:数值 ID、字符串 entity_id 与类型安全的仪表板标识

Metabase Embedding SDK 的 SdkDashboardId 类型:数值 ID、字符串 entity_id 与类型安全的仪表板标识 【免费下载链接】metabase The easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart: …

2026/9/11 0:00:30 阅读更多 →
CANN/GE模型执行函数aclmdlExecuteV2

CANN/GE模型执行函数aclmdlExecuteV2

aclmdlExecuteV2 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlo…

2026/9/11 0:00:30 阅读更多 →

周新闻

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 17:44:57 阅读更多 →
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/11 11:36:03 阅读更多 →
基于CNN的调制信号识别:MATLAB实现时频图分类实战

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 8:03:07 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/9 7:36:02 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/10 8:24:05 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/9 7:36:01 阅读更多 →