description: "面向部署方与维护者的 SQLite FTS5 会话历史全文搜索后端,用于选择、配置或排查查询服务之上的全文搜索。"
English | 中文
使用本包可为会话历史增加带排序的 SQLite FTS5 搜索,既能跨会话搜索,也能在单个会话内搜索,并支持游标分页。它把实时与持久化历史索引到独立的派生数据库,因此搜索反映当前状态,同时不会修改会话持久化存储。精确读取、过滤与追踪仍通过同一查询 API 提供。已发布组合中的搜索是可选能力;配置 openAt 可让索引在启动时、首次搜索时打开,或永不打开。结果匹配 token 与短语,而非任意子字符串;每个索引路径只能由一个进程持有。
当组合需要对会话历史进行排序后的全文搜索时——例如 Web 内容搜索或 /resume 既往工作检索——挂载本包。常用路径是显式的:挂载插件、给它一个专用数据库路径,然后从代码调用 ctx.sessionQuery.searchSessions 或 searchEvents。
当你想对既往会话进行带排序与分页的全文召回时选择它。它与 dsh-session-query 和会话服务一起使用;持久化后端可选但建议挂载,这样重启后持久化历史仍可搜索。不要把 path 指向 session-persistence 数据库——本包拥有独立的派生索引。
- name: '@deepseek-ai/dsh-session'
- name: '@deepseek-ai/dsh-session-query-sqlite'
config:
path: /absolute/path/to/session-search.db
| 字段 | 默认值 | 含义 |
|---|---|---|
path |
必填 | 专用派生索引 SQLite 路径,或 :memory:;POSIX 上缺失的路径会以仅所有者可访问的方式创建 |
openAt |
startup |
startup 在激活时打开;first-search 把 SQLite 模块推迟到首次搜索;never 关闭全文搜索,继承的读取保持可用 |
journalMode |
wal |
wal、delete、truncate 或 persist |
defaultLimit |
20 |
请求省略 limit 时的分页大小 |
maxLimit |
100 |
接受的最大请求分页大小 |
snippetChars |
240 |
按 Unicode 码点计算的最大 snippet 长度 |
readWindowMax |
50 |
继承的 readEvent() 的 before/after 原始事件数上限 |
persistedReadConcurrency |
4 |
继承批量读取的并发持久化日志读取数 |
preparedSessionCacheSize |
5 |
继承的 observeSession 读取器为复用保留的冷 prepared-Session 观察数 |
生成的配置目录是每个受支持字段及其 JSDoc 的穷尽式真源。
searchSessions 搜索整个语料库,并按每个会话匹配最强的事件分组结果;searchEvents 搜索一个逻辑会话。查询是字面短语:首尾空白会被移除、内部空白会被规范化,引号、OR、NEAR 和 * 等 FTS5 语法被视为数据,绝不作为可执行查询语法。元数据过滤器(会话 id、cwd、创建时间、父级、可用性、事件 seq/时间/类型/表层)在排序前缩小结果。默认搜索全部 current、shadowed 与 log-only 事件;传入表层过滤器可缩小范围。
排序是确定性的:实际 FTS5 高亮匹配 span 更多的在前,然后文档更短的在前,事件时间、会话 id 与 seq 打破平局。结果携带按 snippetChars 个 Unicode 码点截断的纯文本摘录,没有提供方专用数值分数。分页通过不透明 SessionSearchCursor 延续,游标绑定到规范化后的确切请求;相关语料库变化时游标变为陈旧(SESSION_QUERY_STALE_CURSOR),会话内游标可在不相关会话变化后延续,跨会话游标则不能。
unicode61 tokenizer 匹配 token 与短语,而非任意子字符串:AI 不匹配 token BRAID。需要执行字面、空白灵活的字符串子串扫描时,使用带 text 子句的 ctx.sessionQuery.filterEvents()。
使用 openAt: first-search 时,服务在不导入 node:sqlite、不打开索引的情况下激活,把 SQLite 的实验性警告推迟到首次实际搜索;无效数据库让首次搜索失败,而不是服务激活失败。使用 openAt: never 时,全文搜索对该部署关闭:searchSessions 与 searchEvents 在任何请求规范化之前就以 SESSION_QUERY_SEARCH_DISABLED 失败,而继承的全部精确读取、过滤与追踪保持可用。请求超过编译谓词预算(跨会话 14 个组合谓词、会话内 13 个)或 SQLite 可移植的 32,766 绑定上限时,会在准备语句前以 SESSION_QUERY_INVALID_FILTER 失败。
带类型的 SessionQueryError 失败携带稳定代码:搜索配置为关闭时 SESSION_QUERY_SEARCH_DISABLED;索引无法打开或对账时 SESSION_QUERY_INDEX_FAILED;搜索目标不存在时 SESSION_QUERY_SESSION_NOT_FOUND;语料库在分页之间变化时 SESSION_QUERY_STALE_CURSOR——请重试完整的搜索调用;游标不属于该请求时 SESSION_QUERY_INVALID_CURSOR。取消在同步 SQLite 调用之间被尊重;已在 JavaScript 线程上执行的语句无法被中断。
当包级约定不够用时阅读以下页面。它们从共享查询服务逐步进入类型级约定与设计证据。
无,因为该搜索后端只向调用方返回命中,且不注册任何面向模型的内容。
无;本包既不组装也不发送提供方请求。
这些限制说明本包何时不合适,或何时需要特别的运维注意。它们是当前包约束,不是通用 SQLite 对比或任务积压。
DatabaseSync 在 MATCH 执行期间会阻塞 JavaScript 线程,且无法中断已运行的语句。unicode61 tokenizer 不会匹配更大 token 中的子字符串;对字面扫描使用 filterEvents()。