Kako dodati pretragu u aplikaciju: od jednostavnih filtera do pretrage punog teksta
Da biste dodali pretragu aplikaciji, počnite sa najjednostavnijim rešenjem koje radi: polje za pretragu koje poziva serversku rutu, a ona filtrira redove iz baze poređenjem upita sa nekoliko kolona, plus filtere za stvari poput kategorije ili cene. Kada to nije dovoljno — trebaju vam rangiranje relevantnosti, svođenje reči na osnovu ili mnogo zapisa — prebacite se na pretragu punog teksta u vašoj bazi, a na hostovani pretraživač prelazite tek ako su vam potrebna jaka tolerancija na greške ili trenutni rezultati nad vrlo velikim podacima. Šta god izaberete, pretraga mora da poštuje dozvole: korisnici nikada ne smeju da nađu zapise koje ne smeju da vide.
Šta „pretraga” znači za vašu aplikaciju
Pretraga obuhvata nekoliko različitih stvari, a većini aplikacija treba više od jedne:
- Pretraga po ključnim rečima: polje za tekst — „nađi oglase koji pominju ‘baštu’”.
- Filteri: strukturisani izbori — kategorija, grad, raspon cena, datum, status.
- Sortiranje: najnovije, najjeftinije, najrelevantnije.
- Automatsko dopunjavanje: predlozi dok kucate.
- Tolerancija na greške u kucanju: „restoran” i dalje nalazi „restoran” iako ukucate pogrešno.
Za direktorijum, sajt za posao ili prodavnicu, filteri su često važniji od polja za tekst. Odlučite šta vam zaista treba pre izbora alata.
Vaše opcije
| Pristup | Kako radi | Dobro za | Ograničenja |
|---|---|---|---|
| Filtriranje u pregledaču | Učitajte listu, filtrirajte je u JavaScriptu | Male javne liste (nekoliko stotina stavki) | Šalje sve podatke svakom posetiocu; sporo sa velikim listama |
| Podudaranje obrasca u bazi | Serverski upit tipa „naziv sadrži tekst”, bez obzira na velika i mala slova | Male i srednje aplikacije, alati za administratore | Nema rangiranja; može biti sporo na velikim tabelama; nema svođenja na osnovu |
| Pretraga punog teksta u bazi | Postgres indeksira reči i rangira podudaranja | Većinu aplikacija sa mnogo sadržaja | Slabo sa greškama u kucanju dok ne dodate nejasno podudaranje |
| Nejasno podudaranje (trigrami) | Postgres poredi nizove znakova po sličnosti | Imena, kratka polja, tolerancija na greške | Treba ekstenzija i indeks; podešavanje zahteva pažnju |
| Hostovani pretraživač | Zaseban servis indeksira vaše podatke (Algolia, Meilisearch, Typesense, Elasticsearch i drugi) | Veliki katalozi, trenutna pretraga, jaka tolerancija na greške | Još jedan servis za sinhronizaciju, plaćanje i osiguranje |
Ako su vaši podaci već u Postgresu, njegova ugrađena pretraga punog teksta je dobar srednji put. Deli tekst na reči, svodi ih na osnovu (tako da se „running” podudara sa „run”), ignoriše česte reči i može da rangira rezultate prema tome koliko dobro se podudaraju. Uz odgovarajući indeks ostaje brza i na velikim tabelama.
Primeri prompt-ova
Jednostavan početak:
Dodajte polje za pretragu i filtere na stranicu oglasa. Pretraga treba da podudara upit sa naslovom i opisom, bez obzira na velika i mala slova. Filteri: kategorija (padajući meni), grad (padajući meni) i najveća cena. Pretragu radite na serveru preko API rute sa paginacijom, 20 rezultata po stranici. Neka pretraga i filteri budu u URL-u da se rezultati mogu deliti i da dugme za nazad radi. Prikažite prijateljsku poruku kada ništa ne odgovara.
Nadogradnja na pretragu punog teksta:
Prebacite pretragu oglasa na Postgres pretragu punog teksta po naslovu (veći prioritet) i opisu. Dodajte odgovarajući indeks, rangirajte rezultate po relevantnosti i zadržite postojeće filtere i paginaciju. Ne menjajte postojeće podatke.
Dodavanje tolerancije na greške za imena:
Dodajte nejasno podudaranje po nazivu firme da bi male greške u kucanju i dalje nalazile rezultate. Koristite trigram sličnost ako je dostupna, uz indeks, i vratite se na trenutnu pretragu ako nije.
Korak po korak
- Napišite šta ljudi traže. Koja polja (naslov, opis, oznake, naziv)? Koji filteri? Ako možete, pitajte nekoliko pravih korisnika.
- Počnite na serveru. Dodajte API rutu koja prima upit i filtere i vraća jednu stranicu rezultata. Ne učitavajte sve u pregledač.
- Primenite dozvole u upitu. Ako korisnici vide samo svoje zapise ili samo objavljene, taj uslov pripada istom upitu kao i pretraga.
- Dodajte paginaciju od prvog dana — brojeve stranica ili „učitaj još”.
- Stavite stanje pretrage u URL (na primer
?q=bašta&city=leeds). Linkovi za deljenje, dugme za nazad i pretraživači mogu da indeksiraju filtrirane stranice ako to želite. - Odložite pretragu dok kucate. Sačekajte nekoliko stotina milisekundi posle prestanka kucanja pre upita, da ne šaljete zahtev za svaki pritisak tastera.
- Dodajte indekse kada znate po kojim kolonama filtrirate i pretražujete.
- Nadogradite: prvo na pretragu punog teksta, zatim na nejasno podudaranje, pa na hostovani pretraživač — samo kada jednostavniji korak ne uspeva kod pravih korisnika.
- Testirajte sa podacima koji liče na stvarne: stotine ili hiljade redova, neobični znakovi, prazni upiti, veoma dugi upiti, drugi jezici ako ih podržavate.
Česte greške
- Učitavanje cele tabele u pregledač. Dobro za 50 stavki, bolno za 50.000, i izlaže svaki zapis — uključujući one koje korisnik ne bi smeo da vidi.
- Pretraga koja ignoriše dozvole. Pretraga je česta rupa: privatni ili nacrt zapis se pojavi jer upit nije uključio uslov „samo moje” ili „samo objavljeno”.
- Pravljenje SQL-a od sirovog korisničkog unosa. Uvek koristite parametrizovane upite. AI alat to obično radi, ali proverite ako vidite da se stringovi lepe zajedno.
- Nema prazno stanje. „Nema rezultata” sa predlogom (očistite filtere, proverite pravopis) sprečava da ljudi odu.
- Nema indeksa. Pretraga deluje dobro sa test podacima, a usporava kako pravi podaci rastu.
- Odmah prelazak na servis za pretragu. Tada morate da održavate drugu kopiju podataka u sinhronizaciji, obrađujete brisanja i osiguravate još jedan skup ključeva — često bez vidljive koristi.
- Zaboravljanje mobilnog telefona. Filteri moraju da stanu na telefon; fioka sa filterima ili sklopivi panel obično radi bolje od bočne trake.
Kontrolna lista
- Znate koja polja se pretražuju i koji filteri postoje
- Pretraga radi na serveru i vraća rezultate sa paginacijom
- Upit primenjuje ista pravila dozvola kao ostatak aplikacije
- Korisnički unos se prosleđuje kao parametri, nikada se ne lepi u SQL
- Stanje pretrage je u URL-u
- Kucanje je odloženo
- Kolone koje se pretražuju i filtriraju su indeksirane
- Prazna stanja, stanja bez rezultata i greške su jasna
- Testirano sa realnim količinama podataka i neurednim unosom
Dodavanje pretrage u Mythex
U aplikaciji napravljenoj na Mythexu, podaci obično žive u Postgres bazi samog projekta, pa možete početi sa prompt-ovima iznad: prvo podudaranje obrasca, zatim pretraga punog teksta u Postgresu kada vam treba rangiranje. Ako želite hostovani pretraživač, donesite sopstveni nalog i ključ, sačuvajte ga kao tajnu projekta i zamolite agenta da indeksira i pretražuje servis sa servera, kako je opisano u Integrišite bilo koji API.
Pretraga je srž mnogih aplikacija: pogledajte kako napraviti sajt direktorijuma, kako napraviti sajt za posao i kako napraviti marketplace da vidite kako se uklapa u ostatak proizvoda.
Pitanja
Koji je najlakši način da dodate pretragu u aplikaciju?
Ako su podaci u bazi, najlakši početak je serverska ruta koja filtrira redove poređenjem bez obzira na velika i mala slova nad nekoliko kolona. Za mali spisak koji je već učitan u pregledaču, filtriranje u pregledaču je još jednostavnije.
Treba li mi Algolia ili Elasticsearch za pretragu?
Obično ne na početku. Postgres pretraga punog teksta dobro podnosi podudaranje reči, rangiranje i od hiljada do miliona redova. Hostovani pretraživač vredi kada su vam potrebna jaka tolerancija na greške u kucanju, trenutni rezultati dok kucate nad velikim podacima ili napredno podešavanje relevantnosti.
Zašto moja pretraga ne nalazi rezultate kada ima grešaka u kucanju?
Osnovno podudaranje i standardna pretraga punog teksta traže reči kako su ukucane (ili njihove osnove), pa pogrešno napisana reč promaši. Potrebno vam je nejasno (fuzzy) podudaranje, poput trigram sličnosti u Postgresu ili pretraživača sa tolerancijom na greške.
Da li pretraga treba da radi u pregledaču ili na serveru?
Na serveru za sve što je više od male javne liste. Pretraga na serveru se skalira, poštuje dozvole i ne šalje ceo vaš skup podataka svakom posetiocu.