
Minotauri
Wertykalna wyszukiwarka branży łazienkowej i kuchennej z własnym crawlerem i własnym indeksem.
- PROJECT
- WEB-033
- INDEKSER
- PYTHON 3.12 · FASTAPI · POSTGRES
- WYSZUKIWARKA
- TAURI 2 · SVELTE · RUST
- WERTYKALE
- 6
- JĘZYKI
- 11
- STATUS
- W TRAKCIE
- DATA
- 30 sierpnia 2026
Nie nakładka na cudzą wyszukiwarkę. Minotauri sam odwiedza strony, decyduje, czy należą do branży, wyciąga produkty, zdjęcia, aranżacje, firmy i dokumentację, i buduje własny indeks — przeszukiwany offline w milisekundach.
Każdy rozchodzący się pierścień to jedna odwiedzona strona. Po odwiedzeniu strona dostaje etykietę wertykalu — produkt, aranżacja, firma, dokumentacja — i dopiero wtedy trafia do indeksu; strony spoza branży są odrzucane na tym kroku i nie zajmują miejsca. Licznik po prawej rośnie tylko o te przyjęte, dlatego przyrost jest wolniejszy niż tempo odwiedzin.
PROBLEM
Wyszukiwarki ogólne nie rozumieją branży: zapytanie o deszczownicę zwraca sklepy, blogi i przypadkowe obrazki, a nie porównywalne produkty z kartami katalogowymi. Zawężenie wyników wymaga wiedzy, której wyszukiwarka nie ma, bo jej model świata jest poziomy, nie branżowy.
POMYSŁ
Zbudować wyszukiwarkę pionową: własny crawler, własna klasyfikacja przynależności do branży, własna ekstrakcja encji i własny indeks. Rozdzielony na dwa niezależne produkty — indekser i wyszukiwarkę desktopową.
Ten podział jest sednem: zatrzymanie crawlera na tydzień nie zatrzymuje wyszukiwania, bo desktop odpowiada na zapytania z tego, co już zindeksowano, i startuje w milisekundach.
Indeks jest wspólnym kontraktem między dwoma produktami. Dopóki jego format się nie zmienia, crawler i wyszukiwarka rozwijają się niezależnie — można przebudować cały indekser, nie dotykając aplikacji, z której korzysta użytkownik.
PROJEKT
Sześć wertykali: WWW, produkty, grafika, aranżacje, firmy i dokumentacja. Jedenaście języków wykrywanych per strona, ze wspólnym słownikiem branżowym — dzięki niemu deszczownica, rain shower, soffione, Regendusche i тропический душ odnajdują się nawzajem.
Ciekawostka implementacyjna: czeski i słowacki dzielą niemal wszystkie słowa funkcyjne, więc rozstrzygnięcie tej pary opiera się na literach wyłącznych dla każdego z nich (ř ě kontra ľ ĺ ŕ), a nie na słownictwie, które mają wspólne.
Ekstrakcja wyciąga ze strony encje branżowe, nie sam tekst: produkty z parametrami, zdjęcia z rolą (produktowe kontra aranżacyjne), firmy i dokumentację techniczną. Każdy wertykal ma własny zestaw pól, bo karta produktu i zdjęcie aranżacyjne wymagają zupełnie innych metadanych.
REALIZACJA
Indekser to Python z FastAPI i PostgreSQL, wyszukiwarka to aplikacja Tauri 2 ze Svelte i Rustem — w repozytorium leży zbudowany TauriDesktop.exe. Do rozpoznawania tekstu z dokumentacji dołączone są dane Tesseract dla języków branżowych (polski, rosyjski, hiszpański, włoski, francuski).
Wybór stosu wynika z podziału ról. Indekser jest procesem długo działającym, korzystającym z bazy i sieci — Python nadaje się do tego dobrze. Wyszukiwarka ma startować natychmiast i pracować na lokalnym indeksie, więc dostała Rusta i Tauri: kilkanaście megabajtów zamiast setek i uruchomienie liczone w milisekundach.
Klasyfikacja branżowa działa dwustopniowo — najpierw tania heurystyka na słownictwie i strukturze strony, potem model dla przypadków niepewnych. Puszczanie wszystkiego przez model byłoby kilkukrotnie wolniejsze przy marginalnym zysku na trafności.
EFEKT
Rozdzielenie ról okazało się słuszne także wydajnościowo: indekser potrzebuje bazy, sieci i czasem AI, a wyszukiwarka potrzebuje wyłącznie gotowego indeksu. Uruchamia się natychmiast i działa bez połączenia.
GALERIA
01 ZDJĘĆMinotauri — panel administracyjny indeksera: 3445 domen, 517 tys. stron, 152 tys. produktów, 2,5 mln grafik · zrzut z projektu
WNIOSKI
Największy koszt nie leży w crawlerze, tylko w klasyfikacji: decyzja „czy ta strona należy do branży” determinuje jakość całego indeksu. Błąd na tym kroku przenosi się na wszystkie kolejne i nie da się go naprawić lepszym rankingiem.
Drugi wniosek dotyczy języków: wspólny słownik branżowy okazał się tańszy i skuteczniejszy niż tłumaczenie zapytań. Zamiast tłumaczyć „deszczownica” na dziesięć języków przy każdym wyszukiwaniu, raz mapujemy pojęcie na zbiór terminów i szukamy ich wszystkich naraz.


