Ako pridať vyhľadávanie do aplikácie: od filtrov po fulltext
Na pridanie vyhľadávania do aplikácie začnite s najjednoduchším riešením, ktoré funguje: vyhľadávacie pole, ktoré volá serverovú trasu, a ta filtruje riadky vašej databázy porovnaním dotazu s niekoľkými stĺpcami, plus filtre pre veci ako kategória alebo cena. Keď to nestačí — potrebujete zoradenie podľa relevancie, skracovanie slov na kmene alebo veľa záznamov — prejdite na fulltextové vyhľadávanie vašej databázy a na hostovaný vyhľadávací nástroj sa prepnite, len ak potrebujete silnú toleranciu voči preklepom alebo okamžité výsledky nad veľmi veľkými dátami. Bez ohľadu na voľbu musí vyhľadávanie rešpektovať oprávnenia: používatelia nikdy nesmú nájsť záznamy, ktoré nesmú vidieť.
Čo „vyhľadávanie“ znamená pre vašu aplikáciu
Vyhľadávanie zahŕňa niekoľko rôznych vecí a väčšina aplikácií potrebuje viac než jednu:
- Vyhľadávanie kľúčových slov: textové pole — „nájsť inzeráty so slovom ‚záhrada‘“.
- Filtre: štruktúrované voľby — kategória, mesto, cenové rozpätie, dátum, stav.
- Zoradenie: najnovšie, najlacnejšie, najrelevantnejšie.
- Automatické dopĺňanie: návrhy počas písania.
- Tolerancia voči preklepom: „restauarcia“ stále nájde „reštaurácia“.
Pre adresár, pracovnú ponuku alebo obchod často záležia viac filtre než textové pole. Pred výberom nástroja rozhodnite, ktoré z toho skutočne potrebujete.
Vaše možnosti
| Prístup | Ako funguje | Vhodné pre | Limity |
|---|---|---|---|
| Filtrovanie v prehliadači | Načítať zoznam a filtrovať ho v JavaScripte | Malé verejné zoznamy (niekoľko stoviek položiek) | Posiela všetky dáta každému návštevníkovi; pri veľkých zoznamoch pomalé |
| Porovnanie vzoru v databáze | Serverový dotaz typu „názov obsahuje text“, bez ohľadu na veľkosť písmen | Malé až stredné aplikácie, administračné nástroje | Žiadne zoradenie podľa relevancie; môže byť pomalé na veľkých tabuľkách; bez kmeňovania |
| Fulltextové vyhľadávanie v databáze | Postgres indexuje slová a zoraďuje zhody podľa relevancie | Väčšina aplikácií s veľkým objemom obsahu | Slabé pri preklepoch, pokiaľ nepridáte fuzzy porovnanie |
| Fuzzy porovnanie (trigramy) | Postgres porovnáva podobnosť sekvencií znakov | Mená, krátke polia, tolerancia voči preklepom | Vyžaduje rozšírenie a index; ladenie si vyžiada čas |
| Hostovaný vyhľadávací nástroj | Samostatná služba indexuje vaše dáta (Algolia, Meilisearch, Typesense, Elasticsearch a ďalšie) | Veľké katalógy, okamžité vyhľadávanie, silná tolerancia voči preklepom | Ďalšia služba na synchronizáciu, platenie a zabezpečenie |
Ak vaše dáta už žijú v Postgrese, jeho vstavané fulltextové vyhľadávanie je silný stredný variant. Rozdelí text na slová, zredukuje ich na kmene (takže „running“ sa zhoduje s „run“), ignoruje bežné slová a dokáže zoradiť výsledky podľa toho, ako dobre sa zhodujú. So správnym indexom zostáva rýchly aj na veľkých tabuľkách.
Príkladové prompty
Jednoduchý začiatok:
Pridaj k stránke so zoznamom inzerátov vyhľadávacie pole a filtre. Vyhľadávanie má porovnávať dotaz s názvom a popisom bez ohľadu na veľkosť písmen. Filtre: kategória (rozbaľovací zoznam), mesto (rozbaľovací zoznam) a maximálna cena. Vyhľadávanie rob na serveri pomocou stránkovanej API trasy, 20 výsledkov na stránku. Vyhľadávanie a filtre drž v URL, aby sa výsledky dali zdieľať a aby fungovalo tlačidlo späť. Keď nič nezodpovedá, zobraz priateľský prázdny stav.
Prechod na fulltextové vyhľadávanie:
Prepni vyhľadávanie inzerátov na fulltextové vyhľadávanie Postgres nad názvom (s vyššou váhou) a popisom. Pridaj správny index, zoraď výsledky podľa relevancie a zachovaj existujúce filtre a stránkovanie. Neupravuj žiadne existujúce dáta.
Tolerancia voči preklepom pri menách:
Pridaj fuzzy porovnanie názvu firmy, aby aj malé preklepy našli výsledky. Použi podobnosť trigramov, ak je dostupná, s indexom, a ak nie, vráť sa k súčasnému vyhľadávaniu.
Postup krok za krokom
- Zapíšte, čo ľudia hľadajú. Ktoré polia (názov, popis, značky, meno)? Ktoré filtre? Ak môžete, opýtajte sa niekoľkých skutočných používateľov.
- Začnite na serveri. Pridajte API trasu, ktorá prijme dotaz a filtre a vráti jednu stránku výsledkov. Nenačítavajte všetko do prehliadača.
- Uplatnite oprávnenia v dotaze. Ak používatelia vidia len svoje záznamy alebo len publikované, táto podmienka patrí do rovnakého dotazu ako vyhľadávanie.
- Pridajte stránkovanie od prvého dňa — čísla strán alebo „načítať viac“.
- Vložte stav vyhľadávania do URL (napríklad
?q=garden&city=leeds). Zdieľateľné odkazy, funkčné tlačidlo späť a vyhľadávače môžu prechádzať filtrované stránky, ak ich chcete indexovať. - Oneskorte vyhľadávanie pri písaní. Po skončení písania počkajte niekoľko stoviek milisekúnd pred dotazom, aby ste neposielali požiadavku pri každom stlačení klávesu.
- Pridajte indexy, keď viete, podľa ktorých stĺpcov filtrujete a vyhľadávate.
- Prejdite na vyššiu úroveň — fulltextové vyhľadávanie, potom fuzzy porovnanie, potom hostovaný nástroj — len vtedy, keď jednoduchší krok zlyhá pri skutočných používateľoch.
- Testujte s realisticky vyzerajúcimi dátami: stovky alebo tisíce riadkov, nezvyčajné znaky, prázdne dotazy, veľmi dlhé dotazy, ďalšie jazyky, ak ich podporujete.
Časté chyby
- Načítanie celej tabuľky do prehliadača. Pre 50 položiek v poriadku, pre 50 000 bolestivé, a odhalí každý záznam — vrátane tých, ktoré používateľ nemá vidieť.
- Vyhľadávanie, ktoré ignoruje oprávnenia. Vyhľadávanie je častý únik: súkromný alebo koncept záznamu sa zobrazí, pretože dotaz zabudol na podmienku „len moje“ alebo „len publikované“.
- Skladanie SQL zo surového vstupu používateľa. Vždy používajte parametrizované dotazy. Nástroj na tvorbu aplikácií pomocou AI to zvyčajne robí, ale skontrolujte, či nevidíte reťazce spájané dohromady.
- Chýbajúci prázdny stav. „Žiadne výsledky“ s návrhom (zrušiť filtre, skontrolovať pravopis) ľudí udrží, aby neodišli.
- Chýbajúce indexy. Vyhľadávanie vyzerá dobre s testovacími dátami a spomaľuje, ako rastú skutočné dáta.
- Okamžitý skok na vyhľadávaciu službu. Potom musíte udržiavať druhú kópiu dát v synchronizácii, riešiť mazanie a zabezpečiť ďalšiu sadu kľúčov — často bez viditeľného zisku.
- Zabudnutie na mobil. Filtre musia sa zmestiť na telefón; zásuvka filtrov alebo rozbaliteľný panel zvyčajne funguje lepšie než bočný panel.
Kontrolný zoznam
- Viete, ktoré polia sa prehľadávajú a ktoré filtre existujú
- Vyhľadávanie beží na serveri a vracia stránkované výsledky
- Dotaz presadzuje rovnaké oprávnenia ako zvyšok aplikácie
- Vstup používateľa sa posiela ako parametre, nikdy sa nelepí do SQL
- Stav vyhľadávania je v URL
- Písanie je oneskorené (debounce)
- Prehľadávané a filtrované stĺpce sú indexované
- Prázdny stav, stav bez výsledkov a stav chyby sú jasné
- Otestované s realistickými objemami dát a neupraveným vstupom
Pridanie vyhľadávania s Mythex
V aplikácii postavenej na Mythex dáta obvykle žijú v Postgres databáze projektu, takže môžete začať s vyššie uvedenými promptami: najprv porovnanie vzoru, potom fulltextové vyhľadávanie v Postgrese, keď potrebujete zoradenie podľa relevancie. Ak chcete hostovaný vyhľadávací nástroj, prineste si vlastný účet a kľúč, uložte ho ako tajomstvo projektu a požiadajte agenta, aby ho indexoval a dotazoval zo servera, ako je popísané v článku Integrácia ľubovoľného API.
Vyhľadávanie je jadrom mnohých aplikácií: pozrite si, ako sa hodí do zvyšku produktu, v článkoch ako vytvoriť webový adresár, ako vytvoriť portál s pracovnými ponukami a ako vytvoriť tržisko.
Otázky
Aký je najjednoduchší spôsob, ako pridať vyhľadávanie do aplikácie?
Ak sú vaše dáta v databáze, najjednoduchší začiatok je serverová trasa, ktorá filtruje riadky porovnaním textu bez ohľadu na veľkosť písmen v niekoľkých stĺpcoch. Pre malý zoznam, ktorý je už načítaný v prehliadači, je filtrovanie v prehliadači ešte jednoduchšie.
Potrebujem na vyhľadávanie Algolia alebo Elasticsearch?
Zvyčajne nie hneď na začiatku. Fulltextové vyhľadávanie v Postgrese dobre zvláda zhodu slov, rozdeľovanie výsledkov podľa relevancie a tisíce až milióny riadkov. Hostovaný vyhľadávací nástroj sa oplatí, keď potrebujete silnú toleranciu voči preklepom, okamžité výsledky pri písaní nad veľkými dátami alebo pokročilé ladenie relevancie.
Prečo moje vyhľadávanie nenájde výsledky s preklepmi?
Základné porovnanie a štandardné fulltextové vyhľadávanie hľadajú slová tak, ako boli napísané (alebo ich kmene), takže preklep ich minie. Potrebujete fuzzy porovnávanie, napríklad podobnosť trigramov v Postgrese alebo vyhľadávací nástroj s toleranciou voči preklepom.
Má vyhľadávanie bežať v prehliadači alebo na serveri?
Na serveri pre všetko, čo presahuje malý verejný zoznam. Vyhľadávanie na serveri sa škáluje, rešpektuje oprávnenia a neposiela celú vašu databázu každému návštevníkovi.