搜索系统
跨所有会话的全文搜索,支持角色过滤、片段高亮和多模式匹配。
"搜索是发现的一半。" — 塞内加尔谚语
Pi Session Manager 提供强大的全文搜索功能,基于双引擎架构,可跨所有会话进行搜索。
搜索引擎
SQLite FTS5
主搜索引擎。所有会话内容被索引到 SQLite 数据库(~/.pi/agent/sessions/sessions.db)中的 message_fts FTS5 虚拟表。提供:
- 快速前缀和短语匹配
- BM25 排序(通过
bm25()函数) - 低内存占用
- 自动同步(
content='message_entries',无需手动触发器)
可通过配置文件中的 enable_fts5 设置开关 FTS5。
Tantivy
Rust 原生的全文搜索库(类似 Lucene),作为辅助索引在 data/search/tantivy.rs 中实现。Tantivy 提供:
- 更精细的分词处理(unicode61)
- 对复杂查询更好的相关性评分
- 通过
data/search/index.rs并发索引
两个引擎都可通过统一的搜索客户端(data/search/client.rs)访问。
会话 ID 匹配
除了 FTS 搜索,搜索系统还支持会话 ID 的精确匹配和前缀匹配:
- 精确匹配:得分 1,000,000
- 前缀匹配(≥3 字符):得分 999,000
- 会话 ID 结果始终排在内容匹配之前
内容搜索
消息级 FTS5
会话中的每条消息都在 message_entries 中单独索引:
entry_id— 唯一消息标识符session_path— 父会话路径role— user 或 assistantsource_type— user、assistant 或 thinkingcontent— 消息文本
搜索结果按 (session_path, entry_id) 去重,每个会话最多限制 3 条命中。
中日韩(CJK)支持
对于中文/日文/韩文文本,FTS5 unicode61 分词不可靠。当检测到查询中包含 CJK 字符时,搜索会回退到 LIKE 子串匹配。
过滤器
角色过滤
将结果限定到特定的消息角色:
| 角色 | 说明 |
|---|---|
| 全部 | 搜索所有消息 |
| 用户 | 仅用户消息 |
| 助手 | 仅 AI 回复 |
排序方式
结果可按以下方式排序:
| 排序 | 说明 |
|---|---|
| 相关性(默认) | 按 FTS5 BM25 得分排序 |
| 最新 | 最新消息优先 |
| 最旧 | 最早消息优先 |
片段高亮
搜索结果会显示匹配文本的上下文。点击结果可直接跳转到会话查看器中对应的消息。
当匹配内容位于 toolResult 条目中时,查看器会自动解析到包含匹配工具调用的父级助手消息,然后滚动到正确位置。
插件系统
搜索系统采用插件架构,内置三个插件:
| 插件 | 搜索范围 |
|---|---|
| Session 插件 | 会话名称和元数据 |
| Message 插件 | 消息内容(用户、助手、工具) |
| Project 插件 | 项目目录和路径 |
插件注册在 src/plugins/ 中,可扩展以添加自定义搜索源。
命令面板
按 Cmd/Ctrl + K 打开命令面板——基于 cmdk 的界面,集搜索与快捷操作于一体:
- 按名称或内容搜索会话
- 切换视图(列表、项目、看板)
- 打开设置
- 切换终端
- 导航到任意会话
快捷键
| 快捷键 | 操作 |
|---|---|
Cmd/Ctrl + K | 打开命令面板 |
Cmd/Ctrl + F | 聚焦侧边栏搜索 |
Esc | 清除搜索 / 关闭面板 |