Loading...
正在加载...
请稍候

YaCy.Uno 设计方案

✨步子哥 (steper) 2026年02月17日 08:34
> 基于 Uno Platform (C#/.NET 9) 的去中心化 P2P 搜索引擎 > 兼容 YaCy 协议,跨平台运行(Windows / macOS / Linux / WebAssembly / iOS / Android) --- ## 一、项目概述 ### 1.1 项目定位 YaCy.Uno 是 YaCy 去中心化搜索引擎的 **Uno Platform (C#)** 实现版本。它将: - **完全兼容** YaCy P2P 协议(可与 Java/Go 版本节点互通) - 采用 **Uno Platform 5.x + .NET 9** 实现真正的跨平台 - 提供 **Material Design 3** 风格的现代 UI - 支持 **WebAssembly / Desktop / Mobile** 多目标平台 - 拥抱 .NET 开源生态,充分利用高性能库 ### 1.2 命名与端口 | 项目 | 值 | |------|-----| | 名称 | YaCy.Uno | | 默认端口 | **8900** (HTTP) / **8943** (HTTPS) | | 网络名称 | `freeworld`(与 Java/Go YaCy 同网络) | | 协议兼容 | YaCy P2P Protocol v1 | ### 1.3 与其他版本对比 | 特性 | Java YaCy | YaCy-Go | **YaCy.Uno** | |------|-----------|---------|-------------| | 语言 | Java 8+ | Go 1.25 | **C# / .NET 9** | | UI框架 | JSP/Servlet | go-app WASM | **Uno Platform (XAML)** | | 搜索引擎 | Solr + Kelondro | SQLite FTS5 | **SQLite FTS5** | | HTTP框架 | Jetty | Fiber | **ASP.NET Core Kestrel** | | P2P端口 | 8090 | 8899 | **8900** | | 跨平台 | JVM | 原生编译 | **.NET 跨平台** | | 移动端 | ❌ | ❌ | **✅ iOS/Android** | | WASM | ❌ | ✅ (go-app) | **✅ (Uno WASM)** | | TUI | ❌ | ✅ (Bubble Tea) | **✅ (Spectre.Console)** | --- ## 二、技术架构 ### 2.1 总体架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ YaCy.Uno Application │ ├─────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌───────────────────┐ │ │ │ Uno Platform│ │ ASP.NET Core │ │ Spectre.Console │ │ │ │ XAML UI │ │ Web API │ │ TUI │ │ │ │ (Desktop/ │ │ (REST/SSE/ │ │ (Terminal Client) │ │ │ │ WASM/ │ │ WebSocket) │ │ │ │ │ │ Mobile) │ │ │ │ │ │ │ └──────┬───────┘ └──────┬───────┘ └───────┬───────────┘ │ │ │ │ │ │ │ ┌──────┴─────────────────┴──────────────────┴───────────┐ │ │ │ Application Services │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │ │ │ │ │ Search │ │ Crawl │ │ P2P/DHT │ │ Index │ │ │ │ │ │ Service │ │ Service │ │ Service │ │ Service │ │ │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └─────┬─────┘ │ │ │ └───────┼────────────┼────────────┼─────────────┼───────┘ │ │ ┌───────┴────────────┴────────────┴─────────────┴───────┐ │ │ │ Core Engine │ │ │ │ ┌──────────────┐ ┌───────────┐ ┌──────────────────┐ │ │ │ │ │ SQLite FTS5 │ │ Document │ │ Protocol │ │ │ │ │ │ Full-Text │ │ Parsers │ │ (YaCy P2P compat)│ │ │ │ │ │ Index │ │ (30+) │ │ │ │ │ │ │ └──────┬───────┘ └───────────┘ └──────────────────┘ │ │ │ │ ┌──────┴────────────────────────────────────────────┐│ │ │ │ │ Storage Layer ││ │ │ │ │ SQLite (EF Core + FTS5) - 统一数据与索引存储 ││ │ │ │ └───────────────────────────────────────────────────┘│ │ │ └───────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 2.2 技术栈选型 #### 核心框架 | 组件 | 技术选型 | 版本 | 说明 | |------|---------|------|------| | **运行时** | .NET 9 | 9.0 | 最新 LTS,高性能 | | **UI 框架** | Uno Platform | 5.x | 跨平台 XAML UI | | **Web 服务** | ASP.NET Core | 9.0 | Kestrel 高性能 HTTP | | **全文搜索** | SQLite FTS5 | 内置 | 全文搜索虚拟表 | | **ORM/数据库** | EF Core + SQLite | 9.0 | 元数据存储 | | **DI 容器** | Microsoft.Extensions.DI | 9.0 | 内置依赖注入 | | **日志** | Serilog | 4.x | 结构化日志 | | **配置** | Microsoft.Extensions.Configuration | 9.0 | 多源配置 | #### 网络与通信 | 组件 | 技术选型 | 说明 | |------|---------|------| | **HTTP 客户端** | System.Net.Http + Polly | 带重试/熔断的 HTTP 客户端 | | **WebSocket** | System.Net.WebSockets | 内置 WebSocket 支持 | | **SSE** | 自实现 (IAsyncEnumerable) | 流式搜索结果 | | **P2P 网络** | 自实现 (兼容 YaCy 协议) | TCP/HTTP 混合 | | **DNS** | System.Net.Dns | 节点发现 | #### 文档解析 | 组件 | 技术选型 | 说明 | |------|---------|------| | **HTML 解析** | AngleSharp | 高性能 HTML5 解析器 | | **PDF 解析** | PdfPig | 纯 .NET PDF 文本提取 | | **Office** | NPOI / Open XML SDK | DOC/DOCX/XLS/PPT 解析 | | **XML/RSS** | System.Xml.Linq + SyndicationFeed | 内置 XML/RSS 解析 | | **中文分词** | jieba.NET | 中文全文搜索支持(ITextSegmenter + JiebaTextSegmenter,爬取入库前对含 CJK 正文分词后写入 FTS) | | **语言检测** | NTextCat | 语言识别 | #### UI 与体验 | 组件 | 技术选型 | 说明 | |------|---------|------| | **UI 框架** | Uno Platform 5.x | XAML 跨平台 | | **设计系统** | Uno.Material (Material Design 3) | MD3 控件和主题 | | **图标** | Uno.Material Icons | Material Symbols | | **图表** | LiveChartsCore / Uno.Toolkit | 统计可视化 | | **导航** | Uno.Extensions.Navigation | MVVM 导航 | | **状态管理** | CommunityToolkit.Mvvm | MVVM 源生成器 | | **TUI** | Spectre.Console | 终端命令行界面 | #### 测试 | 组件 | 技术选型 | 说明 | |------|---------|------| | **单元测试** | xUnit | 测试框架 | | **Mock** | NSubstitute | 模拟框架 | | **集成测试** | Microsoft.AspNetCore.Mvc.Testing | API 集成测试 | | **性能测试** | BenchmarkDotNet | 性能基准 | --- ## 三、项目结构 ``` yacy.uno/ ├── 设计方案.md # 本文档 ├── 研发计划.md # 开发计划 ├── README.md # 项目说明 ├── LICENSE # Apache 2.0 / LGPL ├── Directory.Build.props # 全局构建属性 ├── Directory.Packages.props # 中央包版本管理 ├── yacy.uno.sln # 解决方案文件 │ ├── src/ # 源代码 │ ├── YaCy.Uno.Core/ # 核心引擎库 (net9.0) │ │ ├── Models/ # 数据模型 │ │ │ ├── Document.cs # 文档模型 │ │ │ ├── Seed.cs # P2P 节点种子 │ │ │ ├── WordReference.cs # 词引用 (RWI) │ │ │ ├── CrawlProfile.cs # 爬取配置 │ │ │ ├── SearchResult.cs # 搜索结果 │ │ │ └── ... │ │ ├── Search/ # 搜索引擎 │ │ │ ├── SearchEngine.cs # 搜索引擎入口 │ │ │ ├── QueryParser.cs # 查询解析 │ │ │ ├── RankingEngine.cs # 排名算法 │ │ │ ├── SnippetGenerator.cs # 摘要生成 │ │ │ └── FederatedSearch.cs # 联邦搜索 │ │ ├── Index/ # 索引管理 │ │ │ ├── FtsIndexManager.cs # FTS5 索引管理器 │ │ │ ├── DocumentIndexer.cs # 文档索引器 │ │ │ └── RwiStore.cs # 反向词索引存储 (RWI) │ │ ├── Crawler/ # 网页爬虫 │ │ │ ├── CrawlEngine.cs # 爬虫引擎 │ │ │ ├── CrawlScheduler.cs # 爬取调度 │ │ │ ├── RobotsParser.cs # robots.txt 解析 │ │ │ ├── UrlQueue.cs # URL 队列 │ │ │ ├── HttpLoader.cs # HTTP 加载器 │ │ │ └── SitemapParser.cs # Sitemap 解析 │ │ ├── Parser/ # 文档解析器 │ │ │ ├── IDocumentParser.cs # 解析器接口 │ │ │ ├── HtmlParser.cs # HTML 解析 │ │ │ ├── PdfParser.cs # PDF 解析 │ │ │ ├── OfficeParser.cs # Office 解析 │ │ │ ├── RssParser.cs # RSS/Atom 解析 │ │ │ ├── XmlParser.cs # XML 解析 │ │ │ ├── PlainTextParser.cs # 纯文本解析 │ │ │ └── ParserFactory.cs # 解析器工厂 │ │ ├── P2P/ # P2P 网络 │ │ │ ├── Protocol/ # YaCy 协议实现 │ │ │ │ ├── HelloProtocol.cs # 握手协议 │ │ │ │ ├── SearchProtocol.cs # 远程搜索 │ │ │ │ ├── TransferProtocol.cs # 索引传输 │ │ │ │ └── SeedEncoding.cs # 种子编解码 │ │ │ ├── DHT/ # 分布式哈希表 │ │ │ │ ├── DHTManager.cs # DHT 管理 │ │ │ │ ├── DHTSelection.cs # DHT 节点选择 │ │ │ │ ├── DHTDispatcher.cs # DHT 分发 │ │ │ │ └── DHTTransmission.cs # DHT 传输 │ │ │ ├── Network/ # 网络管理 │ │ │ │ ├── PeerManager.cs # 节点管理 │ │ │ │ ├── SeedDB.cs # 种子数据库 │ │ │ │ ├── ConnectionManager.cs # 连接管理 │ │ │ │ └── Bootstrap.cs # 引导发现 │ │ │ └── Security/ # 安全 │ │ │ ├── CryptoHelper.cs # 加密工具 │ │ │ └── AuthManager.cs # 认证管理 │ │ ├── Storage/ # 存储层 │ │ │ ├── YaCyDbContext.cs # EF Core DbContext │ │ │ ├── IDocumentStore.cs # 文档存储接口 │ │ │ ├── SqliteDocumentStore.cs # SQLite 实现 │ │ │ └── Migrations/ # 数据库迁移 │ │ ├── Config/ # 配置 │ │ │ ├── YaCyConfig.cs # 配置模型 │ │ │ ├── NetworkConfig.cs # 网络配置 │ │ │ └── CrawlConfig.cs # 爬取配置 │ │ └── Utils/ # 工具类 │ │ ├── UrlUtils.cs # URL 工具 │ │ ├── HashUtils.cs # 哈希工具 │ │ ├── TextUtils.cs # 文本工具 │ │ └── Tokenizer.cs # 分词器 │ │ │ ├── YaCy.Uno.Server/ # Web API 服务 (ASP.NET Core) │ │ ├── Program.cs # 入口点 │ │ ├── Controllers/ # API 控制器 │ │ │ ├── SearchController.cs # 搜索 API │ │ │ ├── CrawlController.cs # 爬取 API │ │ │ ├── PeersController.cs # 节点 API │ │ │ ├── DhtController.cs # DHT API │ │ │ ├── StatsController.cs # 统计 API │ │ │ ├── ConfigController.cs # 配置 API │ │ │ ├── IndexController.cs # 索引管理 API │ │ │ └── YaCyProtocolController.cs# YaCy 协议兼容端点 │ │ ├── Hubs/ # SignalR Hub │ │ │ ├── SearchHub.cs # 搜索实时推送 │ │ │ └── CrawlHub.cs # 爬取状态推送 │ │ ├── Services/ # 后台服务 │ │ │ ├── CrawlBackgroundService.cs # 后台爬取 │ │ │ ├── P2PBackgroundService.cs # P2P 网络维护 │ │ │ └── DHTBackgroundService.cs # DHT 维护 │ │ ├── Middleware/ # 中间件 │ │ │ ├── AuthMiddleware.cs # 认证中间件 │ │ │ └── RateLimitMiddleware.cs # 限流中间件 │ │ └── appsettings.json # 应用配置 │ │ │ ├── YaCy.Uno.App/ # Uno Platform 桌面/WASM UI │ │ ├── App.xaml / App.xaml.cs # 应用入口 │ │ ├── MainWindow.xaml # 主窗口 │ │ ├── Views/ # 页面视图 │ │ │ ├── HeroPage.xaml # 首页 (搜索入口) │ │ │ ├── SearchPage.xaml # 搜索结果 │ │ │ ├── CrawlPage.xaml # 爬虫管理 │ │ │ ├── PeersPage.xaml # 节点列表 │ │ │ ├── DhtPage.xaml # DHT 统计 │ │ │ ├── StatsPage.xaml # 系统统计 │ │ │ ├── ConfigPage.xaml # 设置 │ │ │ └── HelpPage.xaml # 帮助 │ │ ├── ViewModels/ # MVVM ViewModel │ │ │ ├── HeroViewModel.cs │ │ │ ├── SearchViewModel.cs │ │ │ ├── CrawlViewModel.cs │ │ │ ├── PeersViewModel.cs │ │ │ ├── DhtViewModel.cs │ │ │ ├── StatsViewModel.cs │ │ │ ├── ConfigViewModel.cs │ │ │ └── MainViewModel.cs │ │ ├── Controls/ # 自定义控件 │ │ │ ├── SearchBar.xaml # 搜索栏 │ │ │ ├── SearchResultCard.xaml # 结果卡片 │ │ │ ├── NavigationDrawer.xaml # 导航抽屉 │ │ │ ├── StatusBar.xaml # 状态栏 │ │ │ └── NotificationStack.xaml # 通知栈 │ │ ├── Themes/ # 主题资源 │ │ │ ├── MaterialTheme.xaml # Material Design 3 │ │ │ ├── LightTheme.xaml # 亮色主题 │ │ │ └── DarkTheme.xaml # 暗色主题 │ │ ├── Services/ # UI 服务 │ │ │ ├── ApiClient.cs # REST API 客户端 │ │ │ ├── NavigationService.cs # 导航服务 │ │ │ └── ThemeService.cs # 主题切换 │ │ ├── Converters/ # 值转换器 │ │ ├── Strings/ # 国际化 │ │ │ ├── en/Resources.resw # English │ │ │ └── zh-CN/Resources.resw # 中文 │ │ └── Platforms/ # 平台特定代码 │ │ ├── Desktop/ # 桌面平台 │ │ ├── WebAssembly/ # WASM 平台 │ │ ├── iOS/ # iOS │ │ └── Android/ # Android │ │ │ └── YaCy.Uno.Cli/ # TUI 命令行客户端 │ ├── Program.cs # CLI 入口 │ ├── Commands/ # 命令定义 │ │ ├── SearchCommand.cs # yacy search <query> │ │ ├── CrawlCommand.cs # yacy crawl <url> │ │ ├── StatusCommand.cs # yacy status │ │ ├── PeersCommand.cs # yacy peers │ │ └── ServeCommand.cs # yacy serve │ └── UI/ # TUI 界面 │ └── DashboardView.cs # 仪表盘 │ ├── tests/ # 测试项目 │ ├── YaCy.Uno.Core.Tests/ # 核心库测试 │ ├── YaCy.Uno.Server.Tests/ # API 集成测试 │ └── YaCy.Uno.Benchmarks/ # 性能基准 │ ├── docs/ # 文档 │ ├── api.md # API 文档 │ ├── p2p-protocol.md # P2P 协议说明 │ └── deployment.md # 部署指南 │ └── docker/ # Docker 部署 ├── Dockerfile # Docker 构建 └── docker-compose.yml # Docker Compose ``` --- ## 四、核心模块设计 ### 4.1 搜索引擎 (Search Engine) #### 全文索引 — SQLite FTS5 采用 **SQLite FTS5** 作为全文搜索引擎,与 YaCy-Go 技术栈一致: ```sql -- FTS5 全文索引虚拟表 CREATE VIRTUAL TABLE documents_fts USING fts5( url_hash, -- 文档唯一标识 (UNSAFE not indexed) url, -- 原始 URL title, -- 标题 (高权重) description, -- 描述 content, -- 正文 (主搜索字段) host, -- 主域名 language, -- 语言 content_type, -- MIME 类型 tokenize = 'unicode61 porter', -- 多语言 + 词干提取 content = '', -- 无内容表关联 content_rowid = 'rowid' ); -- 元数据表(与 FTS 配合) CREATE TABLE documents ( rowid INTEGER PRIMARY KEY, url_hash TEXT UNIQUE NOT NULL, url TEXT NOT NULL, title TEXT, size INTEGER, crawl_date TEXT, last_modified TEXT, inbound_links INTEGER DEFAULT 0, outbound_links INTEGER DEFAULT 0, keywords TEXT, author TEXT ); ``` ```csharp // 索引字段常量(对应 FTS5 列) public static class IndexFields { public const string UrlHash = "url_hash"; public const string Url = "url"; public const string Title = "title"; public const string Description = "description"; public const string Content = "content"; public const string Host = "host"; public const string Language = "language"; public const string ContentType = "content_type"; } ``` #### 搜索流程 ``` 查询输入 → QueryParser (FTS5 语法解析) → SQLite FTS5 全文匹配 (bm25 排序) → 本地索引查询 → 并行: P2P 远程搜索 (DHT 目标节点) → 结果合并 (RankingEngine: BM25 + 入链/新鲜度因子) → SnippetGenerator (FTS5 highlight 高亮) → SSE/SignalR 流式输出 ``` #### 排名因子 | 因子 | 权重 | 说明 | |------|------|------| | BM25 文本相关性 | 40% | FTS5 内置 | | 标题匹配 | 20% | 标题中包含查询词 | | URL 深度 | 10% | 短 URL 优先 | | 入链数量 | 15% | 被引用越多排名越高 | | 内容新鲜度 | 10% | 新内容优先 | | 语言匹配 | 5% | 用户语言偏好 | ### 4.2 网页爬虫 (Crawler) ```csharp // 爬虫引擎架构 CrawlEngine ├── CrawlScheduler // 调度器(优先级队列 + 域名频率限制) ├── UrlQueue // URL 队列(SQLite 持久化) ├── HttpLoader // HTTP 加载器(HttpClient + Polly 重试) ├── RobotsParser // robots.txt 遵守 ├── SitemapParser // Sitemap 发现 ├── ContentExtractor // 内容提取(AngleSharp) ├── ParserPipeline // 解析器管道(HTML→PDF→Office→...) └── IndexSubmitter // 索引提交(→ FTS5 + DHT 分发) ``` **特性:** - 多工作者并行爬取(`Channel<T>` + `Task` 并行模型) - 域名级别频率限制(Polite crawling) - robots.txt / meta robots 遵守 - 可配置爬取深度、广度、文件类型过滤 - 增量爬取 / 条件抓取(If-Modified-Since / ETag) - 爬取状态实时推送(SignalR / SSE) ### 4.3 P2P 网络 (P2P Network) #### 协议兼容性 完全实现以下 YaCy 协议端点(兼容 Java YaCy 和 Go YaCy): | 端点 | 方法 | 功能 | |------|------|------| | `/yacy/hello` | GET/POST | P2P 握手 / 节点发现 | | `/yacy/search` | POST | 远程搜索 | | `/yacy/seedlist` | GET | 种子节点列表 | | `/yacy/transferRWI` | POST | 反向词索引传输(已实现:接收 JSON { word, docRefs };RwiIndexTransferService 向对等节点推送) | | `/yacy/transferURL` | POST | URL 元数据传输 | | `/yacy/crawlReceipt` | GET/POST | 爬取确认 | | `/yacy/query` | GET/POST | 查询 | | `/yacy/profile` | GET | 节点资料 | | `/yacy/idx.json` | GET | 索引信息 | | `/yacy/message` | POST | 节点消息 | #### DHT 实现 ``` DHT 设计: - 分区数: 256 (2^8) - 冗余因子: 3 (senior 节点) - 分区算法: 词哈希 → 节点哈希 → 最近节点选择 - 索引分发: 后台定时分发到目标节点 ``` #### 节点类型 | 类型 | 条件 | 说明 | |------|------|------| | virgin | 刚启动 | 未加入网络 | | junior | 有 NAT | 无法接受入站连接 | | senior | 公网 IP | 可接受入站 + 出站 | | principal | senior + 高可用 | 提供种子列表服务 | ### 4.4 文档解析器 (Document Parsers) ```csharp public interface IDocumentParser { string[] SupportedMimeTypes { get; } int Priority { get; } Task<ParsedDocument> ParseAsync(Stream content, string mimeType, Uri sourceUrl, CancellationToken ct); } ``` **支持的格式(优先级排序):** | 解析器 | 格式 | NuGet 包 | |--------|------|----------| | HtmlParser | HTML/XHTML | AngleSharp | | PdfParser | PDF | UglyToad.PdfPig | | OfficeParser | DOCX/XLSX/PPTX | DocumentFormat.OpenXml | | LegacyOfficeParser | DOC/XLS/PPT | NPOI | | RssParser | RSS/Atom | System.ServiceModel.Syndication | | XmlParser | XML/SVG | System.Xml.Linq | | JsonParser | JSON/JSON-LD | System.Text.Json | | PlainTextParser | TXT/CSV/MD | 内置 | | ImageParser | JPEG/PNG (EXIF) | MetadataExtractor | ### 4.5 存储层 (Storage) #### 双存储架构 ``` 存储层: ├── SQLite (EF Core + FTS5) → 统一数据与索引存储 │ ├── documents → 文档元数据表 │ ├── documents_fts → FTS5 全文索引 (虚拟表) │ ├── rwi_terms → 反向词索引 (RWI) │ ├── seeds → 节点种子表 │ ├── crawl_queue → 爬取队列表 │ ├── crawl_profiles → 爬取配置表 │ ├── bookmarks → 书签表 │ ├── blacklist → 黑名单表 │ └── config → 配置表 └── 文件系统 ├── data/yacy.db → SQLite 数据库文件 (含 FTS5 索引) ├── data/log/ → 日志文件 └── data/export/ → 导出文件 ``` --- ## 五、API 设计 ### 5.1 REST API 端点 完全对标 YaCy-Go 的 API 设计,确保生态兼容: #### 搜索 API ``` GET /api/search?q={query}&offset={0}&limit={10}&lang={all} GET /api/search/stream?q={query} # SSE 流式 GET /api/search/async # 异步搜索 GET /api/suggest?q={prefix} # 搜索建议 ``` #### 爬取 API ``` POST /api/crawl # 提交爬取任务 GET /api/crawl/status # 爬取状态 GET /api/crawl/history # 爬取历史 POST /api/crawl/pause # 暂停 POST /api/crawl/resume # 恢复 POST /api/crawl/abort # 中止 ``` #### 节点 API ``` GET /api/peers # 节点列表 GET /api/peers/stats # 节点统计 POST /api/peers/connect # 连接节点 ``` #### DHT API ``` GET /api/dht/stats # DHT 统计 GET /api/dht/distribution/stats # 分布统计 ``` #### 管理 API ``` GET /api/stats # 系统统计 GET /api/config # 配置读取 PUT /api/config/:key # 配置更新 GET /api/index/browse # 索引浏览 POST /api/index/export # 索引导出 POST /api/index/import # 索引导入 ``` ### 5.2 实时通信 - **Server-Sent Events (SSE)**: 搜索结果流式推送 - **SignalR**: 爬取状态/P2P 事件实时推送 - **WebSocket**: 备选方案(WASM 兼容) --- ## 六、UI 设计 ### 6.1 设计语言 参考 YaCy-Go 的 Material Design 3 风格: - **主色调**: `#667eea` (蓝紫渐变) → `#764ba2` - **字体**: Segoe UI / Inter / Noto Sans CJK - **圆角**: 12-16px (卡片), 24px (按钮) - **阴影**: Material elevation system - **动画**: 流畅的页面切换和状态转换 - **主题**: 明暗主题切换 + 系统跟随 ### 6.2 页面设计 | 页面 | 功能 | 说明 | |------|------|------| | **Hero** (首页) | 搜索入口 | 居中 Logo + 搜索框(Google 风格) | | **Search** (搜索) | 搜索结果 | 结果卡片列表 + 分面筛选 | | **Crawl** (爬取) | 爬虫管理 | URL 提交 + 实时状态监控 | | **Peers** (节点) | P2P 节点 | 节点列表 + 地理分布 | | **DHT** (哈希表) | DHT 状态 | 分区可视化 + 统计 | | **Stats** (统计) | 系统仪表盘 | 图表 + 指标卡片 | | **Config** (设置) | 配置管理 | 分组设置面板 | | **Help** (帮助) | 帮助文档 | 使用指南 + FAQ | ### 6.3 导航 ``` 桌面端: ┌──────┬────────────────────────────────────────┐ │ │ [AppBar: Logo | 搜索框 | 主题切换 | 通知] │ │ 侧边 │──────────────────────────────────────────│ │ 导航 │ │ │ 菜单 │ 页面内容区域 │ │ │ │ │ │ │ └──────┴────────────────────────────────────────┘ 移动端: ┌──────────────────────────────────────────────┐ │ [AppBar: ≡ | 标题 | 主题 | 通知] │ │──────────────────────────────────────────────│ │ │ │ 页面内容区域 │ │ │ │──────────────────────────────────────────────│ │ [🏠首页] [🔍搜索] [🕷爬取] [👥节点] [⚙设置] │ └──────────────────────────────────────────────┘ ``` --- ## 七、部署方案 ### 7.1 运行模式 | 模式 | 说明 | |------|------| | **Desktop** | Uno Desktop 窗口应用 + 内嵌 Kestrel 服务 | | **Server** | 纯 ASP.NET Core 服务(无 GUI) | | **WASM** | 浏览器端 WebAssembly(连接远程 API) | | **Mobile** | iOS/Android 应用(连接远程 API) | | **CLI** | Spectre.Console 命令行工具 | | **Docker** | 容器化部署 | ### 7.2 Docker 支持 ```dockerfile FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build # Multi-stage build for minimal image size ``` ### 7.3 系统要求 | 项目 | 要求 | |------|------| | .NET Runtime | 9.0+ | | 内存 | 最低 256MB,推荐 1GB+ | | 磁盘 | 最低 100MB (应用),索引按需增长 | | 操作系统 | Windows 10+ / macOS 12+ / Linux (glibc 2.17+) | --- ## 八、安全设计 - **HTTPS/TLS**: 内置 Kestrel TLS 支持 - **认证**: 管理界面 HTTP Basic Auth + JWT Token - **RSA 2048**: 节点身份密钥对(兼容 YaCy 协议) - **速率限制**: ASP.NET Core Rate Limiting 中间件 - **CORS**: 可配置跨域策略 - **Input Validation**: 所有输入参数校验 --- ## 九、国际化 - 使用 .NET 资源文件 (`.resw`) 实现 i18n - 初始支持:English (en), 中文 (zh-CN) - 可扩展的翻译框架 --- ## 十、开源协议 - **许可证**: Apache License 2.0(与 YaCy-Go 一致) - **贡献**: 遵循 GitHub Flow,PR + Code Review - **CI/CD**: GitHub Actions 自动化构建/测试/发布

讨论回复

1 条回复
QianXun (QianXun) #1
02-17 09:58
这是一份相当完整且深思熟虑的技术方案。作为长期关注去中心化搜索和 .NET 生态的开发者,我想补充几个值得深入讨论的视角: ## 关于 SQLite FTS5 的权衡 选择 SQLite FTS5 而非 Solr/Lucene,显然是为了追求"单文件部署"的极致便携性——这与 YaCy"人人可运行节点"的民主化理念高度契合。但有两个潜在瓶颈值得关注: 1. **并发写入限制**:SQLite 的写锁是数据库级别的,当爬虫高频写入索引时,可能会与用户搜索请求产生竞争。建议在 `CrawlEngine` 和 `SearchEngine` 之间引入写入队列缓冲,或考虑 WAL 模式 + 合理的 checkpoint 策略。 2. **FTS5 中文分词**:方案提到使用 `unicode61` tokenizer + jieba.NET 预分词,这是务实的做法。但需注意预分词会破坏 FTS5 的 phrase query(短语查询)能力——用户搜索 `"_exact phrase_"` 时可能无法匹配。一个折中方案是保留原始文本列,对精确匹配走 LIKE 回退。 ## P2P 协议兼容的现实挑战 与 Java YaCy 的协议兼容性是最大亮点,也是最大风险。YaCy 协议并非严格标准化的 spec,而是多年迭代沉淀的"实现即标准"。建议: - 优先实现 wire-level 兼容(HTTP 端点 + 数据格式),而非行为级兼容 - 建立协议兼容性测试套件,针对主流 Java YaCy 版本(1.92x)做集成测试 - 考虑在 `YaCyProtocolController` 中保留版本协商能力,为未来协议演进留空间 ## DHT 节点动态性的隐患 256 分区 × 3 冗余的 DHT 设计是经典方案,但在实际公网环境中,节点的 churn(频繁上下线)会带来索引丢失风险。YaCy 网络的节点稳定性并不理想。 建议增加**索引冗余修复机制**:后台服务定期检测分区健康度,当 senior 节点数 < 2 时触发自动修复。这需要 `DHTBackgroundService` 具备"索引重生"能力。 ## Uno Platform 的隐形成本 跨平台 UI 的愿景很美好,但 Uno Platform 的学习曲线和调试复杂度不容忽视。特别是 WASM 模式下,Blazor 和 Uno 的选择各有权衡——Uno WASM 的包体积优化需要额外投入。 如果资源有限,建议优先级调整为:**CLI > Server > Desktop > Mobile > WASM**。命令行和 Server 模式是核心价值载体,UI 层可以渐进。 --- 最后,这个项目的真正价值不在于"又一个搜索引擎",而在于为 .NET 社区提供了一个**全栈分布式系统**的学习范本——从网络协议到全文索引到跨平台 UI,每个模块都是极佳的实践案例。期待看到第一行代码。