代码搜索
wescode 提供多层次的代码搜索能力,从基础的文本搜索到 CKG 驱动的结构化语义搜索,帮助 AI 和用户在大型代码库中精准定位目标代码。
搜索工具概览
wescode 的代码搜索基于 search_files 工具,并结合 CKG(代码知识图谱)提供增强搜索能力:
| 搜索方式 | 工具 | 适用场景 |
|---|---|---|
| 文本搜索 | search_files | 关键词、正则表达式匹配 |
| 符号搜索 | search_files target='symbols' | 函数名、类型名精确查找 |
| 文件搜索 | search_files target='files' | 按文件名模式查找 |
| 结构化搜索 | CKG 查询 | 调用关系、依赖分析 |
| 语义搜索 | CKG + Knowledge | 基于含义而非字面的搜索 |
search_files 工具
基本用法
search_files 是 AI 在对话中搜索代码的主要工具。
文本搜索
请搜索项目中所有使用了 fmt.Errorf 的位置
AI 会调用:
{
"tool": "search_files",
"args": {
"query": "fmt.Errorf",
"target": "content"
}
}
返回结果包含:
- 匹配的文件路径
- 匹配行的行号和内容
- 上下文行(前后各 2 行)
正则表达式搜索
搜索所有以 Handle 开头的导出函数
AI 使用正则模式:
{
"tool": "search_files",
"args": {
"query": "func Handle[A-Z]\\w*\\(",
"regex": true
}
}
文件名搜索
找到所有的 test 文件
{
"tool": "search_files",
"args": {
"query": "_test.go",
"target": "files"
}
}
搜索参数
| 参数 | 类型 | 说明 |
|---|---|---|
query | string | 搜索查询字符串 |
target | string | content(默认)/ files / symbols |
regex | bool | 是否使用正则表达式 |
path | string | 限定搜索范围的目录路径 |
include | string | 文件名包含模式(如 *.go) |
exclude | string | 文件名排除模式(如 *_test.go) |
max_results | int | 最大返回结果数 |
搜索技巧
- 缩小范围:使用
path和include参数限定搜索范围 - 排除测试:使用
exclude: "*_test.go"排除测试文件 - 正则灵活性:复杂模式用正则表达式,简单关键词用纯文本
- 符号优先:查找函数/类型名时优先使用
target: symbols
CKG 结构化搜索
CKG(代码知识图谱)提供超越文本搜索的结构化查询能力。
符号搜索
CKG 中的符号包含丰富的元数据:
找到 UserService 结构体的所有方法
CKG 可以精确返回:
UserService.CreateUserService.UpdateUserService.DeleteUserService.FindByID
而文本搜索 UserService 可能返回大量无关的引用。
调用者搜索
哪些函数调用了 validateInput?
CKG 通过调用图直接返回所有调用者,无需扫描全部文件。
被调用者搜索
processOrder 函数内部调用了哪些其他函数?
CKG 返回从 processOrder 出发的所有调用边。
影响分析
如果我修改了 database.Connect 函数,会影响哪些模块?
CKG 沿调用图向上追溯,找出所有直接和间接依赖者。
跨文件引用查找
导入引用
哪些文件导入了 internal/auth 包?
AI 结合 CKG 和文本搜索,精确列出所有导入该包的文件。
类型引用
AuthToken 类型在哪些地方被使用?
CKG 能区分:
- 定义处:类型声明的位置
- 使用处:作为参数、返回值、字段类型等
- 实现处:实现了该接口的具体类型
跨包引用
对于 Go 项目,CKG 支持跨包的引用查找:
找到所有实现了 io.Reader 接口的类型
语义搜索
基于 Knowledge 的搜索
如果项目配置了知识库(Knowledge),搜索能力进一步增强:
找到处理用户认证的代码
即使代码中没有"认证"这个词,语义搜索也能通过理解代码功能找到相关文件:
auth/middleware.go— JWT 验证中间件handler/login.go— 登录处理器service/token.go— Token 生成和验证
CKG HoverProvider
在编辑器中,CKG 提供增强的悬停信息:
- 鼠标悬停在函数名上,显示调用者数量和被调用者列表
- 悬停在类型上,显示实现者和使用者统计
- 悬停在导入路径上,显示包内导出符号概要
CodeLens 增强
CKG 的 CodeLens 在函数定义上方显示引用计数:
▶ 12 references | 3 callers | 5 callees
func ProcessOrder(ctx context.Context, order *Order) error {
点击可以展开详细列表。
使用示例
示例 1:定位 Bug
用户反馈说注册接口偶尔返回 500 错误,帮我找到可能出问题的代码
AI 的搜索策略:
search_files "register" target=symbols— 找到注册相关函数search_files "panic\|fatal\|500" path=handler/— 搜索错误处理代码- 通过 CKG 追踪注册流程的完整调用链
- 分析每个环节的错误处理是否完善
示例 2:理解模块结构
帮我理解 internal/payment 模块的结构和主要接口
AI 的搜索策略:
search_files target=files path=internal/payment/— 列出所有文件search_files target=symbols path=internal/payment/— 列出所有导出符号- 通过 CKG 分析内部调用关系
- 生成模块结构概要
示例 3:重构准备
我想把 utils.FormatDate 函数从 utils 包移到 timeutil 包,帮我找到所有需要修改的地方
AI 的搜索策略:
- CKG 查找
FormatDate的所有调用者 search_files "utils.FormatDate"确认文本引用search_files '"internal/utils"' include=*.go检查导入语句- 列出完整的修改清单
搜索性能
大型项目优化
| 项目规模 | 文本搜索耗时 | CKG 搜索耗时 |
|---|---|---|
| < 1,000 文件 | < 1 秒 | < 0.1 秒 |
| 1,000 - 10,000 文件 | 1-5 秒 | < 0.5 秒 |
| > 10,000 文件 | 5-15 秒 | < 1 秒 |
CKG 搜索基于预构建的 SQLite FTS5 索引,速度远快于实时文本扫描。
搜索结果缓存
- CKG 查询结果在当前会话内缓存
- 文本搜索结果不缓存(每次实时执行)
- 文件变更后 CKG 缓存自动失效
注意事项
- CKG 索引未完成时:结构化搜索可能不完整,文本搜索不受影响
- 二进制文件:搜索自动排除二进制文件和
node_modules等目录 - 大文件:超过 1MB 的文件不会被 CKG 索引,但仍可被文本搜索找到
- 编码问题:搜索默认使用 UTF-8 编码,非 UTF-8 文件可能搜索不到