Slovník pojmů

Fulltextové vyhledávání

Fulltext nehledá jen doslovný podřetězec. Připravuje text do vyhledávacího indexu, zpracuje dotaz a výsledky ohodnotí podle pravidel relevance.

Stručná definice

Hledání podle významných částí textu.

Fulltextové vyhledávání prohledává název, popis nebo celý dokument podle slov a jejich normalizovaných podob. Na rozdíl od přesného filtru může pracovat s více slovy, jejich pořadím a významností v kolekci a každému výsledku přiřadit skóre.

Může běžet přímo v relační databázi, v samostatném systému, jako je Elasticsearch, nebo jako kombinace obou přístupů. Elasticsearch je jeden možný nástroj, nikoli synonymum fulltextu.

Jaký problém řeší

Najít užitečný obsah i bez přesné znalosti uloženého textu.

Uživatel často nezná přesný název produktu ani tvar slov v popisu. Fulltext převede volný dotaz na hledatelné jednotky a dovolí aplikaci vrátit a seřadit více přibližně odpovídajících dokumentů.

  • hledání produktů podle názvu, popisu, značky a kategorie
  • prohledávání článků, dokumentace, ticketů nebo interních záznamů
  • hledání více slov bez požadavku na jeden doslovný souvislý řetězec
  • přesná fráze, prefix slova nebo opatrně nastavená tolerance překlepů
  • řazení podle relevance a vytvoření krátkého zvýrazněného úryvku s nalezenými výrazy

Praktický příklad

Dotaz „černá zimní bunda“ v e-shopovém katalogu.

Dokument produktu obsahuje název, popis, SKU, značku a kategorii. Název a popis se analyzují jako přirozený text, značka a kategorie mohou mít vedle textové podoby také přesnou hodnotu pro filtr. SKU se zpracovává samostatně: pomlčky, lomítka a kombinace písmen s čísly nejsou běžná česká slova a jazykový stemming by jejich hledání mohl poškodit.

Dotaz „černá zimní bunda“ analyzátor rozdělí na tokeny černá, zimní a bunda a normalizuje je stejnými pravidly jako dokumenty. Podle zvoleného českého zpracování může sjednotit velikost písmen, variantu s diakritikou nebo slovní tvary. Odstranění diakritiky, stop words a stemming či lemmatizace nejsou povinné kroky: každý z nich se zapíná jen tehdy, když na skutečných dotazech zlepšuje výsledky.

Vyhledávač v indexu najde dokumenty obsahující odpovídající tokeny. Skóre může zvýhodnit shodu v názvu proti popisu, více nalezených slov, vzácnější výraz nebo blízkost tokenů. Výsledek není objektivně „nejlepší“; je to pořadí podle zvolené funkce relevance, vah polí a případných businessových pravidel, které je nutné ověřovat na reálných dotazech.

Současně se použijí přesné filtry, například cena od 2 000 do 5 000 Kč a dostupnost skladem. Filtr neurčuje textovou podobnost a obvykle nemění skóre: pouze vyřadí nevyhovující kandidáty. Před nákupem aplikace ověří cenu a dostupnost v autoritativní databázi, protože samostatný vyhledávací index může být proti ní krátce opožděný.

Jak funguje

Dokumenty → analyzátor → index; dotaz → analýza → relevance → výsledky.

Následující textový tok je zároveň alternativou diagramu: stejná základní pravidla musí připravit dokumenty i uživatelský dotaz, aby vzniklé tokeny bylo možné porovnat.

  1. Dokumenty Aplikace vybere hledatelná pole a odliší přirozený text od přesných kódů, značek, cen a stavů.
  2. Analyzátor Tokenizer rozdělí text na tokeny; filtry je mohou převést na malá písmena, upravit diakritiku, stop words nebo slovní tvary.
  3. Fulltextový index Inverzní struktura vede od tokenu k dokumentům a může uchovat četnost a pozice potřebné pro fráze a skórování.
  4. Analýza dotazu Víceslovný dotaz se zpracuje kompatibilně s indexem a pravidla určí, zda musí odpovídat všechna slova, některá slova nebo přesná fráze.
  5. Shoda, skóre a filtry Index najde kandidáty, relevance je ohodnotí a přesné podmínky ceny, značky či dostupnosti omezí výsledek.
  6. Výsledky Aplikace seřadí položky podle skóre nebo zvoleného řazení a může vytvořit zvýrazněný úryvek; skóre samo nevysvětluje správnost businessových dat.

Hlavní části a principy

Kvalitu výsledků určuje index, analýza i způsob dotazování.

Fulltext není jeden univerzální algoritmus. Jednotlivá pole a druhy dotazů potřebují pravidla odpovídající jazyku a chování uživatelů.

Tokenizace a normalizace

Token je hledatelná jednotka, nejčastěji slovo. Tokenizer určí její hranice a normalizace sjednotí například velikost písmen. České hledání musí vědomě řešit diakritiku; bez testu nelze předpokládat, že každý analyzátor spojí „cerna“ s „černá“ správně.

Analyzátor a jazyk

Analyzátor je řetězec tokenizeru a následných filtrů. Stop words mohou vynechat velmi častá slova. Stemming zkracuje slova podle pravidel, lemmatizace hledá základní slovní tvar; ani jedna technika sama nezaručuje správnou češtinu a příliš agresivní nastavení slučuje nesouvisející výrazy.

Fulltextový a běžný databázový index

Běžný databázový index, například B-tree, vede od celé hodnoty nebo její uspořádané části k řádkům. Fulltextový index obvykle vede od analyzovaných tokenů k dokumentům. Specializovaný fulltextový index může být přitom technicky uložen přímo v databázi, například jako GIN nad textovou reprezentací v PostgreSQL.

