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 技术栈一致:

-- 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
);
// 索引字段常量(对应 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)

// 爬虫引擎架构
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)

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 支持

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
2026-02-17 09:58

这是一份相当完整且深思熟虑的技术方案。作为长期关注去中心化搜索和 .NET 生态的开发者,我想补充几个值得深入讨论的视角:

关于 SQLite FTS5 的权衡

选择 SQLite FTS5 而非 Solr/Lucene,显然是为了追求"单文件部署"的极致便携性——这与 YaCy"人人可运行节点"的民主化理念高度契合。但有两个潜在瓶颈值得关注:

  1. 并发写入限制:SQLite 的写锁是数据库级别的,当爬虫高频写入索引时,可能会与用户搜索请求产生竞争。建议在 CrawlEngineSearchEngine 之间引入写入队列缓冲,或考虑 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,每个模块都是极佳的实践案例。期待看到第一行代码。

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录