Repository navigation
Replies: 10 comments
补充:实测截图与原型说明上面提到的截图,这里一并说明内容(图片较大,需要手动拖入 — 见文末步骤): 截图 1 — Ctrl+F 搜索栏(面板外观) 截图 2 — 中文关键词命中的高亮效果
这正是 DSH 内置 FTS5 原型插件代码结构(约 290 行,单文件) 关键实现片段(供官方参考) 高亮 —— 用 CSS Custom Highlight API,不插入任何 DOM 节点,因此不会被 React 重渲染冲掉: var all = new Highlight();
var active = new Highlight();
for (var i = 0; i < state.ranges.length; i++) {
if (i === state.index) active.add(state.ranges[i]);
else all.add(state.ranges[i]);
}
CSS.highlights.set("dsh-find-all", all);
CSS.highlights.set("dsh-find-active", active);::highlight(dsh-find-all) { background:#ffd54f; color:#1a1a1a }
::highlight(dsh-find-active) { background:#ff9100; color:#1a1a1a }匹配范围 —— 限定在对话区,取不到时逐级退化: function scope() {
return document.querySelector('[data-slot="conversation.session"]')
|| document.querySelector('[data-slot^="conversation"]')
|| document.body;
}按键拦截 —— 捕获阶段监听,确保优先于编辑器: document.addEventListener("keydown", onKeyDown, true);流式输出时用 如果官方愿意采纳,我个人觉得最小改动、最大收益的是这一条: 这样几乎零 UI 工作量就能让所有用户立刻获得 Chromium 原生的页内查找高亮, (截图的原始文件如果需要,我可以再想办法提供。) |
勘误与数据订正(作者补充)感谢维护者与社区阅读。经复核,原帖有两处需要更正,特此说明——其余根因与实测结论均已在 一、勘误:Electron 没有可直接唤出查找条的菜单
|
| 口径 | 数量 |
|---|---|
| 会话目录数 | 102 |
| 日志文件数 | 106(48 个 session.jsonl.zstd + 44 个 session.v3.jsonl.zstd + 14 个 session.v4.jsonl.zstd) |
| 数据总量 | 约 45.7 MB |
即:有 4 个会话目录下同时存在多种格式的日志文件。
这一点对实现方有实际影响——同一会话的多个日志文件并非严格的超集关系,
例如某个会话 session.jsonl.zstd 有 11075 行、而其 session.v3.jsonl.zstd 只有 1476 行,
两边各有对方没有的行。因此读取时应按会话目录合并全部日志,而非只取其一或按文件平铺,否则会漏内容或重复计数。
三、截图状态:无需重传(已内嵌)
先前担心的「截图仅显示为链接」问题不存在——本页评论中的 5 张截图均已通过
user-attachments 正常内嵌(<img> 标签,非裸链接),未登录用户亦可正常查看。
以上两处更正不影响原帖的核心结论:桌面版没有会话内 Ctrl+F 入口,
且自带全文检索路径存在「索引为空」与「unicode61 不支持中文」两个已实测的问题。
English summary (for triage)
|
关联:本线程与 #4752 是同一底层问题的两个侧面(并补一条中文分词缺陷的实测)看到 #4752 First-class cross-conversation history search,
本线程可补充 #4752 的两条实测(#4752 中未覆盖)1. 即使把开关打开,索引里也没有内容 按官方注释指引把 2.
⇒ 这意味着 #4752 中"enable and expose it clearly"的目标,若仅打开开关、不动分词方案, 各侧现状小结
一个已跑通的客户端侧原型(供参考)本线程附了一个约 290 行的本机客户端插件(不改动 (另注:本线程先前一处建议"补 Electron 菜单 一句话:两帖合起来看更完整——#4752 指出"能力已交付但未启用",本线程补上 |
|
感觉挺有价值的,怎么没人回?是不是发General的bug比较好 |
|
感谢关注和建议 🙏 两点说明:本仓库 Issues 未启用( 如果这个功能对你有用,欢迎在楼层顶部 👍 投一票,帮助维护者看到需求强度。 |
|
我也觉得很神奇,居然没多少人需要这个功能吗 |
【更正 · 2026-10-06】关于"原创性主张"的自我修正本线程第 4 条评论中,我把「
需要说明的是:本线程的结论本身不变——该 tokenizer 行为经我们独立实测确认, 我们发帖前只做了单一关键词检索,未做同义替换与时间正序回溯,因而漏掉了 #1999。 一个顺带的观察:这类需求为什么容易被低估检索过程中我们统计了一下,同一诉求至少有 6 处独立来源,散落在多个分类中:
这些帖子的标题用词各不相同( 以上仅为观察,供维护者评估需求优先级时参考。 |
同感,我也一度觉得"这么基础的功能怎么会缺"不过这两天翻了一圈,发现可能需要的人不少,只是需求分散、互相看不见:
另有 #7946(会话搜索必然失败)、#3771(跨会话检索插件)等;这些帖子分在 Ideas / General / Show Your Plugins 三个分类,标题用词各异,彼此零交叉引用,所以单看任一帖都像孤例。 另:本线程第 4 条评论里把「 如果这个功能对你有用,除了楼层顶部的 👍,也可以去上面几个帖子点赞或补充使用场景——把分散的需求连起来,比单帖更容易被看到。 |





Uh oh!
There was an error while loading. Please reload this page.
功能建议:桌面版 DSH 会话窗口内缺少 Ctrl+F 关键字搜索
一句话:底层全文检索引擎已就位,但桌面版既没开启它、也没有 Ctrl+F 入口,
导致用户在"在对话里找一句话"这个最基础的场景上无路可走。
附带的原型插件已在本机实测可跑通,可直接参考实现思路。
一、问题描述
在桌面版 DSH 的会话窗口中,无法搜索聊天内容的关键字:
期望行为(与浏览器、办公软件一致的通用交互):
这不是配置问题——新手用户第一反应就是按 Ctrl+F,按下去毫无反馈,会直接判定"DSH 坏了"。
二、复现步骤
0.2.0-rc.2,Windows)Ctrl+F实际:无任何反应
同理,在侧边栏搜索框输入某个只出现在消息正文里的关键词(非标题),结果为空。
三、根因分析(含源码位置)
我已定位到三处确凿证据,供官方参考:
证据 1:主进程未注册 Electron 原生
find菜单角色app.asar/lib/main.js第 11930 行:其中
devToolsItems仅含两项:Windows 分支只有 DevTools 两项,没有 Electron 标准的
role: "find"。因此Ctrl+F未被任何处理器接管,webContents.findInPage()也从未被调用。证据 2:全部可绑定快捷键命令中没有任何搜索命令
@deepseek-ai/dsh-client-shortcuts注册的命令全集(共 14 个):没有任何
search.*/find.*命令,因此即便用户想通过「快捷键设置」自行绑定 Ctrl+F 也无从下手。证据 3:全文搜索出厂即关闭,且 Web 侧边栏刻意只搜标题
@deepseek-ai/dsh-base/cordis.patch.yml第 141–153 行(官方原文注释):这是设计如此:底层
dsh-session-query+dsh-session-query-sqlite(SQLite FTS5 全文检索)已具备完整能力(searchSessions/searchEvents,支持分页、摘录、元数据过滤),但默认openAt: never使其永不打开,调用会返回SESSION_QUERY_SEARCH_DISABLED。四、值得强调的一点
底层能力其实是完备的——
dsh-session-query的 README 明确写了:也就是说,缺的不是引擎,而是"界面入口"和"默认开启":
dsh-session-query(-sqlite)openAt: never,搜索被关闭dsh-tool-session-query顺带一提:
dsh-session-query-sqlite的 README 里提到该能力面向的使用场景之一正是「/resume既往工作检索」,可见会话内检索本就是规划中的能力,只是尚未落到 UI。四之二、实测:即使把开关打开,中文依然搜不到(关键新证据)
这一节是本建议最希望官方关注的部分。
实测 1:开关生效了,但索引里没有内容
按官方注释的指引,把
session-query-sqlite从openAt: never改为first-search,并给出持久化索引路径:
重启 DSH 后:
~\.dsh\cache\session-search.db(36 KB)persisted_sessions = 0、persisted_docs = 0、global_generation = 0)即:开关生效、后端启动,但没有把任何历史会话索引进去,所以搜索必然返回"无匹配会话"。
这一条建议官方排查:桌面版组合下该后端是否缺少索引数据的触发路径(是否只在写入时增量索引、而不会回填历史?)。
实测 2:
unicode61分词器不适用于中文(即使索引修好也依然搜不到)该后端使用 SQLite FTS5,默认
unicode61分词器,未做中文处理。用与 DSH 完全相同的表结构复现,并用
fts5vocab导出真实切出的 token:这个关键字能不能被搜索到关键字搜索/会话/当前会话DSH 的会话搜索:全文检索(FTS5)后端全文检索:和(夹成整词)DSH/FTS5fts5vocab显示索引里实际的 token 是:三段中文文本只切出 8 个 token。中文只有在"正好等于一整段被标点/空格/英文隔开的文本"时才能命中,
日常"在句子里找一个词"的用法完全搜不到。
⇒ 因此"把侧边栏搜索接上正文召回"这一条建议,必须同时换成分词方案(如中文双字切分 / bigram 后再入索引),
否则即便索引修好、开关打开,中文用户依旧搜不到。
四之三、可用原型:已实测跑通的 Ctrl+F 插件
为了验证"这个功能做出来是什么样",我们用 DSH 自己的客户端插件机制做了一个原型
(不改动 DSH 本体,通过
~/.dsh/profiles/desktop/cordis.patch.yml挂载):~/.dsh/local-plugins/dsh-find/(package.json+lib/index.js空 host 半 +lib/client.js界面半)::highlight()),不修改 React 渲染的 DOM,不会被重渲染冲掉[data-slot="conversation.session"],取不到时退化为整页MutationObserver+ 防抖重算本机实测结果(DSH
0.2.0-rc.2/ Windows 11):Ctrl+F1/73,页面上 73 处全部高亮Enter1/73→2/73,滚动到下一处Esc配套截图见附件
01-CtrlF搜索栏与高亮.png、02-中文搜索73处命中.png。这个原型的意义在于:它证明了"会话内 Ctrl+F 高亮"在现有架构下完全可行,
而且给出了一个绕开 FTS 中文问题的实现路径。官方若愿意,可直接参考该思路做官方实现;
也可以考虑提供一个面向模型的
conversation.search命令。五、建议方案(供参考)
按实现成本从低到高:
最小可用:在主进程 Windows 菜单补上 Electron 原生
role: "find",或直接拦截before-input-event中的Ctrl+F调用webContents.findInPage()—— 即可立刻获得 Chromium 原生的页内查找/高亮,几乎零 UI 工作量。会话内搜索条:在会话视图内实现搜索条 UI(复用现有
ctx.shortcuts注册一个conversation.search命令),支持高亮 + 上下跳转。走文本级匹配可顺带绕开 FTS 的中文分词问题(见第四节之二实测 2)。跨会话内容搜索:将
session-query-sqlite的openAt默认改为first-search(配合持久化path),让侧边栏搜索支持正文召回;同时需要把索引管线改为中文可分词的方案(双字切分 / bigram),否则中文召回依然失效。
另建议排查第四节之二实测 1 中"索引库已创建但 0 条记录"的问题。
六、环境信息
0.2.0-rc.2(ProductVersion0.2.0.0)~/.dsh/sessions/**/session.v4.jsonl.zstd)七、附:会话数据格式观察(非问题,供参考)
会话以追加式多帧 zstd 存储(
session.v4.jsonl.zstd),单个会话最多可达 2000+ 个独立 zstd 帧。用 Node 24 原生zlib.zstdDecompressSync逐帧解压可完整还原事件流。这一格式对「会话内搜索」有兴趣的实现方可能有用:由于是追加式,增量索引(只解压新增帧)会非常高效。
一句话总结:底层全文检索引擎已就位,但桌面版既未开启它、也未提供 Ctrl+F 入口,导致用户在最基础的"在对话里找一句话"场景上无路可走。建议优先补齐 Electron 原生
find角色——这是投入产出比最高的一步。All reactions