# YaCy.Uno:用 C# 与 Uno 实现的去中心化搜索引擎
## 一、从 YaCy 说起
[YaCy](https://yacy.net/) 是一个开源、去中心化的 P2P 搜索引擎:没有中心服务器,每个节点既贡献索引也参与搜索,和「人人可运行、数据在本地」的理念一致。传统上有 Java 版 YaCy,近年又有 [YaCy-Go](https://github.com/yacy/yacy.go) 用 Go 重写。**YaCy.Uno** 则是基于 **Uno Platform(C# / .NET 9)** 的又一实现——在继承 YaCy 协议与理念的前提下,把技术栈拉到 .NET 生态,并强调**跨平台**(Windows / macOS / Linux / WebAssembly,以及未来的 iOS/Android)。
本文重点从**架构**和**设计思想**两方面介绍 YaCy.Uno,给想了解或参与贡献的读者一个入口。
---
## 二、设计思想
### 2.1 协议兼容,生态互通
YaCy.Uno 的目标是**与现有 YaCy 节点互通**:实现 YaCy P2P 协议(hello、seedlist、search、transferRWI、transferURL、crawlReceipt、query、profile 等),在「线缆级」与主流 Java/Go 实现兼容。这样既能让 Uno 节点加入既有 YaCy 网络,也能让老节点发现并利用新节点,而不是另起一个孤岛网络。
### 2.2 跨平台与「一处编写,多端运行」
- **Uno Platform**:用同一套 XAML UI 跑在桌面、WASM、移动端,减少重复实现。
- **.NET 9**:统一运行时,高性能、现代 C#,便于利用 SQLite、AngleSharp、PdfPig 等生态。
- **多形态交付**:同一套核心(YaCy.Uno.Core)之上,有 **ASP.NET Core 服务端**、**Uno 桌面/WASM 应用**、**Spectre.Console CLI**,以及 **Docker**,满足「只跑服务」「带界面」「命令行」「容器化」等不同场景。
### 2.3 数据在本地、单文件可部署
- **SQLite + FTS5**:索引与元数据都放在本地一个(或少量)数据库文件中,无需 Solr/Elasticsearch 等重型组件。
- **单文件 exe**:Server/Cli 可发布为「自带运行时」的独立可执行文件,拷贝即用,符合「人人可运行节点」的设想。
### 2.4 清晰分层,核心与展示解耦
- **Core**:搜索引擎、爬虫、P2P/DHT、解析器、存储,全部在 Core 中实现,不依赖任何 UI 或传输形态。
- **Server / App / Cli**:只做「接入层」——HTTP API、桌面 UI、命令行,都调用 Core 的服务与接口。这样测试、演进和替换前端都更容易。
---
## 三、技术架构总览
整体是**分层架构**:从上到下依次是「展示与接入」→「应用服务」→「核心引擎」→「存储」。
```
┌─────────────────────────────────────────────────────────────┐
│ Uno Platform UI │ ASP.NET Core Web API │ Spectre.Console │
│ (桌面/WASM/移动) │ (REST / SSE / SignalR) │ (CLI) │
└─────────────────────────┬───────────────────────────────────┘
│
┌─────────────────────────┴───────────────────────────────────┐
│ Application Services:Search / Crawl / P2P-DHT / Index │
└─────────────────────────┬───────────────────────────────────┘
│
┌─────────────────────────┴───────────────────────────────────┐
│ Core Engine:SQLite FTS5 全文索引 / 文档解析器 / YaCy 协议 │
└─────────────────────────┬───────────────────────────────────┘
│
┌─────────────────────────┴───────────────────────────────────┐
│ Storage:SQLite (EF Core + FTS5),统一数据与索引 │
└─────────────────────────────────────────────────────────────┘
```
- **展示与接入**:Uno 负责跨平台 UI(Material Design 3);ASP.NET Core 提供 REST、SSE 流式搜索、SignalR 爬取状态;CLI 用 Spectre.Console 做终端操作。
- **应用服务**:把「搜索」「爬取」「P2P/节点」「索引管理」等能力封装成服务,供 API/UI/CLI 调用。
- **核心引擎**:全文检索(FTS5)、文档解析(HTML/PDF/Office/RSS 等)、YaCy 协议实现(握手、种子列表、远程搜索、RWI/URL 传输等)、DHT 逻辑,都在 Core 中。
- **存储**:单一 SQLite 库,既有 EF Core 管理的元数据表,也有 FTS5 虚拟表做全文索引,外加种子、爬取队列、配置等,实现「一个库管全部」。
---
## 四、核心模块简述
### 4.1 搜索引擎
- **SQLite FTS5**:全文索引用 FTS5 虚拟表,支持 BM25 排序、高亮摘要;配合 jieba.NET 等做中文分词,入库前对正文分词再写 FTS。
- **排名**:综合 BM25、标题匹配、URL 深度、入链数、新鲜度、语言匹配等因子。
- **联邦搜索**:本地 FTS 查询与远程节点并行,带超时与熔断,结果合并排序后返回。
### 4.2 网页爬虫
- **调度**:优先级队列 + 按域名限速(Polite crawling),遵守 robots.txt。
- **抓取**:能用的地方优先 CDP(Chrome);否则回退到普通 HTTP。HTML 统一用 **AngleSharp** 解析。
- **解析管道**:HTML / PDF / Office / RSS / XML / 纯文本等多格式,通过解析器工厂按 MIME 类型分发;结果写入 FTS5 并参与 P2P 分发。
### 4.3 P2P 与 DHT
- **协议**:实现 `/yacy/hello`、`/yacy/seedlist`、`/yacy/search`、`/yacy/transferRWI`、`/yacy/transferURL`、爬取回执、节点消息等,与 Java/Go 节点互通。
- **DHT**:256 分区、冗余因子 3;词哈希 → 节点选择 → 索引分发;设计上考虑分区健康度与修复(如 senior 不足时触发修复)。
### 4.4 存储层
- **双表配合**:`documents` 存元数据,`documents_fts`(FTS5)存全文;另有 seeds、crawl_queue、rwi_terms、config 等。
- **单文件**:默认 `data/yacy.db`,便于备份与迁移。
---
## 五、与 Java / Go 版的简单对比
| 维度 | Java YaCy | YaCy-Go | YaCy.Uno |
|------------|-----------|---------|------------------|
| 语言/运行时 | Java 8+ | Go | 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 |
| 跨平台形态 | JVM | 原生 | .NET 跨平台 + Uno 多端 |
| 移动端 | ❌ | ❌ | ✅ 规划 (iOS/Android) |
| TUI/CLI | ❌ | ✅ | ✅ Spectre.Console |
共同点:都遵循 YaCy 理念(去中心、本地数据、P2P),并尽量在协议层面兼容,便于组成同一张搜索网络。
---
## 六、小结
YaCy.Uno 在**设计上**强调:协议兼容、跨平台、本地存储与单文件可部署、核心与 UI/传输解耦;在**架构上**采用分层(接入 → 服务 → 引擎 → 存储),核心引擎与 SQLite FTS5 统一收口在 YaCy.Uno.Core,便于维护和扩展。若你对去中心化搜索、C#/.NET 或 Uno 跨平台开发感兴趣,欢迎到仓库看代码、提 Issue 或 PR。
- **仓库**:[yacy.uno](https://github.com/your-org/yacy.uno)(请以实际仓库地址为准)
- **文档**:仓库内 `设计方案.md`、`研发计划.md`、`README.md` 等有更细的技术说明与 API 说明。
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!