Fulltextové hľadanie - všeobecne
Fulltextové hledání je jednou z možností hledání v systému ABRA Gen ve většině číselníkových a dokladových agend, kde je k dispozici Panel fulltextového hledání.

Princíp fulltextového hľadania spočíva vo vytvorení množiny slov z vybraných položiek požadovanej agendy. Tato slova se umístí do nové tabulky v databázi začínající prefixem FSU$.
Před zavedením podpory Unicode pro fulltextové hledání v systému ABRA Gen se pro tabulky (jejichž kódování bylo ANSI) používal název prefixu FS$. Po zavedení Unicode se tabulky nově vytvářejí s prefixem FSU$, díky čemuž je možné rozlišit tabulky se starým a novým kódováním mezi sebou. K tabulkám fulltextového hledání dříve vytvořeným v ANSI je možné dogenerovat tabulky s prefixem FSU$ v Unicode pomocí funkce Převést na unicode. Staré tabulky v ANSI s prefixem FS$ v systému zůstanou, ale budou již zbytečné, nebudou se používat. Tyto již zbytečné tabulky je možné následně odstranit pomocí funkce Aktualizovat fulltext.
Při založení nebo změně definice se slovům v tabulce musí ručně pomocí funkce Aktualizovat fulltext napočítat tzv. indexy, díky kterým je pak umožněno rychlé hledání. Po prvom ručnom napočítaní indexov potom dochádza pri každom uložení záznamu v patričnej agende k indexácii záznamov automaticky.
Automatická indexace záznamů je z uživatelského pohledu výhodná (indexy jsou stále aktuální, uživatel má jistotu, že se při každém použití fulltextového hledání prohledávají aktuální data, ruční aktualizaci indexů stačí provádět při úpravách definic), nicméně nevhodně navržená (příliš extenzivní) definice indexů může způsobit výrazné zpomalení práce se systémem.
Typickým příkladem jsou editační položky typu poznámka. Ve většině případů je délka zadávaného textu ve formulářích omezena na 8192 znaků, ale v některých případech toto omezení neplatí a do položky je možné zadat téměř libovolně dlouhý text (příkladem je poznámka na skladové kartě). Pokud do výrazu v definici fulltextového hledání zahrnete takovou položku a následně do ní při editaci záznamu vložíte text v délce stovek tisíc znaků, uložení jediného záznamu může trvat v závislosti na konfiguraci i desítky minut.
Slova jsou při ukládání do tabulky převedena na velká písmena a při vyhledávání se hledaný textový řetězec taktéž převádí na velká písmena. Ich veľkosť teda nehrá rolu. Pri ukladaní sa odstraňuje kompletná diakritika (napr. "prevodka" bude uložené ako "PREVODKA" a pod.) a pri hľadaní slov ju teda nie je potrebné zadávať. Slovom sa rozumie textový reťazec, ktorého diaľku a hranice je možné užívateľsky ovplyvniť v detaile definície hľadania. V implicitním nastavení a při inteligentním dělení slov je jím nicméně míněn řetězec od 0 do 100 znaků, ze kterého se odstraní interpunkční znaménka a který zohledňuje (tj. nedělí) některé užívané řetězcové konvence (e-mailová adresa, internetová adresa, číslo dokladu).
Pro samotné vyhledávání podporuje systém ABRA Gen v současné době následující režim:
-
zjednodušené fulltextové hledání
Ve starších verzích systému ABRA Gen bylo používáno složitější fulltextové hledání s podporou logických operátorů.
Zjednodušené fulltextové hledání je výrazně rychlejší (pokud se nepoužívá hledání uprostřed slov) než dříve používané hledání s logickými operátory

