search-syntax-pro/docs/search-engines/github.md
Zain feaf3ef7de feat(search): 新增多个搜索引擎适配器及文档
- 添加 DuckDuckGo、Brave、Yandex、Reddit、GitHub 和 StackOverflow 适配器
- 实现动态语言选择器功能
- 更新搜索引擎类型定义和国际化翻译
- 添加详细的搜索引擎文档和语法参考
2025-11-10 08:56:29 +08:00

759 行
15 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# GitHub 搜索引擎适配器文档
## 📋 基本信息
| 属性 | 值 |
|------|-----|
| **引擎名称** | GitHub Code Search |
| **官方网站** | https://github.com/search |
| **市场定位** | 代码搜索与开发者协作平台 |
| **注册用户** | 1亿+ 开发者 |
| **仓库数量** | 4亿+ 公开仓库 |
| **主要用户群** | 开发者、技术研究者、学习者 |
| **优先级** | **P2 (低)** |
| **实施复杂度** | 🔴 高 |
| **预计工期** | 3-4天 |
## 🎯 产品价值
### 用户价值
- ✅ **代码搜索**: 在海量开源代码中精准搜索
- ✅ **技术学习**: 查看优秀项目的实现方式
- ✅ **问题解决**: 找到相似问题的解决方案
- ✅ **开源发现**: 发现优质开源项目和库
### 业务价值
- 👨‍💻 吸引开发者用户群
- 🎯 专业工具定位
- 💡 差异化技术搜索
- 🏆 提升产品专业性
## 🔍 支持的搜索语法
### 1. 代码搜索
#### 1.1 基础代码搜索
```
关键词
```
**示例**:
```
useState
async function
class Component
```
**说明**: 搜索代码中的函数、类、变量等
---
#### 1.2 精确匹配 (`"..."`)
```
"完整代码片段"
```
**示例**:
```
"import React from 'react'"
"function useState"
```
---
#### 1.3 语言筛选 (`language:`)
```
关键词 language:语言
```
**示例**:
```
useState language:typescript
authentication language:python
API language:go
```
**常用语言**:
- `javascript`, `typescript`
- `python`, `java`, `go`
- `rust`, `c`, `cpp`
- `ruby`, `php`, `swift`
---
#### 1.4 文件路径筛选 (`path:`)
```
关键词 path:路径
```
**示例**:
```
useState path:src/hooks
config path:**/test/**
API path:api/
```
**说明**:
- 支持通配符 `*` 和 `**`
- `**` 匹配任意层级目录
---
#### 1.5 文件名筛选 (`filename:`)
```
关键词 filename:文件名
```
**示例**:
```
useState filename:useAuth
config filename:package.json
API filename:*.test.ts
```
---
### 2. 仓库筛选
#### 2.1 仓库搜索 (`repo:`)
```
关键词 repo:用户/仓库
```
**示例**:
```
useState repo:facebook/react
config repo:vercel/next.js
```
**说明**: 限定在特定仓库内搜索
---
#### 2.2 组织筛选 (`org:`)
```
关键词 org:组织名
```
**示例**:
```
authentication org:google
framework org:facebook
```
**说明**: 搜索特定组织的所有仓库
---
#### 2.3 用户筛选 (`user:`)
```
关键词 user:用户名
```
**示例**:
```
tutorial user:torvalds
project user:gvanrossum
```
**说明**: 搜索特定用户的仓库
---
### 3. 仓库属性筛选
#### 3.1 Star数筛选 (`stars:`)
```
关键词 stars:>数量
关键词 stars:范围
```
**示例**:
```
React stars:>10000
Vue stars:1000..5000
framework stars:>=1000
```
**支持的运算符**:
- `>`, `>=` - 大于/大于等于
- `<`, `<=` - 小于/小于等于
- `..` - 范围
---
#### 3.2 Fork数筛选 (`forks:`)
```
关键词 forks:>数量
```
**示例**:
```
framework forks:>100
library forks:50..200
```
---
#### 3.3 仓库大小筛选 (`size:`)
```
关键词 size:>大小
```
**示例**:
```
project size:<1000
library size:>5000
```
**说明**: 单位为KB
---
### 4. 时间筛选
#### 4.1 创建时间 (`created:`)
```
关键词 created:>日期
```
**示例**:
```
framework created:>2024-01-01
project created:2023-01-01..2024-01-01
```
---
#### 4.2 推送时间 (`pushed:`)
```
关键词 pushed:>日期
```
**示例**:
```
active project pushed:>2024-11-01
library pushed:<2023-01-01
```
**说明**: 筛选最近活跃的项目
---
### 5. 布尔运算符
#### 5.1 AND (默认)
```
关键词1 关键词2
```
**示例**:
```
React TypeScript hooks
```
---
#### 5.2 OR
```
关键词1 OR 关键词2
```
**示例**:
```
React OR Vue
Python OR JavaScript
```
---
#### 5.3 NOT (`-`)
```
关键词 -排除词
```
**示例**:
```
React -class
JavaScript -jQuery
```
---
### 6. 特殊功能
#### 6.1 符号搜索
```
symbol:符号名
```
**示例**:
```
symbol:useState
symbol:Component
```
**说明**: 搜索函数、类等符号定义
---
#### 6.2 扩展名筛选 (`extension:`)
```
关键词 extension:扩展名
```
**示例**:
```
config extension:json
API extension:ts
```
---
## 🔧 技术实现
### URL 构建格式
**基础URL**:
```
https://github.com/search
```
**查询参数**:
```typescript
interface GitHubSearchParams {
q: string; // 搜索查询
type: 'code' | 'repositories' | 'issues' | 'users';
l?: string; // 语言
s?: string; // 排序
o?: 'desc' | 'asc'; // 排序方向
}
```
**完整URL示例**:
```
https://github.com/search?q=useState+language%3Atypescript&type=code
```
### 适配器实现模板
```typescript
import type { SearchEngineAdapter, SearchParams, SyntaxType, ValidationResult, UIFeatureType } from '@/types'
/**
* GitHub 搜索引擎适配器
* 支持代码搜索和仓库发现
*/
export class GitHubAdapter implements SearchEngineAdapter {
getName(): string {
return 'GitHub'
}
getBaseUrl(): string {
return 'https://github.com/search'
}
/**
* 构建 GitHub 搜索查询 URL
*/
buildQuery(params: SearchParams): string {
const baseUrl = this.getBaseUrl()
const query = this.buildSearchQuery(params)
const urlParams = new URLSearchParams({
q: query,
type: 'code' // 默认搜索代码
})
return `${baseUrl}?${urlParams.toString()}`
}
/**
* 构建搜索查询字符串
*/
private buildSearchQuery(params: SearchParams): string {
const queryParts: string[] = []
// 1. 基础关键词
if (params.keyword && params.keyword.trim()) {
queryParts.push(params.keyword.trim())
}
// 2. 精确匹配
if (params.exactMatch && params.exactMatch.trim()) {
queryParts.push(`"${params.exactMatch.trim()}"`)
}
// 3. 仓库筛选 (使用site字段作为repo)
if (params.site && params.site.trim()) {
// 格式: user/repo 或 org/repo
queryParts.push(`repo:${params.site.trim()}`)
}
// 4. 语言筛选
if (params.language && params.language.trim()) {
queryParts.push(`language:${params.language.trim()}`)
}
// 5. 文件路径筛选
if (params.inUrl && params.inUrl.trim()) {
queryParts.push(`path:${params.inUrl.trim()}`)
}
// 6. 文件类型筛选
if (params.fileType && params.fileType.trim()) {
queryParts.push(`extension:${params.fileType.trim()}`)
}
// 7. 用户筛选
if (params.fromUser && params.fromUser.trim()) {
const user = params.fromUser.replace('@', '')
queryParts.push(`user:${user}`)
}
// 8. 日期范围 (使用pushed:)
if (params.dateRange) {
const { from, to } = params.dateRange
if (from && to) {
queryParts.push(`pushed:${from}..${to}`)
} else if (from) {
queryParts.push(`pushed:>${from}`)
} else if (to) {
queryParts.push(`pushed:<${to}`)
}
}
// 9. 排除关键词
if (params.excludeWords && params.excludeWords.length > 0) {
params.excludeWords.forEach(word => {
if (word.trim()) {
queryParts.push(`-${word.trim()}`)
}
})
}
// 10. OR 逻辑关键词
if (params.orKeywords && params.orKeywords.length > 0) {
const orQuery = params.orKeywords
.filter(word => word.trim())
.join(' OR ')
if (orQuery) {
queryParts.push(`(${orQuery})`)
}
}
return queryParts.join(' ')
}
/**
* 验证语法类型
*/
validateSyntax(syntax: SyntaxType): boolean {
const supportedSyntax: SyntaxType[] = [
'site', // 映射为 repo:
'exact',
'inurl', // 映射为 path:
'filetype', // 映射为 extension:
'exclude',
'or',
'from_user', // 映射为 user:
'lang', // 映射为 language:
'date_range' // 映射为 pushed:
]
return supportedSyntax.includes(syntax)
}
/**
* 获取支持的语法类型
*/
getSupportedSyntax(): SyntaxType[] {
return [
'site',
'exact',
'inurl',
'filetype',
'exclude',
'or',
'from_user',
'lang',
'date_range'
]
}
/**
* 获取支持的UI功能特性
*/
getSupportedFeatures(): UIFeatureType[] {
return [
'site', // 显示为"仓库"
'exact_match',
'inurl', // 显示为"文件路径"
'filetype', // 显示为"文件扩展名"
'exclude',
'or_keywords',
'from_user', // 显示为"用户/组织"
'language', // 显示为"编程语言"
'date_range' // 显示为"最后推送时间"
]
}
/**
* 验证搜索参数
*/
validateParams(params: SearchParams): ValidationResult {
const errors: string[] = []
const warnings: string[] = []
// 检查基本关键词
if (!params.keyword || !params.keyword.trim()) {
if (!params.exactMatch && !params.site) {
errors.push('请输入搜索关键词')
}
}
// 检查仓库格式
if (params.site && params.site.trim()) {
const repoPattern = /^[\w-]+\/[\w.-]+$/
if (!repoPattern.test(params.site.trim())) {
warnings.push('仓库格式应为: user/repo 或 org/repo')
}
}
// 检查语言
if (params.language && params.language.trim()) {
const validLangs = [
'javascript', 'typescript', 'python', 'java', 'go',
'rust', 'c', 'cpp', 'ruby', 'php', 'swift', 'kotlin'
]
if (!validLangs.includes(params.language.toLowerCase())) {
warnings.push(`语言 "${params.language}" 可能不被识别`)
}
}
return {
isValid: errors.length === 0,
errors,
warnings
}
}
/**
* 获取搜索建议
*/
getSearchSuggestions(params: SearchParams): string[] {
const suggestions: string[] = []
if (params.keyword && !params.language) {
suggestions.push('添加 language: 可以筛选特定编程语言')
}
if (params.keyword && !params.site) {
suggestions.push('使用 repo: 可以在特定仓库内搜索')
}
if (params.keyword && !params.inUrl) {
suggestions.push('使用 path: 可以限定文件路径')
}
return suggestions
}
}
```
---
## 📝 实施清单
### Phase 1: 核心功能 (Day 1-2)
- [ ] 创建 `src/services/adapters/github.ts`
- [ ] 实现 `GitHubAdapter` 类
- [ ] 实现基础代码搜索
- [ ] 实现语言和仓库筛选
- [ ] 单元测试
### Phase 2: 高级功能 (Day 2-3)
- [ ] 实现路径和扩展名筛选
- [ ] 实现用户/组织筛选
- [ ] 实现日期范围筛选
- [ ] 实现布尔运算符
- [ ] 参数验证
### Phase 3: UI集成 (Day 3-4)
- [ ] 字段映射配置
- [ ] 专用UI组件(编程语言选择器)
- [ ] 国际化翻译
- [ ] OAuth集成(可选,用于高级功能)
- [ ] 完整测试
---
## ✅ 测试用例
```typescript
describe('GitHubAdapter', () => {
const adapter = new GitHubAdapter()
test('基础代码搜索', () => {
const url = adapter.buildQuery({
keyword: 'useState',
engine: 'github'
})
expect(url).toContain('q=useState')
expect(url).toContain('type=code')
})
test('语言筛选', () => {
const url = adapter.buildQuery({
keyword: 'useState',
language: 'typescript',
engine: 'github'
})
expect(url).toContain('language%3Atypescript')
})
test('仓库筛选', () => {
const url = adapter.buildQuery({
keyword: 'hooks',
site: 'facebook/react',
engine: 'github'
})
expect(url).toContain('repo%3Afacebook%2Freact')
})
test('路径和扩展名', () => {
const url = adapter.buildQuery({
keyword: 'config',
inUrl: 'src/',
fileType: 'ts',
engine: 'github'
})
expect(url).toContain('path%3Asrc%2F')
expect(url).toContain('extension%3Ats')
})
test('组合查询', () => {
const url = adapter.buildQuery({
keyword: 'authentication',
language: 'python',
site: 'django/django',
excludeWords: ['deprecated'],
engine: 'github'
})
expect(url).toContain('language%3Apython')
expect(url).toContain('repo%3Adjango%2Fdjango')
expect(url).toContain('-deprecated')
})
})
```
---
## 🌍 国际化支持
```json
{
"engines.github": "GitHub",
"engines.github.description": "全球最大的代码托管和搜索平台",
"engines.github.features": {
"repo": "仓库筛选",
"language": "编程语言",
"path": "文件路径",
"extension": "文件扩展名",
"user": "用户/组织",
"pushed": "最后推送时间"
},
"engines.github.labels": {
"site": "仓库 (user/repo)",
"language": "编程语言",
"inUrl": "文件路径",
"fileType": "文件扩展名",
"fromUser": "用户/组织",
"dateRange": "最后推送时间"
},
"engines.github.placeholders": {
"site": "例如: facebook/react",
"language": "例如: typescript",
"inUrl": "例如: src/hooks/",
"fromUser": "例如: torvalds"
}
}
```
---
## 🎨 UI特殊处理
### 编程语言选择器
```typescript
const PROGRAMMING_LANGUAGES = [
{ value: 'javascript', label: 'JavaScript' },
{ value: 'typescript', label: 'TypeScript' },
{ value: 'python', label: 'Python' },
{ value: 'java', label: 'Java' },
{ value: 'go', label: 'Go' },
{ value: 'rust', label: 'Rust' },
{ value: 'cpp', label: 'C++' },
{ value: 'c', label: 'C' },
{ value: 'ruby', label: 'Ruby' },
{ value: 'php', label: 'PHP' },
{ value: 'swift', label: 'Swift' },
{ value: 'kotlin', label: 'Kotlin' }
]
```
### 字段映射
| 通用字段 | GitHub语法 | UI标签 |
|---------|-----------|--------|
| `site` | `repo:` | 仓库 |
| `language` | `language:` | 编程语言 |
| `inUrl` | `path:` | 文件路径 |
| `fileType` | `extension:` | 文件扩展名 |
| `fromUser` | `user:` 或 `org:` | 用户/组织 |
---
## 📚 参考资源
### 官方文档
- [GitHub Code Search](https://docs.github.com/en/search-github/searching-on-github)
- [GitHub Search Syntax](https://docs.github.com/en/search-github/getting-started-with-searching-on-github/understanding-the-search-syntax)
- [GitHub Advanced Search](https://github.com/search/advanced)
---
## ⚠️ 注意事项
### API限制
- 未认证用户: 10次/分钟
- 认证用户: 30次/分钟
- 建议: 添加OAuth认证提升限额
### OAuth集成(可选)
```typescript
// 可选的OAuth认证
interface GitHubOAuthConfig {
clientId: string
scope: 'repo' | 'public_repo'
}
// 认证后可以访问私有仓库
async function authenticateGitHub() {
// OAuth flow implementation
}
```
---
## 🔄 更新日志
| 日期 | 版本 | 更新内容 |
|------|------|---------|
| 2025-11-09 | v1.0 | 初始文档创建,包含代码搜索语法 |
---
**下一步**: 查看 [Stack Overflow 文档](./stackoverflow.md) 了解技术问答搜索引擎的实现细节