项目地址: github.com/qtopie/sniphunt
在处理大规模代码库或海量文本数据时,搜索效率往往是开发者最头疼的问题。Sniphunt 是一个专为高性能而设计的 Go 语言搜索库,它不仅支持像 ripgrep 一样飞快的正则表达式搜索,还提供了基于相似度的代码片段匹配功能。
为什么选择 Sniphunt?
市面上已经有很多搜索工具,但 Sniphunt 的核心优势在于库化 (Library-first) 和 极致的性能优化。
1. 极致的性能设计
Sniphunt 采用了生产者-消费者模型,将文件遍历与内容匹配完全解耦:
- 快速遍历:集成
godirwalk,比标准库的filepath.Walk快数倍,显著减少系统调用。 - 并发匹配:利用 Go 的协程池 (Worker Pool),自动适配 CPU 核心数,压榨每一分硬件性能。
- 零拷贝与缓冲区复用:通过
sync.Pool复用读取缓冲区,极大降低了大规模搜索时的 GC (垃圾回收) 压力。 - 字面量预过滤:在执行复杂的正则匹配前,先进行高速的字符串字面量扫描,非匹配行直接跳过。
2. 双模搜索
- 正则搜索:支持高性能的行匹配,适用于寻找特定代码模式、TODO 标记或 API 调用。
- 相似度搜索:利用 Levenshtein 距离算法,输入一段代码片段,快速在库中找到最相似的文件。
安装 Sniphunt
命令行工具安装
如果你需要一个现成的工具来替换你的基础搜索命令:
go install github.com/qtopie/sniphunt/cmd/sniphunt@latest
作为库引入项目
如果你想在你的 Go 应用中集成高性能搜索能力:
go get github.com/qtopie/sniphunt
经典用法示例
命令行用法
在所有 Go 文件中搜索 main 函数:
sniphunt -pattern "func.*main" -dir . -ext .go
寻找最接近的代码片段:
sniphunt -input target.java -dir ./src -ext .java
代码集成示例
package main
import (
"context"
"fmt"
"github.com/qtopie/sniphunt/pkg/search"
)
func main() {
s := search.NewSearcher()
s.Extensions = []string{".go"}
ctx := context.Background()
// 启动流式搜索
matchChan, errChan := s.Search(ctx, ".", "func.*main")
for match := range matchChan {
fmt.Printf("找到匹配: %s:%d\n", match.Path, match.LineNum)
}
}
项目结构
Sniphunt 遵循清晰的工程布局,方便二次开发:
cmd/sniphunt: 命令行工具入口。pkg/search: 搜索核心逻辑与并发框架。pkg/similarity: 相似度计算算法。
结语
Sniphunt 不仅仅是一个搜索工具,它更是一个高性能的底层组件。无论你是想构建自己的代码分析工具,还是需要处理海量日志数据,Sniphunt 都能为你提供坚实的基础。
👉 欢迎到 GitHub 提交 Issue 或 Star 支持:github.com/qtopie/sniphunt