代码搜索

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"
  }
}

返回结果包含:

正则表达式搜索

搜索所有以 Handle 开头的导出函数

AI 使用正则模式:

{
  "tool": "search_files",
  "args": {
    "query": "func Handle[A-Z]\\w*\\(",
    "regex": true
  }
}

文件名搜索

找到所有的 test 文件
{
  "tool": "search_files",
  "args": {
    "query": "_test.go",
    "target": "files"
  }
}

搜索参数

参数类型说明
querystring搜索查询字符串
targetstringcontent(默认)/ files / symbols
regexbool是否使用正则表达式
pathstring限定搜索范围的目录路径
includestring文件名包含模式(如 *.go)
excludestring文件名排除模式(如 *_test.go)
max_resultsint最大返回结果数

搜索技巧

  1. 缩小范围:使用 path 和 include 参数限定搜索范围
  2. 排除测试:使用 exclude: "*_test.go" 排除测试文件
  3. 正则灵活性:复杂模式用正则表达式,简单关键词用纯文本
  4. 符号优先:查找函数/类型名时优先使用 target: symbols

CKG 结构化搜索

CKG(代码知识图谱)提供超越文本搜索的结构化查询能力。

符号搜索

CKG 中的符号包含丰富的元数据:

找到 UserService 结构体的所有方法

CKG 可以精确返回:

而文本搜索 UserService 可能返回大量无关的引用。

调用者搜索

哪些函数调用了 validateInput?

CKG 通过调用图直接返回所有调用者,无需扫描全部文件。

被调用者搜索

processOrder 函数内部调用了哪些其他函数?

CKG 返回从 processOrder 出发的所有调用边。

影响分析

如果我修改了 database.Connect 函数,会影响哪些模块?

CKG 沿调用图向上追溯,找出所有直接和间接依赖者。


跨文件引用查找

导入引用

哪些文件导入了 internal/auth 包?

AI 结合 CKG 和文本搜索,精确列出所有导入该包的文件。

类型引用

AuthToken 类型在哪些地方被使用?

CKG 能区分:

跨包引用

对于 Go 项目,CKG 支持跨包的引用查找:

找到所有实现了 io.Reader 接口的类型

语义搜索

基于 Knowledge 的搜索

如果项目配置了知识库(Knowledge),搜索能力进一步增强:

找到处理用户认证的代码

即使代码中没有"认证"这个词,语义搜索也能通过理解代码功能找到相关文件:

CKG HoverProvider

在编辑器中,CKG 提供增强的悬停信息:

CodeLens 增强

CKG 的 CodeLens 在函数定义上方显示引用计数:

▶ 12 references | 3 callers | 5 callees
func ProcessOrder(ctx context.Context, order *Order) error {

点击可以展开详细列表。


使用示例

示例 1:定位 Bug

用户反馈说注册接口偶尔返回 500 错误,帮我找到可能出问题的代码

AI 的搜索策略:

  1. search_files "register" target=symbols — 找到注册相关函数
  2. search_files "panic\|fatal\|500" path=handler/ — 搜索错误处理代码
  3. 通过 CKG 追踪注册流程的完整调用链
  4. 分析每个环节的错误处理是否完善

示例 2:理解模块结构

帮我理解 internal/payment 模块的结构和主要接口

AI 的搜索策略:

  1. search_files target=files path=internal/payment/ — 列出所有文件
  2. search_files target=symbols path=internal/payment/ — 列出所有导出符号
  3. 通过 CKG 分析内部调用关系
  4. 生成模块结构概要

示例 3:重构准备

我想把 utils.FormatDate 函数从 utils 包移到 timeutil 包,帮我找到所有需要修改的地方

AI 的搜索策略:

  1. CKG 查找 FormatDate 的所有调用者
  2. search_files "utils.FormatDate" 确认文本引用
  3. search_files '"internal/utils"' include=*.go 检查导入语句
  4. 列出完整的修改清单

搜索性能

大型项目优化

项目规模文本搜索耗时CKG 搜索耗时
< 1,000 文件< 1 秒< 0.1 秒
1,000 - 10,000 文件1-5 秒< 0.5 秒
> 10,000 文件5-15 秒< 1 秒

CKG 搜索基于预构建的 SQLite FTS5 索引,速度远快于实时文本扫描。

搜索结果缓存


注意事项

  1. CKG 索引未完成时:结构化搜索可能不完整,文本搜索不受影响
  2. 二进制文件:搜索自动排除二进制文件和 node_modules 等目录
  3. 大文件:超过 1MB 的文件不会被 CKG 索引,但仍可被文本搜索找到
  4. 编码问题:搜索默认使用 UTF-8 编码,非 UTF-8 文件可能搜索不到