Repository navigation
dsh-session-query-cjk:更适合中文会话的分词方法 #13032
wavingleaf
started this conversation in
Show Your Plugins!
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
会话搜索的中文检索修复:dsh-session-query-cjk(按字切词 + 增量对账)
省流
官方
dsh-session-query-sqlite有两个独立缺陷,让“搜历史会话”基本不可用:unicode61不切连续汉字,查询又被整体包成短语——异步搜索/固件升级/会话插件实测都是 0 命中;dsh-session-query-cjk是它的 fork(MIT,保留上游 LICENSE),只改四处:按字切词、按会话增量对账、搜索不再内联对账、独立索引库。实测:会话插件从 0 → 19 个会话,同步搜索从 600 秒超时变成当轮返回。作者本人对分词和检索是业余沾边级别,且没有试过多种分词策略。本插件以提供思路为主。
环境与规模
问题 1:
unicode61对中文不切词dsh-session-query-sqlite的 FTS5 表用tokenize = 'unicode61',而调用方的查询被quoteFtsData()整体包成一个短语。连续汉字在unicode61里是一个 token,于是短语命中要求“文档里有完全一样的整段连续汉字”。同一批数据、同一组查询,直接对索引库执行
count(*) … MATCH:unicode61会话插件异步搜索固件升级插件(常被标点/加粗隔开)上下文压缩插件能命中只是因为它在原文里经常独立出现;句中短语(“我想做个异步的搜索会话插件”)整段搜不到。问题 2:每次搜索都先跑全量对账
searchSessions/searchEvents每次都先_reconcile:列两遍持久化清单(本机约 85 秒/遍),两遍逐条 revision 全等才提交;ctx.sessionQuery的串行队列里,搜索之间互相排队。实测(官方 provider):
session_search(同步,查询「插件」)更隐蔽的是:因为“整库静默”这个前提在有活动会话的机器上几乎不成立,索引会长期无法更新(本机从 11-09 起没有一次成功对账)。
本插件改了什么(与上游的四个差异)
搜索插件能命中「……搜索插件……」里的连续四字。unicode61视其为分隔符(私有区U+E000不行,会被当成 token 字符);且不是 JS\s意义上的空白(否则片段变成「异 步 搜 索」)。U+200B满足两者,渲染时抹掉即可。异步 插件= 两个词各自命中。stat()复核;读期间被写的跳过、下一轮补;单会话读坏只跳过它。不再要求整库静默。1146308691、schema 版本1、库文件与官方session-search.db分离;官方索引不动,回滚只改一行配置。其余语义(过滤器、排序、游标代数、snippet 截断、
openAt生命周期、单进程单所有者)与上游逐行一致,方便随上游升级对照 diff。耗时与覆盖(实测)
skipped: 0安装
在 profile 的
cordis.patch.yml里把optional-session-search组的 provider 行换成本插件(组内两行要整份重述,patch 对config是整体替换):包:
dsh-session-query-cjk(仓库dist/下有 tgz)。装完重启 dsh。已知限制
异步搜索不命中「异步的搜索」);多个词用空格分开。许可
fork 自
@deepseek-ai/dsh-session-query-sqlite(MIT, Copyright (c) 2026 DeepSeek),包内保留上游 LICENSE 全文;改动范围为上述四处,其余代码逐行一致。All reactions