YaCy improved-search

Una fork experimental de YaCy: mejor ranking, resultados firmados, peers detrás de NAT

Una fork de YaCy que corrige debilidades medidas en la red pública, añade una capa de confianza para poder filtrar resultados falsificados y spam, y permite que los peers detrás de un NAT participen a través de un relay. Cada afirmación de esta página se ha medido en redes peer-to-peer cerradas que cualquiera puede reconstruir con docker compose.

Estado: experimento. Esto no es una versión publicada por el proyecto YaCy ni está afiliado a él. Rompe deliberadamente la compatibilidad con la red pública de YaCy (ids de peer, seeds, hashes de palabras CJK). Se comparte para mostrar, con datos, lo que hacen los cambios, de modo que las ideas puedan discutirse y, donde encajen, proponerse upstream en partes pequeñas.

Por qué

Medido en la red pública de YaCy (freeworld) con 16 consultas, solo el 11% de los 10 primeros resultados contenía todos los términos de la consulta. Al investigar las causas:

Qué ha cambiado

Ranking

Coincidencia mínima más estricta, ponderación por cobertura de términos tras la normalización por peer, un peso contra las páginas escasas y búsqueda en todos los peers de las redes pequeñas.

CJK

El texto en chino, japonés y coreano se indexa y se busca como bigramas solapados, en Solr y en el índice de palabras.

Confianza

Claves de peer Ed25519, seeds firmados, listas de confianza firmadas por coordinadores con etiquetas declaradas, y una firma de autor en cada documento que el peer rastrea.

Paso de NAT

Un pequeño sidecar go-libp2p reserva un hueco en un circuit relay, de modo que los peers detrás de un NAT responden búsquedas.

Calidad de búsqueda

SíntomaCausaCambio
Las páginas que coinciden con un solo término (keyword stuffing) quedan arribaSolr mm=1 para consultas de varios términosCoincidencia mínima 2<-1 5<80%: con dos términos deben coincidir ambos, con 3–5 términos puede faltar uno (search.ranking.solr.mm, .mm.cjk)
La mejor coincidencia parcial de un peer se clasifica como las coincidencias exactas de otros peersNormalización de la puntuación por peerMultiplicar la puntuación normalizada por (términos encontrados / términos de la consulta)², como mínimo 0.05, y nunca por debajo de lo que garantiza la coincidencia mínima (search.ranking.coverage.exponent)
Japonés / chino no se encuentran en el índice de palabrasNo hay segmentación de palabras para CJKBigramas solapados en el índice de palabras y en la consulta; CJKWidthFilter + CJKBigramFilter en el esquema de Solr
Las páginas escasas con la consulta entera en el título (listas de etiquetas) quedan arribaEl qf por defecto pondera title^5 y h1^5 (y host ^6, nombre de archivo de la URL ^4, ruta ^3) frente a text^1Los resultados con menos de 100 palabras se ponderan por palabras / 100, como mínimo 0.1 (search.ranking.thin.words); corregido el recuento de palabras CJK (contaba espacios)
Una red de peers nuevos nunca busca en los índices de palabras de otros peersLa búsqueda DHT necesita peers con más de 3 díasConfigurable (remotesearch.dht.minage, por defecto 3)
Las redes pequeñas no envían consultas Solr remotas a nadie, u omiten los destinos DHTLa fórmula del número de destinos da 0; los destinos DHT estaban excluidos de SolrLas redes de hasta 32 peers consultan a cada peer de confianza conectado (a cada peer en modo abierto), destinos DHT incluidos

Capa de confianza

Paso de NAT

Un proceso sidecar (Go, go-libp2p) se ejecuta junto a YaCy con la misma clave. Detrás de un NAT reserva un hueco en un circuit relay v2 y anuncia la dirección del circuito en el seed firmado (Reach=relay). Los demás peers abren hacia él un puerto de túnel local y usan HTTP normal, así que los clientes existentes de YaCy funcionan sin cambios. Por defecto, estos peers solo responden búsquedas. No guardan datos de la DHT salvo que lo activen.

Los detalles están en el diseño de confianza y NAT (en inglés).

Resultados

Dos experimentos en yacy-lab. Ambos ejecutan redes cerradas en docker compose, con un corpus y un conjunto de consultas deterministas.

Calidad de búsqueda: upstream frente a la fork, 3 peers cada una

Cada peer rastrea un sitio. Las consultas van al peer 1 con resource=global, y la mayoría de las páginas relevantes están en los otros peers. El corpus contiene dos tipos de señuelos: páginas rellenas con un término de la consulta y páginas escasas de "archivo de etiquetas" con la consulta entera en el título. Media sobre 11 consultas (6 en inglés, 4 en japonés, 1 en chino), 2 ejecuciones con el mismo resultado salvo donde se indica.

Clúster / víaR-precision ↑Recall@10 ↑Señuelos en el top R ↓Todos los términos en el top 10 ↑
upstream, por defecto0.520.960.480.42
fork, por defecto0.79–0.861.000.14–0.210.75
upstream, solo índice de palabras0.020.020.000.09
fork, solo índice de palabras0.930.950.070.77

Confianza y NAT: 6 peers de la fork, un relay y un NAT

Tres peers de confianza, un peer de confianza que declara ads, un peer firmado pero no confiable que rastrea spam e introduce documentos con una firma prestada, y un peer detrás de un router MASQUERADE. Las 26 comprobaciones pasan, entre ellas:

Pruébalo

Sin Docker: abre la demo en tu navegador. Funciona en modo simulado y reproduce respuestas grabadas de la demo real (la página está en japonés).

La demo arranca ambas redes (3 peers upstream, y la configuración de confianza y NAT de la fork) en una sola máquina y pone una página de búsqueda delante de ellas. Necesitas Docker con unos 7 GB de memoria.

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
# abre http://localhost:8800 (la configuración tarda unos 10 minutos y muestra su progreso)
La página de la demo: la misma consulta enviada a la red upstream (izquierda) y a la fork (derecha). Upstream muestra primero páginas de spam; la fork muestra primero páginas relevantes verificadas y, en modo abierto, el spam debajo, etiquetado como no verificado.
"bitcoin lightning channel" en modo abierto. Izquierda: upstream muestra primero el spam. Derecha: la fork muestra primero los resultados verificados y, debajo, el spam etiquetado como no verificado.

La página también permite cambiar la confianza: elegir en qué coordinadores confía el peer que busca (un segundo coordinador solo lista al peer de spam, así que confiar en él hace que el spam sea "verificado"), editar y volver a firmar la lista de confianza, entregar la nueva versión a un peer y ver cómo se propaga, y revocar o restaurar la delegación del operador.

Los experimentos en sí: docker compose -p yacylab up -d && docker compose -p yacylab run --rm runner (calidad de búsqueda) y docker compose -f compose.trust.yaml -p yacytrust up -d && docker compose -f compose.trust.yaml -p yacytrust run --rm runner (confianza y NAT). Consulta el README del laboratorio.

Unirse: sin pedir permiso

Cualquiera, persona o agente, puede ejecutar un peer, conectarlo con la URL de un miembro (p2p.bootstrap.peers, también a través de una red Tailscale), indexar y firmar sus propias páginas y servicios, y tener su propio coordinador u operador: un coordinador es solo una clave y un archivo firmado en cualquier URL, sin servidor. Se permiten anuncios declarados (etiqueta ads); los usuarios eligen en qué listas confían. Cómo unirse · se aceptan pull requests.

Para agentes de IA

Un agente puede ejecutar su propio peer y usarlo como herramienta de búsqueda, sin API de búsqueda ni clave de API:

Limitaciones