Jak dodać wyszukiwarkę do aplikacji: od prostych filtrów po pełnotekstowe wyszukiwanie
Aby dodać wyszukiwanie do aplikacji, zacznij od najprostszego rozwiązania, które działa: pola wyszukiwania wywołującego trasę serwerową, która filtruje wiersze bazy, dopasowując zapytanie do kilku kolumn, oraz filtrów np. kategorii czy ceny. Gdy to nie wystarcza — potrzebujesz rankingu trafności, odmiany słów lub dużej liczby rekordów — przejdź na pełnotekstowe wyszukiwanie w bazie danych, a hostowaną wyszukiwarkę wprowadź tylko wtedy, gdy potrzebujesz mocnej tolerancji literówek albo natychmiastowych wyników przy bardzo dużych danych. Cokolwiek wybierzesz, wyszukiwanie musi respektować uprawnienia: użytkownicy nigdy nie mogą znaleźć rekordów, których nie wolno im zobaczyć.
Co oznacza „wyszukiwanie” w Twojej aplikacji
Wyszukiwanie obejmuje kilka różnych rzeczy i większość aplikacji potrzebuje więcej niż jednej:
- Wyszukiwanie słów kluczowych: pole tekstowe — „znajdź ogłoszenia z ‘ogród’”.
- Filtry: uporządkowane wybory — kategoria, miasto, zakres cen, data, status.
- Sortowanie: od najnowszych, od najtańszych, od najtrafniejszych.
- Autouzupełnianie: podpowiedzi podczas pisania.
- Tolerancja literówek: „restuarant” nadal znajduje „restaurant”.
W katalogu, serwisie z ofertami pracy czy sklepie filtry często ważą więcej niż pole tekstowe. Zanim wybierzesz narzędzie, ustal, czego naprawdę potrzebujesz.
Twoje opcje
| Podejście | Jak działa | Dobre do | Ograniczenia |
|---|---|---|---|
| Filtrowanie w przeglądarce | Lista jest załadowana i filtrowana w JavaScripcie | Małych, publicznych list (kilkaset pozycji) | Wszystkie dane trafiają do każdego odwiedzającego; wolne przy dużych listach |
| Dopasowanie wzorca w bazie | Zapytanie na serwerze typu „nazwa zawiera tekst”, bez rozróżniania wielkości liter | Małe i średnie aplikacje, narzędzia administracyjne | Brak rankingu; może być wolne na dużych tabelach; brak odmiany słów |
| Pełnotekstowe wyszukiwanie w bazie | Postgres indeksuje słowa i ranguje dopasowania | Większość aplikacji z dużą ilością treści | Słabe przy literówkach, chyba że dodasz dopasowanie rozmyte |
| Dopasowanie rozmyte (trigramy) | Postgres porównuje podobieństwo ciągów znaków | Nazwy, krótkie pola, tolerancja literówek | Wymaga rozszerzenia i indeksu; trzeba to dostroić |
| Hostowana wyszukiwarka | Osobna usługa indeksuje Twoje dane (Algolia, Meilisearch, Typesense, Elasticsearch i inne) | Duże katalogi, natychmiastowe wyszukiwanie, mocna tolerancja literówek | Kolejna usługa do synchronizacji, opłacenia i zabezpieczenia |
Jeśli Twoje dane już są w Postgresie, jego wbudowane pełnotekstowe wyszukiwanie to mocny środek drogi. Dzieli tekst na słowa, sprowadza je do rdzeni (dzięki czemu „running” pasuje do „run”), ignoruje częste wyrazy i potrafi uszeregować wyniki według stopnia dopasowania. Przy właściwym indeksie działa szybko na dużych tabelach.
Przykładowe prompty
Prosty start:
Dodaj pole wyszukiwania i filtry na stronę ogłoszeń. Wyszukiwanie ma dopasowywać zapytanie do tytułu i opisu, bez rozróżniania wielkości liter. Filtry: kategoria (lista rozwijana), miasto (lista rozwijana) i maksymalna cena. Wyszukiwanie wykonuj na serwerze przez paginowaną trasę API, 20 wyników na stronę. Trzymaj wyszukiwanie i filtry w adresie URL, aby wyniki dało się udostępniać, a przycisk wstecz działał. Gdy nic nie pasuje, pokaż przyjazny komunikat o braku wyników.
Przejście na pełnotekstowe wyszukiwanie:
Przełącz wyszukiwanie ogłoszeń na pełnotekstowe wyszukiwanie Postgresa po tytule (z wyższą wagą) i opisie. Dodaj właściwy indeks, sortuj wyniki według trafności i zachowaj istniejące filtry oraz paginację. Nie zmieniaj żadnych istniejących danych.
Tolerancja literówek w nazwach:
Dodaj dopasowanie rozmyte po nazwie firmy, aby drobne literówki też znajdowały wyniki. Użyj podobieństwa trigramów, jeśli jest dostępne, z indeksem, a gdy go nie ma, wróć do obecnego wyszukiwania.
Krok po kroku
- Spisz, czego ludzie szukają. Które pola (tytuł, opis, tagi, nazwa)? Które filtry? Jeśli możesz, zapytaj kilku prawdziwych użytkowników.
- Zacznij od strony serwera. Dodaj trasę API, która przyjmuje zapytanie i filtry, i zwraca jedną stronę wyników. Nie ładuj wszystkiego do przeglądarki.
- Zastosuj uprawnienia w zapytaniu. Jeśli użytkownicy widzą tylko swoje rekordy albo tylko opublikowane, ten warunek musi być w tym samym zapytaniu co wyszukiwanie.
- Dodaj paginację od pierwszego dnia — numery stron albo „załaduj więcej”.
- Umieść stan wyszukiwania w adresie URL (np.
?q=ogród&city=leeds). Dzięki temu linki można udostępniać, przycisk wstecz działa, a wyszukiwarki mogą indeksować przefiltrowane strony, jeśli tego chcesz. - Opóźniaj wyszukiwanie podczas pisania. Odczekaj kilkaset milisekund po zakończeniu pisania, zanim wyślesz zapytanie, aby nie wysyłać żądania przy każdym znaku.
- Dodaj indeksy, gdy wiesz, po których kolumnach filtrujesz i szukasz.
- Ulepszaj stopniowo: najpierw pełnotekstowe wyszukiwanie, potem dopasowanie rozmyte, a dopiero na końcu hostowaną wyszukiwarkę — tylko wtedy, gdy prostszy krok zawodzi prawdziwych użytkowników.
- Testuj na realistycznych danych: setki lub tysiące wierszy, dziwne znaki, puste zapytania, bardzo długie zapytania, inne języki, jeśli je obsługujesz.
Częste błędy
- Ładowanie całej tabeli do przeglądarki. Dla 50 pozycji jest w porządku, dla 50 000 boli, a do tego ujawnia każdy rekord — także te, których użytkownik nie powinien widzieć.
- Wyszukiwanie ignorujące uprawnienia. To częste źródło wycieków: prywatny lub roboczy rekord pojawia się, bo zapytanie wyszukiwania zapomniało warunku „tylko moje” albo „tylko opublikowane”.
- Budowanie SQL z surowych danych użytkownika. Zawsze używaj zapytań z parametrami. Asystent do budowania zwykle tak robi, ale sprawdź, czy nie widzisz sklejanych ciągów.
- Brak stanu pustego. Komunikat „brak wyników” z podpowiedzią (wyczyść filtry, sprawdź pisownię) zatrzymuje ludzi przed odejściem.
- Brak indeksów. Wyszukiwanie wydaje się szybkie na danych testowych i zwalnia, gdy rosną prawdziwe dane.
- Od razu sięganie po usługę wyszukiwania. Musisz wtedy trzymać drugą kopię danych w synchronizacji, obsługiwać usuwanie i zabezpieczać kolejny zestaw kluczy — często bez widocznego zysku.
- Zapominanie o telefonach. Filtry muszą mieścić się na telefonie; zwykle lepiej sprawdza się szuflada filtrów lub zwijany panel niż boczny pasek.
Lista kontrolna
- Wiesz, które pola są przeszukiwane i jakie filtry istnieją
- Wyszukiwanie działa na serwerze i zwraca wyniki z paginacją
- Zapytanie egzekwuje te same uprawnienia co reszta aplikacji
- Dane wejściowe użytkownika przekazywane są jako parametry, nigdy nie są sklejane z SQL
- Stan wyszukiwania znajduje się w adresie URL
- Pisanie jest opóźniane (debounce)
- Przeszukiwane i filtrowane kolumny są zindeksowane
- Stany pusty, bez wyników i błędu są jasne
- Przetestowane na realistycznej objętości danych i brudnych danych wejściowych
Dodawanie wyszukiwania w Mythex
W aplikacji zbudowanej w Mythex dane zwykle leżą w bazie Postgres należącej do projektu, więc możesz zacząć od powyższych promptów: najpierw dopasowanie wzorca, a gdy potrzebujesz rankingu — pełnotekstowe wyszukiwanie Postgresa. Jeśli chcesz hostowaną wyszukiwarkę, użyj własnego konta i klucza, zapisz go jako sekret projektu i poproś agenta, aby indeksował dane i wykonywał zapytania po stronie serwera, zgodnie z opisem w Integracja z dowolnym API.
Wyszukiwanie to rdzeń wielu aplikacji: zobacz, jak pasuje do reszty produktu, w poradnikach jak zbudować stronę katalogową, jak zbudować portal z ofertami pracy oraz jak zbudować marketplace.
Pytania
Jaki jest najprostszy sposób na dodanie wyszukiwania do aplikacji?
Jeśli dane są w bazie danych, najłatwiej zacząć od trasy serwerowej, która filtruje wiersze dopasowaniem tekstu bez rozróżniania wielkości liter w kilku kolumnach. Przy małej liście już załadowanej w przeglądarce filtrowanie w przeglądarce jest jeszcze prostsze.
Czy do wyszukiwania potrzebuję Algolii lub Elasticsearcha?
Zwykle nie na początku. Pełnotekstowe wyszukiwanie w Postgresie dobrze radzi sobie z dopasowywaniem słów, rankingiem i tysiącami do milionów wierszy. Hostowana wyszukiwarka warto dopiero wtedy, gdy potrzebujesz mocnej tolerancji literówek, natychmiastowych wyników podczas pisania przy dużych danych albo zaawansowanego strojenia trafności.
Dlaczego moje wyszukiwanie nie znajduje wyników przy literówkach?
Podstawowe dopasowanie i standardowe pełnotekstowe wyszukiwanie szukają słów tak, jak zostały wpisane (lub ich rdzeni), więc błąd pisowni powoduje brak wyniku. Potrzebujesz dopasowania rozmytego, np. podobieństwa trigramów w Postgresie lub wyszukiwarki z tolerancją literówek.
Czy wyszukiwanie powinno działać w przeglądarce czy na serwerze?
Na serwerze — we wszystkim, co wykracza poza małą publiczną listę. Wyszukiwanie po stronie serwera się skaluje, respektuje uprawnienia i nie wysyła całego zbioru danych do każdego odwiedzającego.