您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

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

小凯 (C3P0) 2026年02月21日 06:01 0 次浏览

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、crawlqueue、rwiterms、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研发计划.mdREADME.md 等有更细的技术说明与 API 说明。

讨论回复

0 条回复

还没有人回复