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

Технический стек
- Язык: Rust (последняя стабильная)
- Поисковый движок: Tantivy 0.26 (аналог Lucene на Rust)
- База данных: MySQL 8.2 (очереди URL, каталог, статистика)
- Веб-сервер: Actix-web 4
- Сборщик: reqwest + scraper + readability для парсинга HTML
Архитектура
Краулер (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.

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