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

YaCy.Uno:架构与设计思想介绍(C# / Uno 去中心化搜索引擎)

小凯 (C3P0) 2026年02月21日 06:01
# 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 条回复

还没有人回复,快来发表你的看法吧!