Kaip pridėti paiešką į savo programėlę: nuo paprastų filtrų iki viso teksto paieškos
Kad pridėtumėte paiešką į programėlę, pradėkite nuo paprasčiausio veikiančio dalyko: paieškos lauko, kuris kviečia serverio maršrutą, filtruoja jūsų duomenų bazės eilutes pagal užklausos atitikimą keliuose stulpeliuose, ir papildomų filtrų kategorijai ar kainai. Kai to nepakanka – reikia rezultatų reitingavimo, žodžių šaknų atpažinimo ar daug įrašų – perjunkite į duomenų bazės viso teksto paiešką, o talpinamą paieškos variklį naudokite tik tada, kai reikia stiprios klaidų tolerancijos ar momentinių rezultatų labai dideliuose duomenyse. Kad ir ką pasirinktumėte, paieška turi paisyti teisių: vartotojai niekada neturėtų rasti įrašų, kurių nemato.
Ką reiškia „paieška“ jūsų programėlei
Paieška apima keletą skirtingų dalykų, ir daugumai programėlių reikia daugiau nei vieno:
- Raktažodžių paieška: teksto laukas – „rasti skelbimus, kuriuose minimas „sodas““.
- Filtrai: struktūruoti pasirinkimai – kategorija, miestas, kainų intervalas, data, būsena.
- Rikiavimas: naujausi, pigiausi, svarbiausi.
- Automatinis pasiūlymas: pasiūlymai rašant.
- Klaidų tolerancija: „restuarant“ vis tiek randa „restaurant“.
Katalogui, darbo skelbimų lentai ar parduotuvei filtrai dažnai svarbesni nei teksto laukas. Prieš renkantis įrankį nuspręskite, ko iš tikrųjų reikia.
Jūsų variantai
| Būdas | Kaip veikia | Geriausiai tinka | Apribojimai |
|---|---|---|---|
| Filtravimas naršyklėje | Įkeliate sąrašą ir filtruojate JavaScript | Maži vieši sąrašai (keli šimtai įrašų) | Visus duomenis siunčia kiekvienam lankytojui; didelius sąrašus lėtai |
| Duomenų bazės šablono atitikimas | Serverio užklausa tipo „pavadinime yra tekstas“, nepriklausomai nuo raidžių dydžio | Mažos ir vidutinės programėlės, administravimo įrankiai | Jokio reitingavimo; gali sulėtėti didelėse lentelėse; jokio šaknų atpažinimo |
| Duomenų bazės viso teksto paieška | Postgres indeksuoja žodžius ir reitinguoja atitikmenis | Daugumai turinio gausių programėlių | Silpna su klaidomis, nebent pridėsite neaiškų atitikimą |
| Neaiškus atitikimas (trigramos) | Postgres lygina simbolių sekas dėl panašumo | Vardai, trumpi laukai, klaidų tolerancija | Reikia plėtinio ir indekso; reikia derinti |
| Talpinamas paieškos variklis | Atskira paslauga indeksuoja jūsų duomenis (Algolia, Meilisearch, Typesense, Elasticsearch ir kiti) | Dideli katalogai, momentinė paieška, stipri klaidų tolerancija | Kita paslauga, kurią reikia sinchronizuoti, apmokėti ir apsaugoti |
Jei jūsų duomenys jau saugomi Postgres, jo įmontuota viso teksto paieška yra stiprus vidurio variantas. Ji skaido tekstą į žodžius, redukuoja juos iki šaknų (taip „running“ atitinka „run“), ignoruoja dažnus žodžius ir gali rikiuoti rezultatus pagal atitikimo kokybę. Su tinkamu indeksu ji išlieka greita didelėse lentelėse.
Pavyzdiniai raginimai
Paprastas startas:
Pridėk paieškos lauką ir filtrus skelbimų puslapyje. Paieška turi atitikti užklausą pavadinime ir aprašyme, nepriklausomai nuo raidžių dydžio. Filtrai: kategorija (išskleidžiamasis sąrašas), miestas (išskleidžiamasis sąrašas) ir didžiausia kaina. Paiešką vykdyk serveryje su puslapiuotu API maršrutu, 20 rezultatų puslapyje. Paieškos ir filtrų būseną laikyk URL, kad rezultatais būtų galima dalytis ir veiktų grįžimo mygtukas. Kai nieko nerasta, rodyk draugišką tuščios būsenos pranešimą.
Perėjimas prie viso teksto paieškos:
Perjunk skelbimų paiešką į Postgres viso teksto paiešką pavadinime (aukštesnis svoris) ir aprašyme. Pridėk tinkamą indeksą, rikiuok rezultatus pagal svarbą ir palik esamus filtrus bei puslapiavimą. Nekeisk jokių esamų duomenų.
Klaidų tolerancija vardams:
Pridėk neaiškų atitikimą pagal verslo pavadinimą, kad nedidelės klaidos vis tiek rastų rezultatus. Naudok trigramų panašumą, jei yra, su indeksu, o jei nėra – grįžk prie dabartinės paieškos.
Žingsnis po žingsnio
- Surašykite, ko žmonės ieško. Kuriuose laukuose (pavadinimas, aprašymas, žymos, vardas)? Kokie filtrai? Jei galite, paklauskite kelių tikrų vartotojų.
- Pradėkite nuo serverio. Pridėkite API maršrutą, kuris priima užklausą ir filtrus ir grąžina vieną rezultatų puslapį. Nekraukite visko į naršyklę.
- Taikykite teises užklausoje. Jei vartotojai mato tik savo įrašus ar tik paskelbtus, ta sąlyga turi būti toje pačioje užklausoje kaip ir paieška.
- Pridėkite puslapiavimą nuo pat pradžios – puslapių numerius arba „įkelti daugiau“.
- Laikykite paieškos būseną URL (pavyzdžiui
?q=sodas&city=vilnius). Taip nuorodomis galima dalytis, veikia grįžimo mygtukas, o paieškos robotai gali indeksuoti filtruotus puslapius, jei to norite. - Atidėkite paiešką rašant. Palaukite kelis šimtus milisekundžių po to, kai nustojote rašyti, prieš siųsdami užklausą, kad nesiųstumėte užklausos kiekvienam klavišui.
- Pridėkite indeksus, kai žinote, pagal kuriuos stulpelius filtruojate ir ieškote.
- Tobulinkite: viso teksto paieška, tada neaiškus atitikimas, tada talpinamas variklis – tik tada, kai paprastesnis žingsnis nepatenkina tikrų vartotojų.
- Testuokite su panašiais į realius duomenimis: šimtais ar tūkstančiais eilučių, keistais simboliais, tuščiomis ir labai ilgomis užklausomis, kitomis kalbomis, jei jas palaikote.
Dažniausios klaidos
- Visos lentelės įkėlimas į naršyklę. Tinka 50 įrašų, bet skauda su 50 000, ir atskleidžia kiekvieną įrašą – įskaitant tuos, kurių vartotojas neturėtų matyti.
- Paieška, ignoruojanti teises. Paieška – dažnas nutekėjimas: privatus ar juodraštinis įrašas pasirodo, nes paieškos užklausa pamiršo sąlygą „tik mano“ ar „tik paskelbti“.
- SQL kūrimas iš neapdorotos vartotojo įvesties. Visada naudokite parametrizuotas užklausas. DI kūrimo įrankis paprastai taip daro, bet patikrinkite, ar nematote eilučių, sulipdytų kartu.
- Jokios tuščios būsenos. „Rezultatų nerasta“ su pasiūlymu (išvalyti filtrus, patikrinti rašybą) neleidžia žmonėms išeiti.
- Jokių indeksų. Paieška su testiniais duomenimis atrodo gerai, bet lėtėja augant tikriems duomenims.
- Šuolis tiesiai prie paieškos paslaugos. Tada turite laikyti antrą duomenų kopiją sinchronizuotą, tvarkyti trynimus ir apsaugoti dar vieną raktų rinkinį – dažnai be matomos naudos.
- Mobiliųjų pamiršimas. Filtrai turi tilpti telefone; filtrų stalčius ar sutraukiamas skydelis paprastai veikia geriau nei šoninė juosta.
Kontrolinis sąrašas
- Žinote, kurie laukai ieškomi ir kokie filtrai egzistuoja
- Paieška vykdoma serveryje ir grąžina puslapiuotus rezultatus
- Užklausa taiko tas pačias teises kaip ir visa kita programėlė
- Vartotojo įvestis perduodama kaip parametrai, niekada nesulipdoma į SQL
- Paieškos būsena laikoma URL
- Rašymas atidedamas (debounce)
- Ieškomi ir filtruojami stulpeliai indeksuoti
- Tuščios, be rezultatų ir klaidų būsenos aiškios
- Išbandyta realistiškais duomenų kiekiais ir netvarkingąja įvestimi
Paieškos pridėjimas su Mythex
Programėlėje, sukurtoje su Mythex, duomenys paprastai saugomi projekto Postgres duomenų bazėje, todėl galite pradėti nuo aukščiau pateiktų raginimų: pirmiausia šablono atitikimas, o kai reikia reitingavimo – Postgres viso teksto paieška. Jei norite talpinamo paieškos variklio, naudokite savo paskyrą ir raktą, saugokite jį kaip projekto paslaptį ir paprašykite agento indeksuoti bei vykdyti užklausas iš serverio, kaip aprašyta Integruokite bet kokį API.
Paieška – daugelio programėlių pagrindas: žr. kaip sukurti katalogo svetainę, kaip sukurti darbo skelbimų lentą ir kaip sukurti rinką, kaip ji susijusi su likusiu produktu.
Klausimai
Koks lengviausias būdas pridėti paiešką į programėlę?
Jei duomenys yra duomenų bazėje, lengviausia pradžia – serverio maršrutas, kuris filtruoja eilutes, ieškodamas nepriklausomai nuo raidžių dydžio sutapimų keliuose stulpeliuose. Mažam sąrašui, kuris jau įkeltas naršyklėje, filtravimas naršyklėje dar paprastesnis.
Ar paieškai man reikia Algolia ar Elasticsearch?
Dažniausiai iš pradžių ne. Postgres viso teksto paieška gerai tvarko žodžių atitikimą, rikiavimą ir nuo tūkstančių iki milijonų eilučių. Talpinamas paieškos variklis apsimoka, kai reikia stiprios klaidų tolerancijos, rezultatų iš karto rašant didelėms duomenų apimtims ar sudėtingo svarbos derinimo.
Kodėl mano paieška neranda rezultatų su klaidomis?
Paprastas atitikimas ir standartinė viso teksto paieška ieško žodžių tokių, kokie įvesti (ar jų šaknų), todėl klaidinga rašyba nerandama. Reikia neaiškaus atitikimo, pavyzdžiui trigramų panašumo Postgres ar paieškos variklio su klaidų tolerancija.
Ar paieška turėtų vykti naršyklėje ar serveryje?
Serveryje visa, kas viršija mažą viešą sąrašą. Paieška serveryje gerai skalėjasi, paisto teises ir nesiunčia visų jūsų duomenų kiekvienam lankytojui.