Jak přidat do aplikace vyhledávání: od jednoduchých filtrů po fulltextové hledání
Pro přidání vyhledávání do aplikace začněte tím nejjednodušším, co funguje: pole pro hledání, které volá serverovou trasu. Ta vyfiltruje řádky databáze podle shody dotazu s několika sloupci a přidá filtry, například kategorii nebo cenu. Až to nebude stačit, protože potřebujete řazení podle relevance, skloňování slov nebo hodně záznamů, přejděte na fulltextové hledání vaší databáze. Hostovaný vyhledávací engine vyberte jen tehdy, když potřebujete silnou toleranci překlepů nebo okamžité výsledky nad velmi velkými daty. Ať vyberete cokoli, vyhledávání musí respektovat oprávnění: uživatelé nikdy nesmějí najít záznamy, které nesmějí vidět.
Co pro vaši aplikaci znamená „vyhledávání“
Vyhledávání zahrnuje několik různých věcí a většina aplikací potřebuje víc než jednu:
- Hledání podle klíčových slov: textové pole, například „najdi inzeráty se slovem ‚zahrada‘“.
- Filtry: strukturované volby, jako kategorie, město, rozsah cen, datum nebo stav.
- Řazení: nejnovější, nejlevnější, nejrelevantnější.
- Automatické doplňování: návrhy při psaní.
- Tolerance překlepů: „restauraci“ stále najde „restaurace“.
U adresáře, pracovní nabídky nebo obchodu jsou často důležitější filtry než textové pole. Než vyberete nástroj, rozhodněte, které z těchto věcí opravdu potřebujete.
Vaše možnosti
| Přístup | Jak funguje | Vhodné pro | Omezení |
|---|---|---|---|
| Filtrování v prohlížeči | Načte seznam a filtruje ho v JavaScriptu | Malé veřejné seznamy (několik stovek položek) | Posílá všechna data každému návštěvníkovi; s velkými seznamy pomalé |
| Shoda vzoru v databázi | Serverový dotaz typu „název obsahuje text“, bez ohledu na velikost písmen | Malé až střední aplikace, administrační nástroje | Žádné řazení podle relevance; na velkých tabulkách může být pomalé; bez skloňování |
| Fulltextové hledání v databázi | Postgres indexuje slova a řadí shody podle relevance | Většina aplikací s hodně obsahu | Slabé na překlepy, pokud nepřidáte fuzzy shodu |
| Fuzzy shoda (trigramy) | Postgres porovnává podobnost sekvencí znaků | Jména, krátká pole, tolerance překlepů | Potřebuje rozšíření a index; ladění zabere čas |
| Hostovaný vyhledávací engine | Samostatná služba indexuje vaše data (Algolia, Meilisearch, Typesense, Elasticsearch a další) | Velké katalogy, okamžité hledání, silná tolerance překlepů | Další služba k synchronizaci, zaplacení a zabezpečení |
Pokud vaše data už žijí v Postgresu, jeho vestavěné fulltextové hledání je silný střední stupeň. Rozdělí text na slova, zredukuje je na kořeny (takže „běží“ najde „běh“), ignoruje běžná slova a dokáže řadit výsledky podle kvality shody. Se správným indexem zůstává rychlé i na velkých tabulkách.
Příklady promptů
Jednoduchý začátek:
Přidej na stránku s inzeráty pole pro hledání a filtry. Hledání má porovnávat dotaz s názvem a popisem bez ohledu na velikost písmen. Filtry: kategorie (rozbalovací seznam), město (rozbalovací seznam) a maximální cena. Hledání dělej na serveru přes stránkované API, 20 výsledků na stránku. Drž hledání a filtry v adrese URL, aby šly výsledky sdílet a fungovalo tlačítko zpět. Když nic neodpovídá, ukaž přátelský prázdný stav.
Přechod na fulltextové hledání:
Přepni hledání inzerátů na fulltextové hledání Postgresu nad názvem (s vyšší váhou) a popisem. Přidej správný index, řaď výsledky podle relevance a zachovej stávající filtry a stránkování. Neměň žádná existující data.
Toleance překlepů u jmen:
Přidej fuzzy shodu na název firmy, aby i malé překlepy našly výsledky. Použij podobnost trigramů, pokud je k dispozici, s indexem, a pokud ne, vrať se k současnému hledání.
Krok za krokem
- Zapište, co lidé hledají. Která pole (název, popis, štítky, jméno)? Které filtry? Pokud můžete, zeptejte se několika skutečných uživatelů.
- Začněte na serveru. Přidejte API trasu, která přijme dotaz a filtry a vrátí jednu stránku výsledků. Nenačítejte všechno do prohlížeče.
- Uplatněte oprávnění v dotazu. Pokud uživatelé vidí jen své záznamy nebo jen publikované, ta podmínka patří do stejného dotazu jako hledání.
- Přidejte stránkování od prvního dne: čísla stránek nebo „načíst další“.
- Držte stav hledání v adrese URL (například
?q=zahrada&city=leeds). Sdílitelné odkazy, funkční tlačítko zpět a vyhledávače mohou procházet filtrované stránky, pokud to chcete. - Zpožďte hledání při psaní. Počkejte několik set milisekund, než přestanete psát, než odešlete dotaz, aby se neposílal požadavek na každý stisk klávesy.
- Přidejte indexy, jakmile víte, podle kterých sloupců filtrujete a hledáte.
- Přecházejte postupně: nejdřív fulltextové hledání, pak fuzzy shodu, pak hostovaný engine, a to jen tehdy, když jednodušší krok selže u skutečných uživatelů.
- Testujte na realistických datech: stovky nebo tisíce řádků, neobvyklé znaky, prázdné dotazy, velmi dlouhé dotazy, případně další jazyky, pokud je podporujete.
Časté chyby
- Načítání celé tabulky do prohlížeče. U 50 položek v pořádku, u 50 000 bolestivé, a navíc to odhalí každý záznam, včetně těch, které uživatel vidět nesmí.
- Hledání, které ignoruje oprávnění. Hledání je častý únik: soukromý nebo koncept záznamu se objeví, protože dotazu chybí podmínka „jen moje“ nebo „jen publikované“.
- Sestavování SQL z uživatelského vstupu. Vždy používejte parametrizované dotazy. AI nástroje to obvykle dělají, ale zkontrolujte, jestli nevidíte řetězce slepované dohromady.
- Žádný prázdný stav. Hláška „Žádné výsledky“ s návrhem (zrušte filtry, zkontrolujte pravopis) zabrání tomu, aby lidé odešli.
- Žádné indexy. Hledání s testovacími daty působí dobře a se skutečnými daty zpomaluje.
- Okamžitý skok na vyhledávací službu. Pak musíte držet druhou kopii dat v synchronizaci, řešit mazání a zabezpečit další sadu klíčů, často bez viditelného přínosu.
- Zapomenutí na mobil. Filtry se musí vejít na telefon; šuplík s filtry nebo sbalitelný panel obvykle funguje lépe než postranní panel.
Kontrolní seznam
- Víte, která pole se prohledávají a jaké filtry existují
- Hledání běží na serveru a vrací stránkované výsledky
- Dotaz vynucuje stejná oprávnění jako zbytek aplikace
- Uživatelský vstup se předává jako parametry, nikdy se nelepí do SQL
- Stav hledání je v adrese URL
- Psaní je zpožděno (debounce)
- Prohledávané a filtrované sloupce jsou indexované
- Prázdné, bezvýsledkové a chybové stavy jsou jasné
- Otestováno s realistickými objemy dat a nečistým vstupem
Přidání hledání v Mythexu
V aplikaci postavené na Mythexu data obvykle žijí v Postgres databázi projektu, takže můžete začít výše uvedenými prompty: nejdřív shoda vzoru, až budete potřebovat řazení, fulltextové hledání Postgresu. Pokud chcete hostovaný vyhledávací engine, přineste si vlastní účet a klíč, uložte ho jako tajný údaj projektu a požádejte agenta, aby ho indexoval a dotazoval ze serveru, jak je popsáno v Integrace libovolného API.
Hledání je jádrem mnoha aplikací. Jak zapadá do zbytku produktu, ukazují jak vytvořit webový adresář, jak vytvořit pracovní portál a jak vytvořit tržiště.
Otázky
Jaký je nejjednodušší způsob, jak přidat vyhledávání do aplikace?
Pokud jsou vaše data v databázi, nejsnazší začátek je serverová trasa, která filtruje řádky podle shody v několika sloupcích bez ohledu na velikost písmen. U malého seznamu, který je už načtený v prohlížeči, je filtrování přímo v prohlížeči ještě jednodušší.
Potřebuji pro vyhledávání Algolia nebo Elasticsearch?
Obvykle ne hned na začátku. Fulltextové hledání v Postgresu zvládá shodu slov, řazení podle relevance a tisíce až miliony řádků velmi dobře. Hostovaný vyhledávací engine se vyplatí, když potřebujete silnou toleranci překlepů, okamžité výsledky při psaní nad velkými daty nebo pokročilé ladění relevance.
Proč moje vyhledávání nenajde výsledky, když je v dotazu překlep?
Základní shoda a standardní fulltextové hledání hledají slova tak, jak jsou napsána (nebo jejich kořeny), takže překlep se minul. Potřebujete fuzzy shodu, například podobnost trigramů v Postgresu, nebo vyhledávací engine s tolerancí překlepů.
Má vyhledávání běžet v prohlížeči, nebo na serveru?
Na serveru u všeho, co přesahuje malý veřejný seznam. Vyhledávání na serveru se dobře škáluje, respektuje oprávnění a neposílá celou vaši datovou sadu každému návštěvníkovi.