YaCy improved-search

Ein experimenteller YaCy-Fork: besseres Ranking, signierte Ergebnisse, Peers hinter NAT

Ein Fork von YaCy, der im öffentlichen Netz gemessene Schwächen behebt, eine Vertrauensschicht ergänzt, mit der sich gefälschte Ergebnisse und Spam herausfiltern lassen, und Peers hinter einem NAT über ein Relay teilnehmen lässt. Jede Aussage auf dieser Seite ist in geschlossenen Peer-to-Peer-Netzen gemessen, die jeder mit docker compose nachbauen kann.

Status: Experiment. Dies ist kein Release des YaCy-Projekts und steht in keiner Verbindung zu ihm. Es bricht bewusst die Kompatibilität mit dem öffentlichen YaCy-Netz (Peer-IDs, Seeds, CJK-Wort-Hashes). Es wird veröffentlicht, um mit Daten zu zeigen, was die Änderungen bewirken, damit die Ideen diskutiert und, wo sie passen, in kleinen Teilen upstream vorgeschlagen werden können.

Warum

Im öffentlichen YaCy-Netz (freeworld) mit 16 Anfragen gemessen, enthielten nur 11% der Top-10-Ergebnisse alle Suchbegriffe. Die Ursachen:

Was sich geändert hat

Ranking

Strengeres Minimum Match, Gewichtung nach Begriffsabdeckung nach der Normierung pro Peer, eine Gewichtung gegen dünne Seiten und die Suche über alle Peers kleiner Netze.

CJK

Chinesischer, japanischer und koreanischer Text wird als überlappende Bigramme indexiert und gesucht, in Solr und im Wortindex.

Vertrauen

Ed25519-Peer-Schlüssel, signierte Seeds, von Koordinatoren signierte Vertrauenslisten mit deklarierten Tags und eine Autorensignatur auf jedem Dokument, das der Peer crawlt.

NAT-Traversal

Ein kleiner go-libp2p-Sidecar reserviert einen Slot auf einem Circuit Relay, sodass Peers hinter einem NAT Suchanfragen beantworten.

Suchqualität

SymptomUrsacheÄnderung
Seiten, die nur einen Begriff treffen (Keyword-Stuffing), stehen obenSolr mm=1 bei Anfragen mit mehreren BegriffenMinimum Match 2<-1 5<80%: Bei zwei Begriffen müssen beide passen, bei 3–5 Begriffen darf einer fehlen (search.ranking.solr.mm, .mm.cjk)
Der beste Teiltreffer eines Peers rankt wie die exakten Treffer anderer PeersScore-Normierung pro PeerDen normierten Score mit (gefundene Begriffe / Suchbegriffe)² multiplizieren, mindestens 0.05 und nie unter dem, was das Minimum Match garantiert (search.ranking.coverage.exponent)
Japanisch / Chinesisch wird im Wortindex nicht gefundenKeine Wortsegmentierung für CJKÜberlappende Bigramme im Wortindex und in der Anfrage; CJKWidthFilter + CJKBigramFilter im Solr-Schema
Dünne Seiten mit der ganzen Anfrage im Titel (Tag-Listen) stehen obenDas Standard-qf gewichtet title^5 und h1^5 (und host ^6, URL-Dateiname ^4, Pfad ^3) gegenüber text^1Ergebnisse mit weniger als 100 Wörtern werden mit Wörter / 100 gewichtet, mindestens 0.1 (search.ranking.thin.words); CJK-Wortzählung korrigiert (sie zählte Leerzeichen)
Ein Netz aus neuen Peers durchsucht nie die Wortindizes anderer PeersDHT-Suche braucht Peers, die älter als 3 Tage sindKonfigurierbar (remotesearch.dht.minage, Standard 3)
Kleine Netze schicken entfernte Solr-Anfragen an niemanden oder überspringen DHT-ZieleDie Formel für die Zielanzahl ergibt 0; DHT-Ziele waren von Solr ausgeschlossenNetze mit bis zu 32 Peers fragen jeden verbundenen vertrauenswürdigen Peer (im offenen Modus jeden Peer), DHT-Ziele eingeschlossen

Vertrauensschicht

NAT-Traversal

Ein Sidecar-Prozess (Go, go-libp2p) läuft neben YaCy mit demselben Schlüssel. Hinter einem NAT reserviert er einen Slot auf einem Circuit Relay v2 und kündigt die Circuit-Adresse im signierten Seed an (Reach=relay). Andere Peers öffnen einen lokalen Tunnel-Port zu ihm und nutzen einfaches HTTP, sodass die vorhandenen Clients von YaCy unverändert funktionieren. Standardmäßig beantworten solche Peers nur Suchanfragen. Sie speichern keine DHT-Daten, sofern sie sich nicht dafür entscheiden.

Details im Vertrauens- und NAT-Design (Englisch).

