Kako dodati iskanje v svojo aplikacijo: od preprostih filtrov do polnobesedilnega iskanja
Da dodate iskanje v aplikacijo, začnite z najpreprostejšo stvarjo, ki deluje: iskalno polje, ki kliče strežniško pot, ta pa filtrira vrstice baze podatkov z ujemanjem poizvedbe z nekaj stolpci, ter filtre za stvari, kot sta kategorija ali cena. Ko to ni dovolj — potrebujete razvrščanje po relevantnosti, korenjenje besed ali veliko zapisov —, preklopite na polnobesedilno iskanje vaše baze, gostovan iskalnik pa uporabite samo, če potrebujete močno toleranco na tipkarske napake ali takojšnje rezultate nad zelo velikimi podatki. Ne glede na izbiro mora iskanje upoštevati dovoljenja: uporabniki ne smejo nikoli najti zapisov, ki jih ne smejo videti.
Kaj „iskanje“ pomeni za vašo aplikacijo
Iskanje zajema več različnih stvari, in večina aplikacij potrebuje več kot eno:
- Iskanje po ključnih besedah: polje za besedilo — „poišči oglase, ki omenjajo ‚vrt‘“.
- Filtri: strukturirane izbire — kategorija, mesto, razpon cen, datum, stanje.
- Razvrščanje: najnovejše, najcenejše, najrelevantnejše.
- Samodokončevanje: predlogi med tipkanjem.
- Toleranca na tipkarske napake: „restavrasija“ še vedno najde „restavracija“.
Za imenik, oglasno desko ali trgovino so filtri pogosto pomembnejši od besedilnega polja. Preden izberete orodje, se odločite, kaj od tega res potrebujete.
Vaše možnosti
| Pristop | Kako deluje | Primerno za | Omejitve |
|---|---|---|---|
| Filtriranje v brskalniku | Naložite seznam in ga filtrirate v JavaScriptu | Majhne javne sezname (nekaj sto elementov) | Vsakemu obiskovalcu pošlje vse podatke; počasno pri velikih seznamih |
| Ujemanje vzorca v bazi | Strežniška poizvedba tipa „ime vsebuje besedilo“, neobčutljiva na velikost črk | Majhne do srednje velike aplikacije, orodja za skrbnike | Brez razvrščanja; lahko je počasno pri velikih tabelah; brez korenjenja |
| Polnobesedilno iskanje v bazi | Postgres indeksira besede in razvršča zadetke | Večina vsebinsko bogatih aplikacij | Šibko pri tipkarskih napakah, razen če dodate mehko ujemanje |
| Mehko ujemanje (trigrami) | Postgres primerja zaporedja znakov za podobnost | Imena, kratka polja, toleranca na napake | Potrebuje razširitev in indeks; nastavljanje zahteva skrb |
| Gostovan iskalnik | Ločena storitev indeksira vaše podatke (Algolia, Meilisearch, Typesense, Elasticsearch in drugi) | Velike zbirke, takojšnje iskanje, močna toleranca na napake | Še ena storitev, ki jo je treba sinhronizirati, plačati in zavarovati |
Če vaši podatki že živijo v Postgresu, je njegovo vgrajeno polnobesedilno iskanje dobra vmesna rešitev. Besedilo razdeli na besede, jih reducira na korene (tako se „teči“ ujema z „tek“), prezre pogoste besede in lahko razvršča rezultate po tem, kako dobro se ujemajo. Z ustreznim indeksom ostane hitro tudi na velikih tabelah.
Primeri pozivov
Preprost začetek:
Dodaj iskalno polje in filtre na stran z oglasi. Iskanje naj primerja poizvedbo z naslovom in opisom, neobčutljivo na velikost črk. Filtri: kategorija (spustni seznam), mesto (spustni seznam) in največja cena. Iskanje naj poteka na strežniku s stranjeno potjo API-ja, 20 rezultatov na stran. Iskanje in filtre ohrani v URL-ju, da se rezultati lahko delijo in deluje gumb nazaj. Ko nič ne ustreza, prikaži prijazno prazno stanje.
Nadgradnja na polnobesedilno iskanje:
Preklopi iskanje oglasov na polnobesedilno iskanje Postgresa za naslov (višja utež) in opis. Dodaj ustrezen indeks, razvrsti rezultate po relevantnosti in ohrani obstoječe filtre ter stranjenje. Ne spreminjaj obstoječih podatkov.
Dodajanje tolerance na napake za imena:
Dodaj mehko ujemanje za ime podjetja, da majhne tipkarske napake še vedno najdejo rezultate. Uporabi podobnost trigramov, če je na voljo, z indeksom, in če ni, se vrni na trenutno iskanje.
Korak za korakom
- Zapišite, kaj ljudje iščejo. Katera polja (naslov, opis, oznake, ime)? Kateri filtri? Če lahko, vprašajte nekaj pravih uporabnikov.
- Začnite na strežniku. Dodajte API pot, ki sprejme poizvedbo in filtre ter vrne eno stran rezultatov. Ne nalagajte vsega v brskalnik.
- Uveljavite dovoljenja v poizvedbi. Če uporabniki vidijo samo svoje zapise ali samo objavljene, mora ta pogoj biti v isti poizvedbi kot iskanje.
- Dodajte stranjenje že od začetka — številke strani ali „naloži več“.
- Stanje iskanja postavite v URL (na primer
?q=vrt&city=leeds). Povezave se lahko delijo, gumb nazaj deluje, iskalniki pa lahko indeksirajo filtrirane strani, če to želite. - Zamaknite iskanje med tipkanjem. Po tem, ko nehate tipkati, počakajte nekaj sto milisekund, preden poizvedujete, da ne pošiljate zahtevka za vsak pritisk tipke.
- Dodajte indekse, ko veste, po katerih stolpcih filtrirate in iščete.
- Nadgradite na polnobesedilno iskanje, nato na mehko ujemanje, nato na gostovan iskalnik — samo takrat, ko preprostejši korak ne zadošča pravim uporabnikom.
- Preizkusite z realističnimi podatki: stotine ali tisoči vrstic, nenavadni znaki, prazne poizvedbe, zelo dolge poizvedbe, drugi jeziki, če jih podpirate.
Pogoste napake
- Nalaganje celotne tabele v brskalnik. Za 50 elementov je v redu, za 50.000 pa boleče, poleg tega razkrije vsak zapis — tudi tistega, ki ga uporabnik ne bi smel videti.
- Iskanje, ki ignorira dovoljenja. Iskanje je pogosta puščica za uhajanje podatkov: zasebni ali osnutek zapisa se pokaže, ker je poizvedba pozabila pogoj „samo moji“ ali „samo objavljeni“.
- Gradnja SQL iz surovega vnosa uporabnika. Vedno uporabljajte parametrizirane poizvedbe. Graditelj z UI jih običajno uporablja, vendar preverite, če vidite nize, zlepljene skupaj.
- Ni praznega stanja. „Ni rezultatov“ s predlogom (počistite filtre, preverite črkovanje) ljudi zadrži, da ne odidejo.
- Ni indeksov. Iskanje se zdi v redu s testnimi podatki in se upočasni, ko rastejo pravi podatki.
- Takojšen skok na iskalno storitev. Potem morate hraniti drugo kopijo podatkov v sinhroni, obravnavati brisanja in zavarovati še en nabor ključev — pogosto brez vidne koristi.
- Pozabljen mobilni telefon. Filtri se morajo prilegati na telefon; običajno deluje spustni predal ali zložljiv panel bolje kot stranska vrstica.
Kontrolni seznam
- Veste, katera polja se iščejo in kateri filtri obstajajo
- Iskanje poteka na strežniku in vrača stranjene rezultate
- Poizvedba uveljavlja ista dovoljenja kot ostala aplikacija
- Vnos uporabnika je podan kot parameter, nikoli zlepljen v SQL
- Stanje iskanja je v URL-ju
- Tipkanje je zamaknjeno (debounce)
- Iskani in filtrirani stolpci so indeksirani
- Prazna stanja, stanja brez rezultatov in napake so jasna
- Preizkušeno z realističnimi količinami podatkov in neurejenim vnosom
Dodajanje iskanja z Mythexom
V aplikaciji, zgrajeni na Mythexu, podatki ponavadi živijo v lastni Postgres bazi podatkov projekta, zato lahko začnete s pozivi zgoraj: najprej ujemanje vzorcev, nato polnobesedilno iskanje Postgresa, ko potrebujete razvrščanje. Če želite gostovan iskalnik, prinesite svoj račun in ključ, shranite ga kot skrivnost projekta in agenta prosite, naj indeksira in poizveduje iz strežnika, kot je opisano v Integrirajte poljuben API.
Iskanje je jedro mnogih aplikacij: glejte kako zgraditi spletni imenik, kako zgraditi oglasno desko za delo in kako zgraditi tržnico, kako se uklopi v preostanek izdelka.
Vprašanja
Kako najlažje dodam iskanje v aplikacijo?
Če so vaši podatki v bazi, je najlažji začetek strežniška pot, ki filtrira vrstice z neobčutljivim ujemanjem velikosti črk na nekaj stolpcih. Za majhen seznam, ki je že naložen v brskalniku, je filtriranje v brskalniku še enostavnejše.
Ali za iskanje potrebujem Algolio ali Elasticsearch?
Na začetku ponavadi ne. Polnobesedilno iskanje Postgresa dobro obvladuje ujemanje besed, razvrščanje in od tisoč do milijonov vrstic. Gostovan iskalnik se splača, ko potrebujete močno toleranco na tipkarske napake, takojšnje rezultate med tipkanjem nad velikimi podatki ali napredno nastavljanje relevantnosti.
Zakaj moje iskanje ne najde rezultatov s tipkarskimi napakami?
Osnovno ujemanje in standardno polnobesedilno iskanje iščeta besede, kot so vtipkane (ali njihove korene), zato napačno črkovanje ne najde ničesar. Potrebujete mehko ujemanje, na primer podobnost trigramov v Postgresu ali iskalnik s toleranco na tipkarske napake.
Ali naj se iskanje izvaja v brskalniku ali na strežniku?
Na strežniku za vse, kar presega majhen javni seznam. Iskanje na strežniku se lepo skalira, upošteva dovoljenja in ne pošilja celotnih podatkov vsakemu obiskovalcu.