Pro zjednodušené fulltextové hledání platí následující:
- Pokud je do výrazu zadáno více slov, vyhledají se pouze záznamy obsahující všechna hledaná slova (jako by byl mezi každou dvojicí slov použitý logický operátor AND).
- Není-li určeno jinak, vyhledávají se pouze záznamy obsahující slova, která začínají zadaným řetězcem.
- Uživatel nicméně může některá hledaná slova uvodit hvězdičkou a tím si vynutit hledání zadaného řetězce i uprostřed slov.
- Jednotlivá slova nebo části slov je možné oddělit operátorem OR, poté se vyhledají záznamy obsahující libovolné ze zadaných slov nebo fragmentů. Viz také popis použití operátoru OR v kapitole Panel pre fulltextové hľadanie.
Pokud se zadaný řetězec hledá jen na začátku slov, je nový způsob hledání výrazně rychlejší. Pokud se však zadaný řetězec hledá ve slovech uvozených hvězdičkou (tzn. také uprostřed slov), je hledání naopak pomalejší. Používání této varianty proto vždy důkladně zvažte.
Chcete-li vyhledat všechny záznamy, které v indexovaných položkách obsahují slova začínající řetězcem abc, do pole Fulltext zapíšete abc.
Chcete-li vyhledat všechny záznamy, které v indexovaných položkách obsahují řetězec abc kdekoliv, i uprostřed slov, do pole Fulltext zapíšete *abc.
Viz také popis položky Výraz v kapitole Panel fulltextového hledání.

Tento režim vyhledávání byl k dispozici do verze 19.0 včetně, níže uvedený popis uvádíme jen pro úplnost, z historických důvodů. V aktuální verzi byl nahrazen zjednodušeným fulltextovým hledáním popsaným výše.
Při vyhledávání v tomto režimu platí, že interně je zapnuta tzv. rozšířená syntaxe. Hľadanie však ruší nutnosť (nie možnosť, viď nižšie) hviezdičkovej konvencie a systém dohľadá záznam pri zadaní akéhokoľvek úseku slova uloženého v tabuľke. Ak je teda v tabuľke uložené slovo firma, bude záznam s týmto slovom vyhľadaný, keď budú do výrazu pre hľadanie zadané reťazce fir, rm, irma či i a pod.
Pri úvodzovkách platí, že vyhľadávaný text uzavretý do úvodzoviek bude hľadaný presne. Zároveň s úvodzovkami (ale len s nimi!) je možné kombinovať i symbol hviezdičky:
Hľadaný reťazec | Výsledok |
---|---|
top ten | Hľadá sa "%top% AND "%ten%". Teda napr. aaatopaaa bbbtenbbb. |
"top" "ten" | Hľadá sa "top" AND "ten". Teda presne top ten. |
"top" ten | Hľadá sa "top" AND "%ten%". Teda napr. top bbbtenbbb. |
"top*" ten | Hľadá sa "top%" AND "%ten%". Teda napr. topaaa bbbtenbbb. |
Znak % zodpovedá v databáze znaku hviezdičky. AND je logický operátor pre "a zároveň".
Lze tedy také využívat logické operátory AND, OR a NOT, stejně jako v rozšířené syntaxi.
Čo sa týka znakov + a -, tak pokiaľ je + a - uprostred zadaného slova, zachová sa. Pokiaľ je na začiatku, zachová sa tiež, ale v zmysle špeciálneho znaku - teda zahrnúť alebo nezahrnúť do hľadania. Pokiaľ chceme hľadať slovo, ktoré začína na + nebo -, je potrebné ho odsadiť escape znakom, teda \+slovo alebo \-slovo. Pozor však, akým spôsobom je vykonávané ukladanie fulltext výrazov - pokiaľ je nastavené Delenie slov ako Inteligentné alebo Vlastné tak sa také slovo nemusí uložiť vo fulltextovom slovníku tak, ako sa očakáva. Operátory zátvoriek nie je možné použiť.

Aby bolo možné fulltextové hľadanie v danej agende používať, je nutné mať pre túto agendu vytvorenú definíciu fulltextového hľadania. To je možné týmito spôsobmi:
- Pomocou Sprievodcu vytvorením definície fulltextového hľadania priamo v danej agende.
- Vytvorením definície v agende Fulltextové hľadanie.