Více slov, fráze, prefix a fuzzy matching

Dotaz může vyžadovat všechna slova, povolit jen některá nebo zvýšit skóre při větším počtu shod. Přesná fráze používá pořadí a pozice tokenů. Prefix hledá začátek tokenu. Fuzzy matching toleruje omezený počet znakových změn, ale je volitelný, dražší a při příliš širokém nastavení vrací nesouvisející výsledky.

Relevance a skóre

Skóre je číselný odhad shody pro konkrétní dotaz. Může zohlednit četnost výrazu, jeho vzácnost, délku dokumentu, pozici a váhu pole. Ladění relevance vyžaduje sadu reprezentativních dotazů, očekávaných výsledků a měření; samotné vyšší číslo není obecné hodnocení kvality dokumentu.

Fulltext, filtr a řazení

Fulltext odpovídá na otázku, které dokumenty textově odpovídají a jak silně. Filtr podle přesné značky, dostupnosti nebo číselného rozsahu pouze rozhodne ano či ne. Výsledky lze řadit podle relevance, ale také podle ceny nebo data; tím se původní pořadí podle skóre záměrně nahradí nebo zkombinuje.

Výhody, omezení a časté chyby

Lepší hledání přidává datový model, ladění a provozní odpovědnost.

Konkrétní přínosy

  • rychlé hledání více slov nad připravenou textovou kolekcí
  • řazení podle měřitelné relevance místo náhodného pořadí řádků
  • oddělení analyzovaného textu od přesných filtrů a identifikátorů
  • možnost přidat fráze, prefixy, zvýraznění nebo opatrnou toleranci překlepů podle potřeby

Omezení a chyby

  • považovat fulltext za totéž co LIKE nebo za běžný B-tree index
  • nasadit obecný analyzátor bez testu češtiny, diakritiky a produktových kódů
  • označit první pořadí podle skóre za objektivně nejlepší výsledky
  • zapnout široké fuzzy hledání pro všechny krátké dotazy
  • ignorovat aktualizaci indexu, neúspěšné zápisy a rozdíl proti primární databázi

Volba implementace

Začít požadovaným chováním, ne názvem technologie.

Výraz SQL LIKE '%text%' hledá doslovný vzor v původním řetězci. Neprovádí jazykovou analýzu ani běžné skórování relevance a úvodní wildcard často nevyužije obyčejný B-tree. Pro malou tabulku nebo jednoduchou administraci však může být přiměřený; fulltext není povinná náhrada každého LIKE.

PostgreSQL nabízí tsvector, tsquery, ranking a specializované indexy, MySQL index FULLTEXT s dotazy MATCH … AGAINST a SQLite rozšíření FTS5. Databázový fulltext může být nejjednodušší dostatečné řešení, pokud jeho jazykové možnosti, relevance a provoz odpovídají produktu.

Samostatný Elasticsearch se hodí pro rozsáhlejší index, vlastní analyzátory, kombinaci fulltextu s filtry a agregacemi nebo nezávislé škálování hledání. Přidává ale synchronizaci, monitoring a reindexaci. Primární databáze zůstává autoritativní pro cenu, sklad a objednávku; kombinované řešení musí počítat s dočasnou nekonzistencí.

Na co myslet

Vyhledávání se testuje jako uživatelská i datová funkce.

Správná odpověď není jen nízká latence. Systém musí vracet očekávané produkty, bezpečně aktualizovat index a jasně oddělit hledání od autoritativního businessového stavu.

  • udržovat sadu českých dotazů s diakritikou i bez ní, více slovy, frázemi a překlepy
  • měřit relevanci odděleně pro název, popis, značku, kategorii a přesné SKU
  • definovat, zda více slov znamená AND, OR nebo minimální počet shod
  • sledovat zpoždění, chyby indexace a rozdíl počtu dokumentů proti primární databázi
  • mít idempotentní aktualizaci a bezpečný postup úplné reindexace
  • před zobrazením ceny či nákupní akcí ověřit kritická data v autoritativním zdroji

Časté otázky

Fulltext v databázi a aplikaci.

Je fulltext totéž co SQL LIKE '%text%'?

Ne. LIKE porovnává řetězec se vzorem. Fulltext pracuje s analyzovanými tokeny, specializovaným indexem a může počítat relevanci, fráze nebo další textová pravidla.

Je pro fulltext vždy nutný Elasticsearch?

Ne. PostgreSQL, MySQL i SQLite mají vlastní fulltextové možnosti. Samostatný vyhledávací systém má smysl až tehdy, když jeho funkce a škálování ospravedlní další provoz a synchronizaci.

Proč hledání s českou diakritikou vrací jiné výsledky?

Rozhoduje analyzátor použitý při indexaci i dotazu. Sjednocení diakritiky lze nastavit, ale musí se otestovat, protože normalizace může také sloučit výrazy, které mají zůstat odlišné.

Je výsledek s nejvyšším skóre vždy nejlepší?

Ne. Skóre vyjadřuje zvolený model relevance pro daný dotaz. Váhy polí, jazyková pravidla a produktové signály je potřeba ladit a ověřovat proti očekávání uživatelů.

Proč se nově změněný produkt hned neobjeví?

U samostatného indexu může být změna ještě ve frontě, čekat na refresh nebo selhat. Aplikace má zpoždění sledovat, umět změnu zopakovat a kritická data ověřovat v primární databázi.

Jak pracuji s databázemi v praxi

Vyhledávací model navrhuji spolu se zdrojem dat a způsobem aktualizace.

U e-commerce a integračních aplikací odděluji autoritativní data od vyhledávacího pohledu a relevanci ověřuji na skutečných dotazech.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.