Cum adaugi căutare în aplicația ta: de la filtre simple la full-text search
Pentru a adăuga căutare în aplicația ta, începe cu lucrul cel mai simplu care funcționează: o casetă de căutare care apelează o rută de server, care filtrează rândurile din baza de date potrivind interogarea pe câteva coloane, plus filtre pentru lucruri precum categoria sau prețul. Când asta nu este suficient — ai nevoie de clasare după relevanță, de rădăcinirea cuvintelor sau de multe înregistrări — treci la full-text search-ul bazei tale de date și abia treci la un motor de căutare găzduit dacă ai nevoie de toleranță puternică la greșeli sau de rezultate instant pe date foarte mari. Indiferent ce alegi, căutarea trebuie să respecte permisiunile: utilizatorii nu ar trebui să găsească niciodată înregistrări pe care nu au voie să le vadă.
Ce înseamnă „căutare” pentru aplicația ta
Căutarea acoperă câteva lucruri diferite, iar majoritatea aplicațiilor au nevoie de mai multe:
- Căutare după cuvinte cheie: o casetă de text — „găsește anunțurile care menționează «grădină»”.
- Filtre: alegeri structurate — categorie, oraș, interval de preț, dată, stare.
- Sortare: cele mai noi, cele mai ieftine, cele mai relevante.
- Autocompletare: sugestii în timp ce tastezi.
- Toleranță la greșeli: „restuarant” încă găsește „restaurant”.
Pentru un director, un site de locuri de muncă sau un magazin, filtrele contează adesea mai mult decât caseta de text. Decide care dintre acestea ai nevoie cu adevărat înainte să alegi un instrument.
Opțiunile tale
| Abordare | Cum funcționează | Potrivită pentru | Limite |
|---|---|---|---|
| Filtrare în browser | Încarci lista și o filtrezi în JavaScript | Liste publice mici (câteva sute de elemente) | Trimite toate datele fiecărui vizitator; lentă cu liste mari |
| Potrivire de model în baza de date | Interogare pe server de tipul „numele conține textul”, fără diferență între majuscule și minuscule | Aplicații mici și medii, instrumente de administrare | Fără clasare; poate fi lentă pe tabele mari; fără rădăcinire |
| Full-text search în baza de date | Postgres indexează cuvintele și clasează potrivirile | Majoritatea aplicațiilor cu mult conținut | Slab la greșeli de scriere, dacă nu adaugi potrivire aproximativă |
| Potrivire aproximativă (trigrame) | Postgres compară secvențele de caractere pentru similaritate | Nume, câmpuri scurte, toleranță la greșeli | Are nevoie de o extensie și de un index; necesită reglaj |
| Motor de căutare găzduit | Un serviciu separat indexează datele tale (Algolia, Meilisearch, Typesense, Elasticsearch și altele) | Cataloage mari, căutare instantanee, toleranță puternică la greșeli | Alt serviciu de sincronizat, de plătit și de securizat |
Dacă datele tale sunt deja în Postgres, full-text search integrat este un compromis solid. Sparge textul în cuvinte, le reduce la rădăcini (așa că „running” se potrivește cu „run”), ignoră cuvintele comune și poate clasa rezultatele după cât de bine se potrivesc. Cu indexul potrivit rămâne rapid pe tabele mari.
Prompturi de exemplu
Un start simplu:
Adaugă o casetă de căutare și filtre pe pagina cu anunțuri. Căutarea trebuie să potrivească interogarea cu titlul și descrierea, fără diferență între majuscule și minuscule. Filtre: categorie (dropdown), oraș (dropdown) și preț maxim. Fă căutarea pe server, cu o rută API paginată, 20 de rezultate pe pagină. Ține căutarea și filtrele în URL, ca rezultatele să poată fi partajate și butonul înapoi să funcționeze. Afișează o stare prietenoasă când nimic nu se potrivește.
Trecerea la full-text search:
Mută căutarea de anunțuri pe full-text search din Postgres, pe titlu (cu pondere mai mare) și descriere. Adaugă indexul potrivit, clasează rezultatele după relevanță și păstrează filtrele și paginarea existente. Nu schimba datele existente.
Adăugarea toleranței la greșeli pentru nume:
Adaugă potrivire aproximativă pe numele afacerii, ca micile greșeli de scriere să găsească în continuare rezultate. Folosește similaritatea prin trigrame dacă este disponibilă, cu un index, și revino la căutarea actuală dacă nu este.
Pas cu pas
- Listează ce caută oamenii. Ce câmpuri (titlu, descriere, etichete, nume)? Ce filtre? Întreabă câțiva utilizatori reali, dacă poți.
- Începe pe server. Adaugă o rută API care primește interogarea și filtrele și returnează o pagină de rezultate. Nu încărca tot în browser.
- Aplică permisiunile în interogare. Dacă utilizatorii văd doar înregistrările lor sau doar pe cele publicate, condiția aceasta trebuie pusă în aceeași interogare cu căutarea.
- Adaugă paginare de la început — numere de pagină sau „încarcă mai mult”.
- Pune starea căutării în URL (de exemplu
?q=garden&city=leeds). Link-urile partajabile, butonul înapoi care funcționează și motoarele de căutare pot indexa paginile filtrate dacă vrei asta. - Pune debounce pe căutarea în timp ce tastezi. Așteaptă câteva sute de milisecunde după ce încetezi să tastezi înainte să trimiți interogarea, ca să nu trimiți o cerere la fiecare tastă.
- Adaugă indexuri după ce știi pe ce coloane filtrezi și cauți.
- Fă upgrade la full-text search, apoi la potrivire aproximativă, apoi la un motor găzduit — doar când pasul mai simplu eșuează pentru utilizatorii reali.
- Testează cu date care arată realist: sute sau mii de rânduri, caractere ciudate, interogări goale, interogări foarte lungi, alte limbi dacă le susții.
Greșeli frecvente
- Încărcarea întregului tabel în browser. Merge pentru 50 de elemente, e dureros pentru 50.000 și expune fiecare înregistrare — inclusiv pe cele pe care utilizatorul nu ar trebui să le vadă.
- Căutare care ignoră permisiunile. Căutarea este o scurgere comună: o înregistrare privată sau un draft apare pentru că interogarea a uitat condiția „doar ale mele” sau „doar publicate”.
- Construirea de SQL din date brute de la utilizator. Folosește mereu interogări parametrizate. Un constructor de AI le folosește de obicei, dar verifică dacă vezi șiruri lipite unul de altul.
- Lipsa stării goale. „Niciun rezultat” cu o sugestie (șterge filtrele, verifică ortografia) îi împiedică pe oameni să plece.
- Fără indexuri. Căutarea pare bună cu date de test și încetinește pe măsură ce datele reale cresc.
- Trecerea direct la un serviciu de căutare. Atunci trebuie să ții o a doua copie a datelor sincronizată, să gestionezi ștergerile și să securizezi un alt set de chei — adesea fără un câștig vizibil.
- Uitarea mobilului. Filtrele trebuie să încapă pe telefon; un sertar de filtre sau un panou pliabil funcționează de obicei mai bine decât o bară laterală.
Lista de verificare
- Știi ce câmpuri se caută și ce filtre există
- Căutarea rulează pe server și returnează rezultate paginate
- Interogarea aplică aceleași permisiuni ca restul aplicației
- Datele de la utilizator sunt transmise ca parametri, niciodată lipite în SQL
- Starea căutării stă în URL
- Tastarea are debounce
- Coloanele căutate și filtrate sunt indexate
- Stările goale, fără rezultate și de eroare sunt clare
- Testată cu volume de date realiste și cu intrări murdare
Adăugarea căutării cu Mythex
Într-o aplicație construită pe Mythex, datele trăiesc de obicei în baza de date Postgres a proiectului, deci poți porni cu prompturile de mai sus: potrivire de model întâi, apoi full-text search în Postgres când ai nevoie de clasare. Dacă vrei un motor de căutare găzduit, adu-ți propriul cont și cheia, stocheaz-o ca secret de proiect și cere agentului să indexeze și să interogheze serviciul de pe server, așa cum este descris în Integrează orice API.
Căutarea este miezul multor aplicații: vezi cum construiești un site de directoare, cum construiești un site de locuri de muncă și cum construiești un marketplace pentru cum se integrează în restul produsului.
Întrebări
Care este cel mai simplu mod de a adăuga căutare într-o aplicație?
Dacă datele tale sunt într-o bază de date, o rută de server care filtrează rândurile printr-o potrivire care nu ține cont de majuscule pe câteva coloane este cel mai simplu început. Pentru o listă mică deja încărcată în browser, filtrarea în browser este și mai simplă.
Am nevoie de Algolia sau Elasticsearch pentru căutare?
De obicei nu la început. Full-text search din Postgres se descurcă bine cu potrivirea cuvintelor, cu clasarea rezultatelor și cu mii până la milioane de rânduri. Un motor de căutare găzduit merită când ai nevoie de toleranță puternică la greșeli de scriere, rezultate instant pe date mari sau reglaje avansate de relevanță.
De ce căutarea mea nu găsește rezultate când există greșeli de scriere?
Potrivirea de bază și full-text search-ul standard caută cuvintele așa cum sunt scrise (sau rădăcinile lor), deci o greșeală de scriere nu se potrivește. Ai nevoie de potrivire aproximativă, precum similaritatea prin trigrame din Postgres sau un motor de căutare cu toleranță la greșeli.
Căutarea ar trebui să ruleze în browser sau pe server?
Pe server, pentru orice ce depășește o listă publică mică. Căutarea pe server se scalează, respectă permisiunile și nu trimite întregul set de date fiecărui vizitator.