Статья

W3A Search — поисковая система на Rust

W3A Search — это поисковый движок, написанный на Rust. Он индексирует сайты из каталога, собирает ссылки, ранжирует страницы и отдаёт результаты через JSON API. Система состоит из двух компонентов: краулера (обходит сайты, собирает контент) и сервера (хранит индекс, ищет по запросам).

W3A Search

Технический стек

  • Язык: Rust (последняя стабильная)
  • Поисковый движок: Tantivy 0.26 (аналог Lucene на Rust)
  • База данных: MySQL 8.2 (очереди URL, каталог, статистика)
  • Веб-сервер: Actix-web 4
  • Сборщик: reqwest + scraper + readability для парсинга HTML

https://github.com/evgip/w3a-search

Архитектура

Краулер (indexer.rs):

  • Обходит центральные страницы из каталога (1119 сайтов)
  • Собирает ссылки с каждого сайта, рекурсивно углубляясь (до 2 уровней)
  • Соблюдает robots.txt, поддерживает sitemap.xml
  • Пишет контент в файловую очередь ./inbox
  • Ведёт счётчик внешних ссылок (backlinks) для ранжирования авторитетности
  • Автоматически банит недоступные домены (5 ошибок → бан на 24 часа)

Сервер (main.rs):

  • Принимает JSON из ./inbox, индексирует в Tantivy
  • Отдаёт результаты поиска с подсветкой <b>, группировкой по сайтам
  • Поддерживает fuzzy-поиск (опечатки, расстояние Левенштейна 1–2)
  • Ранжирует документы: релевантность × буст по backlinks-авторитетности

Ключевые возможности

Функция Как реализовано
Двухуровневая индексация Центральные страницы (каталог) → внутренние страницы (найденные пауком)
Поиск с опечатками FuzzyTermQuery (Levenshtein 1–2)
Группировка по сайтам main + nested (как в Google/Yandex)
Стемминг ru/en Language-aware: кириллица → русский Porter, латиница → английский Porter
Фильтрация по page_type (central/inner), по домену
Дедупликация контента по хэшу содержимого
Авто-бан доменов 5 сетевых ошибок → бан на 24 часа
Backlinks-буст внешние ссылки → множитель score (×1…×2)
robots.txt / sitemap.xml проверка и парсинг
Канонизация URL чистка utm_*, fbclid, фрагментов, слешей
Ре-краул повторный обход по расписанию (168 ч)
Синонимы PHP-словарь на стороне сайта
Статистика /search/stats-api (JSON) + /search/stats (дашборд)

Производительность

  • 5 параллельных потоков, 1 на домен
  • Индекс: ~90 000 документов на VPS (933 центральных + 67 000 внутренних)
  • Размер индекса: ~200–300 МБ
  • Среднее время ответа: <0.01 сек на запрос

Что дальше

Система работает в продакшене на Ubuntu VPS, обслуживает поиск по каталогу сайтов nasua.ru.

Поиск по каталогу

https://nasua.ru/search/stats

1 Ответ

  1. Дело вот в чём, у меня есть поисковый движок, который мы разрабатывали лет так >25 назад, но он уже устарел. Вот решил попробовать написать для регионального поиска с нуля, простой и легкий.

    Хочу сделать поиск по определенному сегменту сети (по сайтам по буддизму).

    На Nasua проба, тестовая версия, это обкатка на тысячи сайтах, найти узкие места и т.д.