# FTS5 全文搜索 SUMMARY: Synapse 如何使用 SQLite FTS5 实现亚毫秒级的全文记忆搜索。 FTS5 全文搜索 Synapse 使用 FTS5(Full-Text Search 5)实现快速、灵活的记忆搜索。本页介绍其工作原理以及如何高效使用。 什么是 FTS5? FTS5 是一个 SQLite 扩展(也可通过扩展在 PostgreSQL 中使用),提供全文搜索能力。它能够: - 为文本内容建立索引以实现快速关键词搜索 - 支持布尔运算符(AND、OR、NOT) - 支持用引号进行短语匹配 - 支持用 进行前缀匹配 - 按相关性对结果排序 Synapse 使用 FTS5 为所有记忆内容建立索引,可在数千条记忆上实现亚毫秒级搜索。 Synapse 如何使用 FTS5 当你 时: 1. 记忆内容存储到 表 2. 内容也插入到 FTS5 虚拟表 3. FTS5 自动分词并建立索引 当你 时: 1. Synapse 使用 FTS5 语法解析查询 2. 对 FTS5 索引执行 3. 按 过滤(租户隔离) 4. 返回排序后的结果 查询语法 简单关键词搜索 [CODE BLOCK] 返回包含 "docker" 的记忆。 多关键词(隐式 AND) [CODE BLOCK] 返回同时包含 "docker" 和 "swarm" 的记忆。 短语匹配 [CODE BLOCK] 返回包含完整短语 "docker swarm" 的记忆。 前缀匹配 [CODE BLOCK] 返回包含以 "docker" 开头的词的记忆(例如 "dockers"、"dockerfile"、"dockerize")。 布尔 OR [CODE BLOCK] 返回包含 "docker" 或 "kubernetes" 的记忆。 布尔 NOT [CODE BLOCK] 返回包含 "docker" 但不包含 "swarm" 的记忆。 分组 [CODE BLOCK] 返回包含 "docker" 或 "kubernetes" 但不包含 "test" 的记忆。 实用示例 查找关于某个项目的记忆 [CODE BLOCK] 查找精确短语 [CODE BLOCK] 排除测试记忆 [CODE BLOCK] 按技术查找 [CODE BLOCK] 排序 FTS5 使用 BM25 算法按相关性排序。影响因素: - 词频(词条出现频率) - 逆文档频率(更稀有的词条排名更高) - 文档长度(包含该词条的较短文档排名更高) - 列权重(标题 > 内容) 结果按相关性返回(最相关的在前)。 性能 | 操作 | 延迟 | |-----------|---------| | 搜索 100 条记忆 | < 5ms | | 搜索 1,000 条记忆 | < 10ms | | 搜索 10,000 条记忆 | < 25ms | | 搜索 100,000 条记忆 | < 100ms | FTS5 针对读密集型工作负载做了高度优化。 局限性 词干提取 FTS5 默认不做词干提取。"running" 和 "run" 是不同的词条。 变通方案: 使用前缀匹配: 拼写容错 FTS5 不支持模糊匹配。拼写错误会返回零结果。 变通方案: 使用语义搜索()进行概念匹配。 停用词 常见词(the、a、an、is)会被索引,但对搜索意义不大。FTS5 会自动处理。 FTS5 与语义搜索对比 | 方面 | FTS5 | 语义搜索 | |--------|------|-----------------| | 速度 | 亚毫秒级 | 50-100ms | | 匹配方式 | 精确关键词 | 概念 | | 拼写容错 | 无 | 一定程度 | | 词干提取 | 无 | 隐式 | | 是否需要嵌入 | 否 | 是 | | 适合场景 | 具体术语 | 概念 | 当你知道关键词时使用 FTS5。当你想找“关于 X 的记忆”且 X 用不同方式描述时,使用语义搜索。 最佳实践 > [!TIP] > - 使用具体术语 — "docker swarm" 优于 "container orchestration" > - 为短语加引号 — 确保短语匹配 > - 用前缀覆盖变体 — 可捕获 "deploy"、"deployment"、"deploying" > - 排除噪声 — 过滤掉测试记忆 > - 结合标签 — 缩小结果范围 下一步 - 语义搜索 - Memory API - 记忆最佳实践