Ergebnisse

Zwei Experimente in yacy-lab. Beide betreiben geschlossene Netze in docker compose, mit einem deterministischen Korpus und Anfrageset.

Suchqualität: Upstream gegen Fork, je 3 Peers

Jeder Peer crawlt eine Site. Anfragen gehen mit resource=global an Peer 1, und die meisten relevanten Seiten liegen auf den anderen Peers. Der Korpus enthält zwei Arten von Ködern: Seiten, die mit einem Suchbegriff vollgestopft sind, und dünne „Tag-Archiv“-Seiten mit der ganzen Anfrage im Titel. Mittelwert über 11 Anfragen (6 englische, 4 japanische, 1 chinesische), 2 Durchläufe mit demselben Ergebnis, außer wo angegeben.

Cluster / PfadR-Precision ↑Recall@10 ↑Köder in Top R ↓Alle Begriffe in Top 10 ↑
Upstream, Standard0.520.960.480.42
Fork, Standard0.79–0.861.000.14–0.210.75
Upstream, nur Wortindex0.020.020.000.09
Fork, nur Wortindex0.930.950.070.77

Vertrauen und NAT: 6 Fork-Peers, ein Relay und ein NAT

Drei vertrauenswürdige Peers, ein vertrauenswürdiger Peer, der ads deklariert, ein signierter, aber nicht vertrauenswürdiger Peer, der Spam crawlt und Dokumente mit einer geliehenen Signatur einschleust, und ein Peer hinter einem MASQUERADE-Router. Alle 26 Prüfungen bestehen, darunter:

Ausprobieren

Ohne Docker: Demo im Browser öffnen. Sie läuft im Mock-Modus und spielt Antworten ab, die mit der echten Demo aufgezeichnet wurden (die Seite ist auf Japanisch).

Die Demo startet beide Netze (3 Upstream-Peers und das Vertrauens- und NAT-Setup des Forks) auf einer Maschine und stellt eine Suchseite davor. Du brauchst Docker mit etwa 7 GB Arbeitsspeicher.

git clone https://github.com/pad01g/yacy_search_server.git yacy
git clone https://github.com/pad01g/yacy-lab.git
cd yacy
git checkout baseline        && docker build -t yacy-lab/upstream:baseline -f docker/Dockerfile .
git checkout improved-search && docker build -t yacy-lab/fork:latest -f docker/Dockerfile .
docker build -t yacy-lab/sidecar:latest sidecar/
cd ../yacy-lab
docker compose -f compose.demo.yaml -p yacydemo up -d
# http://localhost:8800 öffnen (die Einrichtung dauert etwa 10 Minuten und zeigt ihren Fortschritt an)
Die Demoseite: dieselbe Anfrage an das Upstream-Netz (links) und an den Fork (rechts). Upstream listet Spam-Seiten zuerst; der Fork listet verifizierte relevante Seiten zuerst und, im offenen Modus, den Spam darunter, als unverifiziert gekennzeichnet.
„bitcoin lightning channel“ im offenen Modus. Links: Upstream zeigt Spam zuerst. Rechts: Der Fork zeigt verifizierte Ergebnisse zuerst und den Spam, als unverifiziert gekennzeichnet, darunter.

Auf der Seite lässt sich auch das Vertrauen ändern: auswählen, welchen Koordinatoren der suchende Peer vertraut (ein zweiter Koordinator listet nur den Spam-Peer; vertraut man ihm, wird der Spam „verifiziert“), die Vertrauensliste bearbeiten und neu signieren, die neue Version einem Peer übergeben und zusehen, wie sie sich verbreitet, sowie die Delegation des Operators widerrufen oder wiederherstellen.

Die Experimente selbst: docker compose -p yacylab up -d && docker compose -p yacylab run --rm runner (Suchqualität) und docker compose -f compose.trust.yaml -p yacytrust up -d && docker compose -f compose.trust.yaml -p yacytrust run --rm runner (Vertrauen und NAT). Siehe das README des Labors.

Mitmachen: keine Erlaubnis nötig

Jeder, Mensch oder Agent, kann einen Peer betreiben, ihn mit der URL eines Mitglieds verbinden (p2p.bootstrap.peers, auch über ein Tailscale-Netz), eigene Seiten und Dienste indexieren und signieren und einen eigenen Koordinator oder Operator betreiben: Ein Koordinator ist nur ein Schlüssel und eine signierte Datei unter einer beliebigen URL, kein Server. Deklarierte Werbung (Tag ads) ist erlaubt; Nutzer wählen, wessen Listen sie vertrauen. So trittst du bei · Pull Requests willkommen.

Für KI-Agenten

Ein Agent kann einen eigenen Peer betreiben und ihn als Suchwerkzeug nutzen, ohne Such-API oder API-Schlüssel:

Grenzen