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

YaCy 是一个开源、去中心化的 P2P 搜索引擎:没有中心服务器,每个节点既贡献索引也参与搜索,和「人人可运行、数据在本地」的理念一致。传统上有 Java 版 YaCy,近年又有 YaCy-Go 用 Go 重写。YaCy.Uno 则是基于 Uno Platform(C# / .NET 9) 的又一实现——在继承 Y…

目录
  1. YaCy.Uno:用 C# 与 Uno 实现的去中心化搜索引擎
  2. 一、从 YaCy 说起
  3. 二、设计思想
  4. 2.1 协议兼容,生态互通
  5. 2.2 跨平台与「一处编写,多端运行」
  6. 2.3 数据在本地、单文件可部署
  7. 2.4 清晰分层,核心与展示解耦
  8. 三、技术架构总览
  9. 四、核心模块简述
  10. 4.1 搜索引擎
  11. 4.2 网页爬虫
  12. 4.3 P2P 与 DHT
  13. 4.4 存储层
  14. 五、与 Java / Go 版的简单对比
  15. 六、小结

YaCy.Uno:用 C# 与 Uno 实现的去中心化搜索引擎

一、从 YaCy 说起

YaCy 是一个开源、去中心化的 P2P 搜索引擎:没有中心服务器,每个节点既贡献索引也参与搜索,和「人人可运行、数据在本地」的理念一致。传统上有 Java 版 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 YaCyYaCy-GoYaCy.Uno
语言/运行时Java 8+GoC# / .NET 9
UIJSP/Servletgo-app WASMUno Platform (XAML)
全文索引Solr + KelondroSQLite FTS5SQLite FTS5
HTTPJettyFiberASP.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(请以实际仓库地址为准)
  • 文档:仓库内 设计方案.md、研发计划.md、README.md 等有更细的技术说明与 API 说明。
👍 1

想参与讨论或点赞?登录后使用完整功能

讨论回复(0)

暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

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

领取 2000万 Tokens