Při používání fulltextového hledání není nutné prohledávat všechny položky ve všech záznamech v dané agendě. Množinu prohledávaných dat je možné omezit dvěma základními způsoby:
- Omezení množiny prohledávaných záznamů - před zahájením hledání je možné zobrazený seznam omezit s využitím omezení nebo filtru a následně prohledávat pouze tuto omezenou podmnožinu. Více viz popis ovládacího prvku Vyhledávat ve zvolené skupině / filtru.
- Omezení množiny prohledávaných indexů - v rámci definice fulltextového hledání v určité agendě je možné vytvořit několik indexů nad různými položkami a následně jednotlivé indexy aktivovat nebo deaktivovat dle potřeby. Více viz popis ovládacího prvku Indexy.
Neúmyslná aplikace omezení je nejčastější způsob, proč fulltextové hledání nenalezne všechna požadovaná data.

Pre pochopenie fungovania fulltextového hľadania ponúkame dva typové príklady:
V agende Adresár firiem majme založené tri firmy s názvami AAA, XY a Česká automobilka a.s. V agendě Fulltextové hledání vytvořme nový záznam, navažme jej na agendu Adresář firem, pomocnou db. tabulku ponechme s názvem Firms (v databázi tak vznikne tabulka s názvem FSU$FIRMS). Ďalej založme jeden riadok takto: v položke názov zadajme Názov, v položke delenie nastavme Inteligentné, min. dĺžku slova nastavme na 3, max. dĺžku slova na 8, v položke výraz vyberme dátovú položku Displayname (Číslo dokladu) a definíciu uložme. Následně vyvolejme nad uloženým záznamem funkci Aktualizovat fulltext.
Ak sa teraz prepneme do agendy Adresár firiem a do výrazu v paneli fulltextového hľadania zadáme XY a stlačením enter vykonáme dopyt, tak systém nič nenájde, pretože sme v definícii obmedzili min. dĺžku slova na 3 znaky. Stejně tak i při pokusu o hledání slova automobilka bude výpis prázdný, neboť maximální délka slova byla nastavena na 8 znaků (a v tabulce je tedy uloženo slovo automobi, neboť systém slova ořezává na zadaný počet znaků zleva). Úspešné výsledky teda získame u reťazcov AAA, česká či automobi.
Z toho vyplýva, že pri určovaní minimálnej a maximálnej dĺžky slov musíme dbať na to, aby sa do tabuľky dostali skutočne všetky reťazce a teda vymedzené hranice neboli príliš reštriktívne. V našem případě by tedy ideální nastavení bylo minimální délka slova 2 (aby se do tabulky dostal i název firmy XY) a maximální délka slova nejméně 11 (aby se do tabulky dostalo celé slovo automobilka). Ak sa slová delia, tak je obvykle maximálna dĺžka slova nastavená na najdlhšie očakávateľné slovo, ktoré sa v poli vyskytne alebo bude vyskytovať. Je dobré počítať s určitými rezervami.
V agendě Faktury vydané mějme založené tři faktury s čísly dokladu FV-1/2011, FV-1/2012 a FV-2/2012. V agendě Fulltextové hledání vytvořme nový záznam navažme jej na agendu Faktury vydané, pomocnou db. tabulku ponechme s názvem IssuedInvoices (v databázi tak vznikne tabulka s názvem FSU$ISSUEDINVOICES). Ďalej založme jeden riadok takto: v položke názov zadajme Číslo dokladu, v položke delenie nastavme Inteligentné, min. dĺžku slova nastavme na 3, max. dĺžku slova na 20, v položke výraz vyberme dátovú položku Displayname (Číslo dokladu) a definíciu uložme. Následně vyvolejme nad uloženým záznamem funkci Aktualizovat fulltext.
Ak sa teraz prepneme do agendy Faktúry vydané a do výrazu v paneli fulltextového hľadania zadáme FV a stlačením enter vykonáme dopyt, tak systém zobrazí všetky tri faktúry. Pokud do výrazu zadáme *2012, tak systém zobrazí pouze faktury z roku 2012. Ak zadáme FV-2/2012, tak systém zobrazí práve túto faktúru. Inteligentné delenie v definícii fulltextového hľadania totiž za slovo považuje reťazce, ktoré obsahujú i znaky "-" a "/" a do databázy sú teda uložené v celku.
V agendě Skladové karty potřebujeme vyhledávat v kódu skladových karet například část kódu jako 11-04 nebo 18-30, nebo 20-48. Vytvoříme nový index fulltextového hledání pro skladové karty a hodnoty zadáme podle tabulky níže. Z tabulky je nejdůležitější sloupec Název a Výraz. Sloupec Popis, jen vysvětluje důvod nastavení a uvádí příklad.
Typ | Názov | Výraz | Popis | Delenie slov |
---|---|---|---|---|
QR výraz | Suffix Code, two char before - | IF (NxCharPosR('-', Code)=0, '', NxRight(Code, NxStrLen(Code) - NxCharPosR('-', Code) +1 +2)) | Vyhledávání dle části kódu začínající dva znaky před posledním výskytem znaku - Například kód karty. SJT00RT20-48SB(014) Vytvoří záznam do hledání: 20-48SB(014) Díky tomu lze vyhledat jen zadáním: 20-48 | Biele znaky |
Tento příklad navazuje velmi úzce na předchozí příklad. Pro případy, kdy by bylo třeba hledat v textu ne před posledním výskytem znaku-, ale před předposledním stačí upravit výraz dle tabulky níže. Z tabulky je nejdůležitější sloupec Název a Výraz. Sloupec Popis, jen vysvětluje důvod nastavení a uvádí příklad.
Typ | Názov | Výraz | Popis | Delenie slov |
---|---|---|---|---|
QR výraz | Suffix Code, two char before second - | IF (NxCharPosR('-', Code)=0, '', IF (NxCharPosR('-', NxLeft(Code, NxCharPosR('-', Code))) = 0, '', NxRight(Code, NxStrLen(Code) - NxCharPosR('-', NxLeft(Code, NxCharPosR('-', Code)-1 )) +1 +2))) | Vyhledávání dle části kódu začínající dva znaky před předposledním výskytem znaku - Například kód karty. LJT06RT-09-98S(014) F472 Vytvoří záznam do hledání: RT-09-98S(014) F472. Díky tomu lze vyhledat jen zadáním: RT-09. | Biele znaky |
Výraz uvedený výše v tabulce lze vložit v agendě Skladové karty do vlastního sloupce, kde je následně vidět, na jaká slova se kód rozdělí.
Výraz ve sloupci, který byl použit v rámci nastavení indexu fulltextového hledání zobrazí, na jaká slova se Kód rozdělí. Lze tak snadno zkontrolovat, zda výraz rozdělí text dle potřeby.
Podobně jako v předchozích příkladech budeme vyhledávat v číselníku skladových karet, tentokrát v poli Název. .Například část názvu jako 1900nd. Upravíme stávající index, který jsme vytvořili v předchozím příkladu pro pole Name. Hodnoty zadáme podle tabulky níže. Z tabulky je nejdůležitější sloupec Název a Výraz. Sloupec Popis, jen vysvětluje důvod nastavení a uvádí příklad.
Typ | Názov | Výraz | Popis | Delenie slov |
---|---|---|---|---|
QR výraz | Name without chars ( ) | NxSearchReplace(NxSearchReplace(Name, '(', ' ', 2), ')', ' ', 2) | Vyhledávání dle slov v názvu bez znaků () Například v názvu konektor socker, 18+3 dt. AWG20 (1900ND08S1A00A) Index vytvoří slova pro hledání: konektor socker, 18+3 dt. AWG20 1900ND08S1A00A Díky tomu lze vyhledat jen zadáním výrazu: 1900nd. | Biele znaky |

Fulltextové hľadanie je tiež možné logovať zadaním patričných sekcií do súboru Nexus.cfg do samostatného súboru, a to cez triedu FastSearch. Napríklad takto:
[Logs]
LogsDirectory=C:\Logs
[Log.FastSearch]
Enabled=1
Level=6
Viac viď kap. Logovanei chodu aplikácie.