602SQL-Úplná dokumentace Index  

Fulltextové vyhledávání dokumentů

Ve fulltextovém systému lze vyhledávat dokumenty obsahující slova, fráze a jejich kombinace vytvořené pomocí operátorů AND, OR, NOT a NEAR, případně i s použitím kulatých závorek. Pro kombinování vyhledávaných slov platí tato pravidla:

Slova oddělená pouze mezerou a neuzavřená do uvozovek se chápou jako slova spojená spojkou NEAR.

Příklady vyhledávání

elektrárna - hledají se dokumenty obsahující slovo "elektrárna";

uhlí AND elektrárna - hledají se dokumenty obsahující slova "uhlí" a zároveň "elektrárna";

teplárna OR elektrárna - hledají se dokumenty obsahující slova "teplárna" nebo "elektrárna";

elektrárna AND NOT vodní - hledají se dokumenty obsahující slovo "elektrárna", ale neobsahující slovo "vodní";

elektrárna NEAR znečištění - hledají se slova obsahující slovo "elektrárna" vyskytující se poblíž slova "znečištění";

"atomová elektrárna" - hledají se dokumenty obsahující bezprostředně za sebou stojící slova "atomová" a "elektrárna".

Operátor NOT se dá použít pouze na jednotlivá slova. Operátor AND má vyšší prioritu než OR, takže například při vyhledávání

aaa OR bbb AND ccc
se vrátí také dokument obsahující pouze slovo aaa.

Integrace fulltextového vyhledávání do SQL dotazů

K vyhledání slouží predikát:

Fulltext(označení_ft_systému, sloupec_ID_dokumentu, hledaná_slova)

kde

Tento predikát má hodnotu TRUE, pokud dokument uvedeného čísla obsahuje hledaná slova, nebo FALSE, pokud je neobsahuje. Predikát se dá použít ve vyhledávacích podmínkách na tabulkách dokumentů.

Příklad:

SELECT * FROM Txtab 
WHERE Fulltext('Spisovna.Korespondence', cislo_doc, '(Linux OR ''Windows NT'') AND NOT MS-DOS')

vybere z tabulky Txtab ty záznamy, které obsahují ve svých zaindexovaných sloupcích slovo Linux nebo Windows NT a zároveň neobsahují výraz MS-DOS.

V lemmatizovaných fulltextových systémech (obvykle čeština, slovenština) se hledaná slova automaticky převedou na základní tvar, aby se nalezly všechny výskyty. Proto

...WHERE Fulltext('Spisovna.Korespondence', cislo_doc, 'atomová elektrárna')
...WHERE Fulltext('Spisovna.Korespondence', cislo_doc, 'atomový elektrárna')
...WHERE Fulltext('Spisovna.Korespondence', cislo_doc, 'atomové elektrárny')
vrátí stejný výsledek.

Rozlišování velikosti písmen při vyhledávání dokumentů

Fulltextové nástroje ve 602SQL nesledují velikost všech písmen ve slově. Dovolují však rozlišit tři případy:

Při normálním vyhledávání slova se k velikosti písmen nepřihlíží. Pokud se velikost písmen má respektovat (v rámci uvedených tří kategorií), pak je třeba v posledním parametru predikátu Fulltext uvést bezprostředně před příslušným slovem znak = (rovnítko).

Příklad:

most nebo MOST - hledají se dokumenty obsahující slovo "most","Most","MOST" bez ohledu na velikost písmen;

=most - hledají se dokumenty obsahující slovo "most", s malým prvním písmenem (obecné slovo, ne na začátku věty);

=Most - hledají se dokumenty obsahující slovo "Most", s prvním písmenem velkým, avšak nikoli se všemi velkými písmeny (název města, obecné slovo na začátku věty);

=MOST - hledají se dokumenty obsahující slovo "MOST", napsané pouze velkými písmeny (název nevládní organizace).

Příklad:

Fulltext('Spisovna.Korespondence', cislo_doc, 'Německo OR =BRD') 

Dotaz v této formě zabrání nalezení dokumentu, který obsahuje slovo "Brd" (genitiv od "Brdy").

Vyhledání kontextu výskytu

Fulltextový systém umožňuje vyhledávat k dané frázi také její kontext (slova před a za frází v původním dokumentu). K vyhledání kontextu slouží funkce Fulltext_get_context s využitím systémové proměnné @@FULLTEXT_POSITION (typu INT).

SELECT Fulltext_get_context('Literary.Correspondence',doc,'TXT',0,@@FULLTEXT_POSITION,1,5,'>>%<<')
FROM Doctab
WHERE Fulltext('Literary.Correspondence', id, '...')

Setřídění dokumentů podle počtu a váhy výskytů

Fulltextový systém dokáže sledovat počty výskytů hledaného slova nebo fráze v dokumentech. Tyto počty se nejčastěji používají k setřídění nalezených dokumentů. Setříděnou odpověď vytvoří dotaz využívající systémovou proměnnou @@FULLTEXT_WEIGHT v tomto tvaru:

SELECT ...., @@FULLTEXT_WEIGHT FROM ...  
WHERE Fulltext(...) 
ORDER BY @@FULLTEXT_WEIGHT

Pokud při vytvoření fulltextového systému bylo umožněno sledování vah jednotlivých výskytů slova v dokumentu, pak se jeden výskyt slova může počítat s násobnou váhou. Rozlišení váhy výskytů však závisí na formátu dokumentu a na schopnosti konverzní knihovny přiřadit slovům v různých částech dokumentu různé váhy.

V současné verzi se rozlišení váhami nepoužívá.

Negativistické dotazy

Není dovoleno vyhledávat dokumenty pouze na základě toho, že neobsahují určité slovo či frázi. Nelze například vyhledávat dokumenty neobsahující slovo Windows pomocí predikátu:

Fulltext('Spisovna.Korespondence', cislo_doc, 'NOT Windows')

Klauzule NOT musí být vždy spojena operátorem AND s pozitivním vyhledáváním nějakého slova nebo fráze, např. lze psát:

Fulltext('Spisovna.Korespondence', cislo_doc, '''Operační systém'' AND NOT Windows')

Na negativistický dotaz fulltextový systém vrátí prázdnou odpověď. Klauzule NOT spojená pomocí OR s jinou klauzulí se ignoruje.

Integrace fulltextového vyhledávání do Vývojového prostředí

Do klientského Vývojového prostředí je zabudován jednoduchý frontend fulltextového systému. Kdykoliv lze jednoduše zadat frázi a vrátí se informace o tom, zda-li je fráze ve fulltextu obsažena, v jaké zdrojové tabulce a v jakém kontextu.

Okno fulltextového frontendu se vyvolá poklepáním (nebo příkazem Spustit z nabídky) na objekt typu Fulltext na Řídicím panelu. Otevře se okno se třemi částmi:

V případě, že definice fulltextu obsahuje jen hlavičku bez ftx triggerů (odložené manuální indexování), musí se ve střední části dialogu nejprve vybrat tabulka dokumentů, sloupec s ID pro vyhledání a sloupec s textem dokumentu, formát a mód pro zobrazení kontextu.