全文检索客户(MiniSearch)
灵感:能力工具箱 minisearch-ft(pkg: minisearch)。
在浏览器内对客户名、公司、跟进笔记建立倒排索引并全文搜索,适合「笔记里提过某某产品」这类关键词检索;与 Fuse 模糊搜互补。
何时使用
- 要搜跟进笔记正文,不只搜客户名
- 本地演示数据 / 已拉取到前端的客户集
- 需要前缀、多字段加权,又不想上服务端 ES
硬约束
- 依赖
minisearch;索引与查询均在本地完成。 - 文档需稳定
id;字段至少含name,建议含company、notes(跟进合并文本)。 - 数据变更时
add/replace/discard,避免全量傻重建(列表很大时可重建但要提示)。 - 空查询返回空数组或全量策略写清楚;默认空查询不返回海量。
- 不把索引上传第三方;不与 Fuse 混为同一封装(可并存:名用 Fuse,笔记用 MiniSearch)。
推荐实现要点
import MiniSearch from 'minisearch'
export type CustDoc = {
id: string
name: string
company?: string
notes?: string
}
export function createCustomerSearch(docs: CustDoc[]) {
const mini = new MiniSearch<CustDoc>({
fields: ['name', 'company', 'notes'],
storeFields: ['name', 'company'],
searchOptions: {
boost: { name: 3, company: 2, notes: 1 },
prefix: true,
fuzzy: 0.1,
},
})
mini.addAll(docs)
return {
search(q: string, limit = 20) {
const query = q.trim()
if (!query) return [] as Array<{ id: string; name: string; company?: string }>
return mini.search(query).slice(0, limit).map((r) => ({
id: String(r.id),
name: String(r.name),
company: r.company as string | undefined,
}))
},
upsert(doc: CustDoc) {
if (mini.has(doc.id)) mini.replace(doc)
else mini.add(doc)
},
remove(id: string) {
if (mini.has(id)) mini.discard(id)
},
}
}
Agent 步骤
- 安装
minisearch,封装createCustomerSearch。 - 客户列表加载后
addAll;保存跟进后upsert更新notes。 - 自测:笔记含「报价」能搜到;改名后旧词不再命中。
与 fuse-local-search
| Fuse | MiniSearch | |
|---|---|---|
| 擅长 | 短字段模糊、容错 | 多字段全文、笔记关键词 |
| 典型 | 客户名快速筛选 | 「笔记里提过合同」 |
附加
- README.md · reference.md · templates/usage.md