尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

思源笔记 v2.10.3 技术解读:资源文件内容搜索、EPUB 解析与多端体验改进

思源笔记 v2.10.3 技术解读:资源文件内容搜索、EPUB 解析与多端体验改进 思源笔记 v2.10.3 技术解读资源文件内容搜索、EPUB 解析与多端体验改进【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan本篇文章以思源笔记SiYuan仓库中 v2.10.3 的发布说明app/changelogs/v2.8.4-v2.12.8/v2.10.3/v2.10.3.md为骨架聚焦该版本两大核心主题——资源文件内容搜索的缺陷修复与EPUB 资源文件解析优化并结合内核源码kernel/model/asset_content.go等逐层展开其底层实现。读完本文你将理解思源笔记资源内容搜索的索引、解析与全文检索机制掌握该版本在编辑器交互、移动端体验、PDF/网络图片处理以及插件 API、鉴权、内核 API 方面的全部变更细节便于评估是否升级或进行二次开发。版本概述围绕资源内容搜索的一次集中修复v2.10.3 是思源笔记 2.8.4 ~ 2.12.8 演进周期中的一个维护型版本。发布说明的 Overview 明确给出了该版本的工作重心修复了若干与资源文件内容搜索相关的问题优化了EPUB 资源文件的解析。同时需要特别说明的是搜索资源文件内容即对 PDF、EPUB、Office 文档等附件做全文检索属于付费会员特性当时处于早鸟价阶段。这一会员边界至今仍体现在配置与内核行为中下文会看到相关常量与索引逻辑因此在使用该能力前需先确认账户订阅状态。下文按改进功能Enhancement→ 缺陷修复Bugfix→ 开发者Development三组清单展开先深挖与版本主题最相关的资源内容搜索与 EPUB 解析实现再逐项解读其余变更。资源文件内容搜索从解析到全文检索的完整链路v2.10.3 对资源文件内容搜索的修复并不是孤立的它建立在内核一套完整的附件内容索引机制之上。理解这层机制才能看懂该版本修复了什么。整体实现位于 kernel/model/asset_content.go共约 967 行负责解析、索引、查询与预览SQL 持久化与 FTS 表定义在 kernel/sql/asset_content.go、kernel/sql/asset_content_query.go 中。支持索引的资源类型与解析器注册内核按文件扩展名注册不同的资源解析器AssetParser接口见 kernel/model/asset_content.go#L529-L531只定义了一个方法type AssetParser interface { Parse(absPath string) *AssetParseResult }AssetParseResultkernel/model/asset_content.go#L522-L527仅含Path / Size / Updated / Content四个字段即把二进制附件转换为可索引的纯文本是全部解析器的共同职责。从源码看当前注册的解析器至少包含kernel/model/asset_content.go#L505-L507 附近可见.pdf与.epub注册同文件更早位置还有对应类型TxtAssetParser.txt 等纯文本kernel/model/asset_content.go#L533 起DocxAssetParserWordkernel/model/asset_content.go#L605PptxAssetParserPowerPointkernel/model/asset_content.go#L643XlsxAssetParserExcelkernel/model/asset_content.go#L681底层使用github.com/xuri/excelize/v2PdfAssetParserPDFkernel/model/asset_content.go#L791底层使用 go-pdfiumEpubAssetParserEPUB 电子书kernel/model/asset_content.go#L931。各解析器由AssetsSearcher统一管理kernel/model/asset_content.go#L387-L397通过扩展名小写匹配查找解析器。资源文件本身有体积/规模约束内核在 kernel/model/asset_content.go#L513-L520 定义了硬性上限const ( TxtAssetContentMaxSize 1024 * 1024 * 4 // 文本类 4MB PDFAssetContentMaxPage 1024 // PDF 最多 1024 页 ) var ( PDFAssetContentMaxSize uint64 1024 * 1024 * 128 // PDF 最大 128MB )这些常量意味着超大附件不会被完整解析入索引避免索引库被单个文件拖垮。索引写入事件驱动 全量重建单个资源文件的索引入口是indexAssetContent(absPath)kernel/model/asset_content.go#L325-L362流程为按扩展名取解析器无解析器则直接返回调用parser.Parse(absPath)得到纯文本内容os.Stat取文件大小与修改时间构造sql.AssetContent记录Path统一换算为以assets/开头的工作空间相对路径通过util.GetDataAssetsAbsPath()剥离绝对路径前缀先sql.DeleteAssetContentsByPathQueue(p)删除旧记录再sql.IndexAssetContentsQueue(...)异步入队写入 FTS 索引表。触发时机由资源变更事件驱动如新增/修改/删除 assets 下的文件后由 kernel/model/assets_watcher.go 观察触发。全量重建则通过任务队列完成fullReindexAssetContentkernel/model/asset_content.go#L369-L375会调用sql.InitAssetContentDatabase(true)重建数据库再执行assetContentSearcher.FullIndex()遍历整个assets/目录kernel/model/asset_content.go#L399-L429。值得注意的一个安全细节全量索引遍历时会调用IsEncryptedAssetPath(absPath)跳过加密笔记本中的资源文件kernel/model/asset_content.go#L418-L421以避免密文污染搜索索引、泄漏加密笔记本内的文件名集合。这与思源笔记内容加密的整体设计见 docs/ENCRYPTED-NOTEBOOK.zh-CN.md保持一致。检索模式、排序与分页查询侧的核心函数是FullTextSearchAssetContentkernel/model/asset_content.go#L116-L138其入参完整还原了思源搜索资源内容对话框的全部选项query搜索关键字/表达式types按扩展名过滤的文件类型集合method0关键字、1查询语法、2SQL、3正则表达式orderBy0按相关度降序、1按相关度升序、2按更新时间升序、3按更新时间降序page / pageSize分页pageCount由命中数上取整得出(matchedAssetCount pageSize - 1) / pageSize。底层数据表为 FTS5 全文索引asset_contents_fts_case_insensitive大小写不敏感。关键字与查询语法模式统一走fullTextSearchAssetContentByFTSkernel/model/asset_content.go#L189-L205构造形如MATCH content:(query)的查询并对ext IN (...)做类型过滤正则模式fullTextSearchAssetContentByRegexpkernel/model/asset_content.go#L151-L165则对name与content字段使用 SQLREGEXP。排序子句由 kernel/model/asset_content.go#L300-L313 的buildAssetContentOrderBy生成FTS 相关度即rank。SQL 模式method 2直接暴露原始查询能力由searchAssetContentBySQL执行并把用户的SELECT *改写为COUNT(path)以复用同一语句统计命中数kernel/model/asset_content.go#L207-L220 起——这也是搜索资源内容支持高级 SQL 检索的入口。命中预览与转义v2.10.3 的修复落点资源文件内容搜索预览是官方 Issue #9073 在 v2.10.3 中改进的对象。预览文本的生成逻辑就在本文件列表查询使用 FTS 的snippet()截取命中片段两端以search.SearchMarkLeft / SearchMarkRight作为高亮标记尾部以...截断长度 64kernel/model/asset_content.go#L191-L192单文件详情查询则用highlight()返回完整高亮内容并会把换行统一替换为brkernel/model/asset_content.go#L60-L87。由于资源文件提取出的正文是原始文本直接拼入 HTML 预览会出现 HTML 特殊字符、、等被当作标签解析的转义问题——这正是 v2.10.3 所称改进资源文件内容搜索预览转义要处理的场景搜索结果在进入前端渲染前需正确转义既保证高亮标记不被破坏也避免原始正文中的标签污染页面结构。对二次开发者而言这意味着在使用上述snippet/highlight输出时需注意与前端渲染管线的转义约定保持一致。EPUB 资源文件解析本次优化的直接对象EPUB 电子书是内容搜索支持的重点格式之一v2.10.3 明确提到改进 EPUB 资源文件解析Issue #9072其实现即 kernel/model/asset_content.go#L931-L967 的EpubAssetParser.Parsefunc (parser *EpubAssetParser) Parse(absPath string) (ret *AssetParseResult) { if !strings.HasSuffix(strings.ToLower(absPath), .epub) { // 扩展名兜底校验 return } if !gulu.File.IsExist(absPath) { // 文件必须存在 return } tmp : copyTempAsset(absPath) // 复制到临时文件后解析 if tmp { return } defer os.RemoveAll(tmp) f, err : os.Open(tmp) if err ! nil { logging.LogErrorf(open [%s] failed: [%s], tmp, err) return } defer f.Close() buf : bytes.Buffer{} if err epub.ToTxt(tmp, buf); err ! nil { // 核心EPUB - 纯文本 logging.LogErrorf(convert [%s] failed: [%s], tmp, err) return } content : normalizeNonTxtAssetContent(buf.String()) ret AssetParseResult{Content: content} return }可提炼的实现要点如下双重兜底校验即便解析器由扩展名路由而来Parse内部仍会再次检查.epub后缀与文件存在性防止被错误调用临时副本隔离通过copyTempAsset将 EPUB 复制到临时文件再解析、defer os.RemoveAll(tmp)确保清理避免解析过程长期占用资源目录下的原文件句柄对网盘/同步盘场景尤其重要也与此前 iCloud 路径相关的改进思路一致文本抽取使用github.com/88250/epub的ToTxt一次性把整本 EPUB 的书脊spine正文输出到bytes.Buffer。EPUB 本质是一个 ZIP 容器内部以content.opf声明元数据与阅读顺序、以 XHTML/HTML 组织正文——因此ToTxt需要正确解包容器、遍历 spine、剔除章节内的脚本/样式噪声后再拼接正文统一清洗抽取出的原始文本最后经normalizeNonTxtAssetContent归一化如规整空白、折叠多余换行与 PDF、Office 等非文本解析器走同一套清洗与入索引管线。v2.10.3 对 EPUB 解析的改进从代码演进方向推断主要落在文本抽取的健壮性例如对目录结构不规范、缺失content.opf或使用非标准 MIME 的 EPUB 文件更宽容使其能被可靠地纳入全文索引最终服务于付费的搜索资源文件内容特性。编辑器、浮层与交互改进Enhancement 其余项除资源内容搜索外v2.10.3 的改进集中在桌面端编辑器交互、窗口/面板行为与移动端细节逐项说明如下。浮层与光标行为动态计算浮层层级#7602浮层浮窗/提示层的 z-index 不再固定写死而是依据触发位置与嵌套关系动态计算避免浮层被遮挡或盖住不该盖住的面板。这在浮窗预览文档块#9082等场景中配合生效——后者同时修复了浮窗预览文档块时自动定位到上一次浏览位置的问题让预览总是从文档起始位置干净呈现与主编辑区记忆的浏览位置解耦划选文本后 CtrlM 转换行级公式的光标位置#9070选中文本按CtrlM把选区包裹为行级公式后光标会落在更合理的位置便于立即继续输入 LaTeX 内容空代码块中可打开块标菜单PR #9095此前光标停在无内容的空代码块内时块标块操作菜单无法唤起本版本修复了该边界条件。复制、菜单与面板PDF 标注复制尺寸一致#9068在 Windows 与 macOS 上从 PDF 复制的标注高亮/批注粘贴后保持与源一致的尺寸不再因平台缩放差异而变化复制文本 *系列改进#9093选中文本后出现的复制文本/复制纯文本等菜单项的复制结果更符合预期禁用菜单项样式PR #9078菜单中不可用项的置灰样式得到优化视觉上更易区分不可用与可用状态停靠栏Dock显隐状态#9089鼠标从应用外部移入、或应用窗口处于非激活状态时左右侧停靠栏的显示/隐藏判断更合理不再出现移入瞬间闪烁/误隐藏iCloud 路径检测改进PR #9066macOS 上对 iCloud 同步目录的识别更准确避免把 iCloud 占位文件或下载中文件误当作本地资源处理属于资源文件基础设施层面的健壮性增强。文档加载性能与网络图片amd64 平台文档加载性能改进#9084针对 Windows/Linux/macOS 的 amd64 架构优化了块加载路径官方口径为性能改进代码层面与内核渲染、数据库读取的热路径相关kernel/model 目录中的render.go、process.go即承担文档渲染与块处理职责网络图片转换为本地图片忽略 HTTPS 证书校验#9080把网页中的远程图片下载转存为本地资源时不再因目标站点证书自签名或过期而中断——下载资源文件的相关逻辑位于内核资源处理模块如 kernel/model/asset.go 对应的下载/转存链路此改动提升了遇到非正规证书站点时的成功率代价是放弃了对该次下载连接的服务端证书校验。搜索与路径提示 UI改进搜索路径提示#9101全文搜索界面中当前搜索范围/路径的提示布局与文案得到优化让用户更清楚本次搜索限定在哪些笔记本、路径或资源类型内——与资源内容搜索的类型过滤types参数属于同一交互体系。移动端与跨端修复细节本版本的移动端iOS/Android改动密集明显针对 iPhone 的可用性问题iPhone 禁止左侧面板顶栏选中内容#9096左侧面板顶栏如笔记本/文档切换栏在 iPhone 上不再因长按误触发文本选中交互更跟手iPhone 输入元素边框修复#9104补齐 iOS Safari 下input元素默认边框丢失的问题避免输入框与背景融为一体、难以辨识移动端云端数据同步图标不再消失#9090同步状态图标此前在特定流程如进入/退出同步后会从状态栏消失现可稳定驻留展示移动端代码块复制按钮失效修复#9109Bugfix触屏下代码块右上角复制按钮此前无法正常复制内容本版本修复了该回归。缺陷修复清单Bugfix除上文已涉及的 #9109 外v2.10.3 还修复了以下问题与编辑器、集市与导入导出流程相关问题Issue/PR现象修复意义#9071文档放大zoom状态下编辑时光标丢失恢复放大视图下的连续输入体验#9074集市marketplace中包更新后更新按钮不显示修正版本比对与按钮状态刷新逻辑#9076块引用/超链接文本框内←/→ 无法移动光标恢复引用、链接编辑框的键盘导航能力#9083导入.sy.zip时块超链接未指向重新生成的块 ID导入重写 ID 后超链接同步重映射到新 ID内核 kernel/model/import.go 承担 .sy.zip 导入与 ID 重写流程#9086内核只读模式下无法进入主界面只读模式可用于备份/审计下 UI 也能正常挂载#9106导出 PDF 时将资源文件作为附件嵌入失效恢复 PDF 导出时附件资源的嵌入能力其中 #9083 与资源文件/块 ID语义直接相关.sy.zip导入会重新生成块 ID 以保证不冲突而正文中的超链接若仍指向旧 ID 就会失效本版本将其纳入重映射范围属于文档结构一致性修复。面向开发者的变更Developmentv2.10.3 对插件体系与内核 API 的调整对二次开发影响最大值得插件作者与 API 调用方重点关注。插件 APIopenWindow与command.globalCallback#9032本次为插件 API 新增了两个能力openWindow允许插件以窗口形式打开自定义页面/界面区别于既有的面板、弹窗可承载更复杂的插件 UIcommand.globalCallback为全局命令注册回调使插件能响应跨文档、跨场景的全局命令触发。这两者均是对思源插件运行时kernel/plugin 目录下api_plugin.go、api_rpc.go、api_event.go等构成插件 API 与事件总线的能力扩展前端侧由 app/src/plugin 提供对应类型与封装。鉴权支持查询参数tokenPR #9069内核鉴权此前仅接受 Header/固定形式的令牌现支持在 URL 查询字符串中以token...传递访问授权码Access Authorization Code。这意味着 WebSocket、API 回调及部分无法自定义 Header 的客户端可直接在 URL 中带令牌完成鉴权——但请注意URL 会被日志、历史记录捕获该方式更适合受控内网或一次性回调场景。桌面端在设置 - 关于 - 访问授权码下管理该令牌见下文的跟随系统锁屏选项。内核 API 改进/api/file/getFile响应状态码改进PR #9075此前对文件不存在等错误场景返回的状态码语义不明确本版本统一为符合 HTTP 语义的状态码如 404便于客户端区分成功/不存在/鉴权失败。该 API 用于按路径读取资源/文档文件属于 kernel/api 中文件与资源类接口的范畴/api/network/forwardProxy改进PR #9110内核网络转发代理接口用于插件/内核侧发起 HTTP 请求时经代理转发得到增强返回的状态码与错误信息更可读。桌面端新增访问授权码跟随系统锁屏#9087Windows/macOS设置新增跟随系统锁屏Follow system lock screen开关开启后当操作系统进入锁屏状态时思源对外的访问授权码自动进入锁定态解锁系统后恢复——避免笔记本在用户离开电脑期间被局域网内其他设备经授权码访问。该项位于设置 - 关于 - 访问授权码页面属于访问控制Access Authorization Code相关实现见 kernel/util/session.go、kernel/conf/user.go 等在桌面端的安全增强。版本定位与升级建议综合来看v2.10.3 是典型的稳定性 细节打磨版本对内修复了资源内容搜索与 EPUB 解析支撑付费会员特性质量对外补齐了桌面端交互、移动端可用性以及面向开发者的 API/插件能力。若你正在使用搜索资源文件内容会员特性并遇到 PDF/EPUB 内容命中异常、预览转义错乱等问题v2.10.3 值得升级若你是插件作者或通过内核 API/WebSocket 鉴权调用思源请特别关注新增的openWindow、command.globalCallback与查询参数token鉴权若你运行在 macOS iCloud 环境或经常处理 PDF 标注、网络图片转本地本版本对路径检测、证书校验与复制尺寸的修复同样有直接收益。本仓库的 CHANGELOG.md 汇总了完整版本演进v2.10.3 的英文、简体中文与繁体中文发布说明分别位于英文app/changelogs/v2.8.4-v2.12.8/v2.10.3/v2.10.3.md简体中文app/changelogs/v2.8.4-v2.12.8/v2.10.3/v2.10.3_zh_CN.md繁体中文app/changelogs/v2.8.4-v2.12.8/v2.10.3/v2.10.3_zh_CHT.md希望深入资源内容搜索原理的读者可继续阅读上述 kernel/model/asset_content.go 全文并结合 kernel/sql/asset_content.go 中的建表与索引队列实现梳理附件变更 → 解析 → FTS 索引 → 命中预览的完整闭环。【免费下载链接】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),仅供参考
返回列表