Takéfulltext, FTS, textové vyhledáváníPokročilý
Definice
Fulltextové vyhledávání je způsob hledání v textových dokumentech, který neporovnává jen přesný řetězec znaků, ale pracuje s tokeny, jazykovými tvary a pořadím slov. Vyhledávač si obvykle vytváří index, podle dotazu najde kandidáty a seřadí výsledky podle relevance, případně zvýrazní nalezené pasáže.
Proč nestačí obyčejné LIKE
Fulltextové vyhledávání řeší situace, kdy uživatel nehledá přesnou hodnotu pole, ale obsah dokumentu: článek, popis produktu, komentář, smlouvu nebo záznam v nápovědě. Porovnání typu LIKE '%telefon%' najde jen doslovný výskyt řetězce a často špatně pracuje s diakritikou, pořadím slov, skloňováním nebo překlepy. Fulltext naproti tomu text rozřeže na tokeny, odstraní méně významná slova a uloží vazbu mezi slovem a dokumentem.
Výsledek není jen seznam shod. Fulltextové vyhledávání se snaží odhadnout, které dokumenty jsou pro dotaz nejdůležitější. Dokument s hledaným slovem v titulku může být výš než dokument, kde se stejné slovo objeví jednou v patičce. Základní myšlenka souvisí s indexem, ale fulltextový index je specializovaný na jazykový obsah.
Co fulltextový index ukládá
Fulltextový index bývá často invertovaný index: místo „dokument obsahuje tato slova“ ukládá „slovo se vyskytuje v těchto dokumentech“. Modernější implementace mohou evidovat také pozice slov, váhy polí, frekvenci výskytu a normalizované tvary. Díky pozicím lze hledat fráze, měřit vzdálenost slov a zvýraznit nalezené úryvky.
Jazyková vrstva je důležitá hlavně u češtiny. Tokenizace musí rozumně rozdělit větu, stemming nebo lemmatizace mohou sloučit tvary jako „produkt“, „produktu“ a „produktem“. Stop slova typu „a“, „nebo“ či „v“ se často vynechávají, protože sama o sobě málo pomáhají rozlišit dokumenty.
Relevance místo pouhé shody
Fulltextové vyhledávání obvykle řadí výsledky podle skóre. Skóre může zohlednit četnost hledaného výrazu, vzácnost slova v celé kolekci, délku dokumentu, pole dokumentu a případně obchodní pravidla. E-shop může zvýšit váhu dostupných produktů, dokumentace může zvýšit váhu aktuálních stránek.
Fulltext není totéž co sémantické vyhledávání. Fulltext výborně nachází výrazy, fráze a jejich jazykové varianty. Sémantické vyhledávání nebo RAG se snaží pracovat i s významovou podobností, takže může najít odpověď bez stejného slovníku. V praxi se oba přístupy často kombinují.
Dva příklady z praxe
Hledání v e-shopu
E-shop má produkty s názvem, značkou a popisem. Zákazník zadá „bezdrátová sluchátka černá“ a fulltextový index vrátí položky, kde se část dotazu vyskytuje v názvu i popisu. Výsledek se seřadí tak, aby produkty s přesnou shodou v názvu byly před podobnými doplňky.
SELECT id, title
FROM articles
WHERE to_tsvector('simple', title || ' ' || body)
@@ plainto_tsquery('simple', 'rychlé vyhledávání')
ORDER BY ts_rank(
to_tsvector('simple', title || ' ' || body),
plainto_tsquery('simple', 'rychlé vyhledávání')
) DESC;Interní znalostní báze
Týmová dokumentace obsahuje stovky návodů, incidentů a rozhodnutí. Vývojář hledá „timeout po deployi“ a fulltext najde i starší záznam, kde se píše o „časovém limitu při nasazení“. Správně nastavené váhy pomohou posunout aktuální runbook před starou diskusi.
Kam patří v architektuře aplikace
Databázový fulltext v PostgreSQL, SQLite nebo MongoDB stačí pro menší a střední aplikace, kde vyhledávání není samostatný produkt. Specializovaný vyhledávací engine se hodí při velkém objemu dat, složitém řazení, fasetách, našeptávání, analytice dotazů nebo více jazykových verzích. Návrh fulltextu proto není jen otázka syntaxe dotazu, ale také rozhodnutí o aktualizaci indexu, latenci, kvalitě relevance a provozních nákladech.
Příklady z praxe
Hledání v e-shopu
E-shop má produkty s názvem, značkou a popisem. Zákazník zadá „bezdrátová sluchátka černá“ a fulltextový index vrátí položky, kde se část dotazu vyskytuje v názvu i popisu. Výsledek se seřadí tak, aby produkty s přesnou shodou v názvu byly před podobnými doplňky.
Interní znalostní báze
Týmová dokumentace obsahuje stovky návodů, incidentů a rozhodnutí. Vývojář hledá „timeout po deployi“ a fulltext najde i starší záznam, kde se píše o „časovém limitu při nasazení“. Správně nastavené váhy pomohou posunout aktuální runbook před starou diskusi.
SELECT id, title FROM articles WHERE to_tsvector('simple', title || ' ' || body) @@ plainto_tsquery('simple', 'rychlé vyhledávání') ORDER BY ts_rank( to_tsvector('simple', title || ' ' || body), plainto_tsquery('simple', 'rychlé vyhledávání') ) DESC;
Časté omyly
- MýtusFulltext je jen LIKE s procenty.
- Ve skutečnostiFulltextové vyhledávání používá index a jazykové zpracování textu, takže se nechová jako obyčejné porovnání podřetězce. LIKE může být vhodné pro jednoduché kontroly, ale fulltext řeší i řazení podle relevance a práci s delšími dokumenty.
- MýtusFulltext automaticky chápe význam dotazu.
- Ve skutečnostiFulltextové vyhledávání obvykle pracuje hlavně se slovy, jejich tvary a výskyty v dokumentech. Významovou podobnost řeší spíše vektorové nebo sémantické vyhledávání, případně kombinace více metod.
- MýtusČím víc výsledků fulltext vrátí, tím je lepší.
- Ve skutečnostiKvalita fulltextového vyhledávání se měří hlavně tím, zda uživatel rychle najde relevantní odpověď. Příliš mnoho slabých shod může být horší než kratší seznam dobře seřazených výsledků.
Časté dotazy
- Proč fulltextové vyhledávání nevrátí stejné výsledky jako SQL LIKE?
- Fulltextové vyhledávání vrací jiné výsledky než SQL LIKE, protože typicky neporovnává celý řetězec znak po znaku. Fulltext nejprve text rozdělí na tokeny, může odstranit nevýznamná slova, normalizovat tvary a potom hledat v indexu. SQL LIKE je užitečné pro jednoduché vzory, ale u dlouhých textů často škáluje hůř a neumí samo od sebe řadit podle relevance.
- Kdy fulltextové vyhledávání potřebuje vlastní vyhledávací engine?
- Fulltextové vyhledávání potřebuje samostatný vyhledávací engine hlavně tehdy, když databázový fulltext nestačí výkonem nebo funkcemi. Typickým signálem jsou miliony dokumentů, složité facety, našeptávání, mnoho jazyků, personalizované řazení nebo potřeba detailně ladit relevanci. Pro jednoduché hledání v článcích, produktech nebo interních záznamech bývá databázové řešení často levnější a provozně jednodušší.
- Jak se ve fulltextovém vyhledávání řeší čeština?
- Fulltextové vyhledávání v češtině musí řešit diakritiku, skloňování, časování a hranice slov. Praktická implementace proto často používá jazykový analyzátor, stemming, lemmatizaci nebo slovníky stop slov. Bez této vrstvy může dotaz najít jen přesné tvary a minout relevantní dokumenty. Kvalita podpory češtiny se mezi databázemi a vyhledávacími nástroji výrazně liší.
- Hodí se fulltextové vyhledávání pro přesné filtrování?
- Fulltextové vyhledávání se nehodí jako jediný mechanismus pro přesné filtrování podle strukturovaných hodnot. Cena, datum, stav objednávky, ID zákazníka nebo kategorie se obvykle filtrují běžnými databázovými podmínkami a indexy. Fulltext má smysl pro textový obsah a relevanci. Dobrá aplikace často spojí fulltextový dotaz s přesnými filtry nad metadaty.
Zdroje
- Chapter 12. Full Text Search(otevře se v novém okně)
- SQLite FTS5 Extension(otevře se v novém okně)
- Text Search(otevře se v novém okně)
- Unicode Standard Annex #29: Unicode Text Segmentation(otevře se v novém okně)