Fulltextové hľadanie - všeobecne
Fulltextové hľadanie je jednou z možností hľadania v systéme ABRA Gen vo väčšine číselníkových a dokladových agend, kde je k dispozícii Panel fulltextového hľadania.
Ešte skôr než sa pozrieme na princípy fungovania fulltextového hľadania, uvedieme tu niekoľko príkladov využitia hľadania v rôznych agendách vrátane konkrétneho nastavenia v agende Fulltextové hľadanie, aby ste si dokázali nastaviť fulltextové hľadanie jednoducho a rýchlo. Ďalšie príklady sú potom uvedené v sekcii Ďalšie príklady definícií a výsledky hľadania.
Ak príklady použijete v praxi a nastavíte podľa nich jednotlivé hľadania v agende Fulltextové hľadanie, je potrebné nad záložkou Zoznam v tejto agende ručne spustiť funkciu Aktualizovať fulltext, aby sa vytvorili indexy a vyhľadávanie tak mohlo byť aktívne.
Jedna z najčastejších potrieb používateľov v dokladových agendách je fulltextové hľadanie podľa čísla dokladu. Ukážeme si nastavenie na príklade v agende Faktúry vydané. Používateľ chce vyhľadávať doklady napr. zadaním "FV-3".
V agende Fulltextové hľadanie vytvoríme nový záznam. Agendu vyberieme Faktúry vydané a nastavenie vykonáme podľa tabuľky nižšie.
| Typ | Názov | Výraz | Popis | Delenie slov |
|---|---|---|---|---|
| QR výraz | Číslo dokladu | DisplayName | Vyhľadávanie podľa čísla dokladu. V sekciách Min dĺžka slova a Max. dĺžka slova môžeme ovplyvniť ešte minimálnu a maximálnu dĺžku hľadaného slova. | Biele znaky |
Ďalšou častou požiadavkou je nastavenie fulltextového vyhľadávania podľa firmy z dokladu. Ukážeme si nastavenie na príklade v agende Faktúry vydané. Používateľ chce vyhľadávať doklady podľa prvých troch písmen názvu firmy z dokladu.
V agende Fulltextové hľadanie vytvoríme nový záznam. Agendu vyberieme Faktúry vydané a nastavenie vykonáme podľa tabuľky nižšie.
| Typ | Názov | Výraz | Popis | Delenie slov |
|---|---|---|---|---|
| QR výraz | Firma | Firm_ID.Name | Vyhľadávanie podľa názvu firmy z dokladu. V sekciách Min dĺžka slova a Max. dĺžka slova môžeme ovplyvniť ešte minimálnu a maximálnu dĺžku hľadaného slova. | Biele znaky |
Mnoho zákazníkov má potrebu vyhľadávať v dokladoch agendy Objednávky prijaté nie podľa čísla dokladu, ale podľa obsahu riadkov. Potrebujú nájsť doklady, ktoré obsahujú konkrétnu skladovú kartu. Hľadať chcú podľa kódu alebo názvu skladovej karty. Také hľadanie je už zložitejšie, keďže využíva SQL dotaz.
V agende Fulltextové hľadanie vytvoríme nový záznam. Agendu vyberieme Objednávky vydané a nastavenie vykonáme podľa tabuľky nižšie.
| Typ | Názov | Výraz | Popis | Delenie slov |
|---|---|---|---|---|
| SQL | Riadky | SELECT RO2.Parent_ID as ID, COALESCE(SC.Code || ' ' || SC.Name, RO2.Text) as Text FROM ReceivedOrders2 RO2 LEFT JOIN StoreCards SC ON SC.ID = RO2.STORECARD_ID | Vyhľadávanie podľa kódu alebo názvu skladovej karty naprieč obsahom dokladov. | Biele znaky |
Často je potrebné hľadať záznamy podľa EAN kódov. Také hľadanie je už zložitejšie, preto naň využijeme SQL dotaz.
V agende Fulltextové hľadanie vytvoríme nový záznam. Agendu vyberieme Skladové karty a nastavenie vykonáme podľa tabuľky nižšie.
| Typ | Názov | Výraz | Popis | Delenie slov |
|---|---|---|---|---|
| SQL | EAN | SELECT SU.Parent_ID as ID, S.EAN as Text FROM StoreUnits SU JOIN StoreEANs S ON S.Parent_ID = SU.ID | Vyhľadávanie podľa EAN pomocou SQL dotazu | Biele znaky |
Princíp fulltextového hľadania spočíva vo vytvorení množiny slov z vybraných položiek požadovanej agendy. Tieto slová sa umiestnia do novej tabuľky v databáze začínajúcej prefixom FSU$.
Pred zavedením podpory Unicode pre fulltextové hľadanie v systéme ABRA Gen sa pre tabuľky (ktorých kódovanie bolo ANSI) používal názov prefixu FS$. Po zavedení Unicode sa tabuľky nanovo vytvárajú s prefixom FSU$, vďaka čomu je možné rozlíšiť tabuľky so starým a novým kódovaním medzi sebou. K tabuľkám fulltextového hľadania skôr vytvoreným v ANSI je možné dogenerovať tabuľky s prefixom FSU$ v Unicode pomocou funkcie Previesť na unicode. Staré tabuľky v ANSI s prefixom FS$ v systéme zostanú, ale budú už zbytočné, nebudú sa používať. Tieto už zbytočné tabuľky je možné následne odstrániť pomocou funkcie Aktualizovať fulltext.
Pri založení alebo zmene definície sa slovám v tabuľke musia ručne pomocou funkcie Aktualizovať fulltext dopočítať tzv. indexy, vďaka ktorým je potom umožnené rýchle hľadanie. Po prvom ručnom dopočítaní indexov dochádza potom pri každom uložení záznamu v príslušnej agende k indexácii záznamov automaticky.
Automatická indexácia záznamov je z používateľského pohľadu výhodná (indexy sú stále aktuálne, používateľ má istotu, že sa pri každom použití fulltextového hľadania prehľadávajú aktuálne dáta, ručnú aktualizáciu indexov stačí vykonávať pri úpravách definícií), avšak nevhodne navrhnutá (príliš extenzívna) definícia indexov môže spôsobiť výrazné spomalenie práce so systémom.
Typickým príkladom sú editačné položky typu poznámka. Vo väčšine prípadov je dĺžka zadávaného textu vo formulároch obmedzená na 8192 znakov, ale v niektorých prípadoch toto obmedzenie neplatí a do položky je možné zadať takmer ľubovoľne dlhý text (príkladom je poznámka na skladovej karte). Ak do výrazu v definícii fulltextového hľadania zahrniete takú položku a následne do nej pri editácii záznamu vložíte text v dĺžke stoviek tisíc znakov, uloženie jediného záznamu môže trvať v závislosti od konfigurácie aj desiatky minút.
Fulltextové hľadanie nad databázou Oracle prebieha tak vo FSU$ tabuľkách, ako aj v k nim pridelených synonymách. Je to preto, že keby boli tieto tabuľky zahrnuté do zdieľania číselníkov (teda v "slave" spojení tabuľka nie je a je tam namiesto nej synonymum), nebolo by fulltext možné použiť.
Slová sa pri ukladaní do tabuľky prevedú na veľké písmená a pri vyhľadávaní sa hľadaný textový reťazec taktiež prevádza na veľké písmená. Ich veľkosť teda nehrá rolu. Pri ukladaní sa odstraňuje všetka diakritika (napr. "prevodka" bude uložená ako "PREVODKA" atď.) a pri hľadaní slov ju teda netreba zadávať. Slovom sa rozumie textový reťazec, ktorého dĺžku a hranice je možné používateľsky ovplyvniť v detaile definície hľadania. V implicitnom nastavení a pri inteligentnom delení slov je ním avšak mienený reťazec od 0 do 100 znakov, z ktorého sa odstránia interpunkčné znamienka a ktorý zohľadňuje (tj. nedelí) niektoré používané reťazcové konvencie (e-mailová adresa, internetová adresa, číslo dokladu).
Pre samotné vyhľadávanie podporuje systém ABRA Gen v súčasnej dobe nasledujúci režim:
-
zjednodušené fulltextové hľadanie
V starších verziách systému ABRA Gen sa používalo zložitejšie fulltextové hľadanie s podporou logických operátorov.
Zjednodušené fulltextové hľadanie je výrazne rýchlejšie (ak sa nepoužíva hľadanie uprostred slov) než skôr používané hľadanie s logickými operátormi
Pre zjednodušené fulltextové hľadanie platí nasledujúce:
- Ak je do výrazu zadaných viac slov, vyhľadajú sa iba záznamy obsahujúce všetky hľadané slová (ako keby bol medzi každou dvojicou slov použitý logický operátor AND).
- Ak nie je určené inak, vyhľadávajú sa iba záznamy obsahujúce slová, ktoré začínajú zadaným reťazcom.
- Používateľ avšak môže niektoré hľadané slová uvodiť hviezdičkou a tým si vynútiť hľadanie zadaného reťazca aj uprostred slov.
- Jednotlivé slová alebo časti slov je možné oddeliť operátorom OR, potom sa vyhľadajú záznamy obsahujúce ľubovoľné zo zadaných slov alebo fragmentov. Viď tiež popis použitia operátora OR v kapitole Panel pre fulltextové hľadanie.
Ak sa zadaný reťazec hľadá len na začiatku slov, je nový spôsob hľadania výrazne rýchlejší. Ak sa však zadaný reťazec hľadá v slovách uvodených hviezdičkou (tzn. aj uprostred slov), je hľadanie naopak pomalšie. Používanie tohto variantu preto vždy dôkladne zvážte.
Ak chcete vyhľadať všetky záznamy, ktoré v indexovaných položkách obsahujú slová začínajúce reťazcom abc, do poľa Fulltext zapíšete abc.
Ak chcete vyhľadať všetky záznamy, ktoré v indexovaných položkách obsahujú reťazec abc kdekoľvek, aj uprostred slov, do poľa Fulltext zapíšete *abc.
Viď tiež popis položky Výraz v kapitole Panel fulltextového hľadania.
Tento režim vyhľadávania bol k dispozícii do verzie 19.0 vrátane, nižšie uvedený popis uvádzame len pre úplnosť, z historických dôvodov. V aktuálnej verzii bol nahradený zjednodušeným fulltextovým hľadaním opísaným vyššie.
Pri vyhľadávaní v tomto režime platí, že interne je zapnutá tzv. rozšírená syntax. 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 dohľadaný, keď budú do výrazu pre hľadanie zadané reťazce fir, rm, irma či i atď.
Pri úvodzovkách platí, že vyhľadávaný text uzavretý do úvodzoviek bude hľadaný presne. Zároveň s úvodzovkami (ale iba s nimi!) je možné kombinovať aj 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ň".
Možno teda tiež využívať logické operátory AND, OR a NOT, rovnako ako v rozšírenej syntaxi.
Čo sa týka znakov + a -, tak ak je + a - uprostred zadaného slova, zachová sa. Ak je na začiatku, zachová sa tiež, ale vo význame špeciálneho znaku - teda zahrnúť alebo nezahrnúť do hľadania. Ak chceme hľadať slovo, ktoré začína na + alebo -, treba ho odsadit escape znakom, teda \+slovo alebo \-slovo. Pozor však, akým spôsobom sa vykonáva ukladanie fulltext výrazov - ak 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.
Pri používaní fulltextového hľadania nie je nutné prehľadávať všetky položky vo všetkých záznamoch v danej agende. Množinu prehľadávaných dát je možné obmedziť dvoma základnými spôsobmi:
- Obmedzenie množiny prehľadávaných záznamov - pred začatím hľadania je možné zobrazený zoznam obmedziť s využitím obmedzenia alebo filtra a následne prehľadávať iba túto obmedzenú podmnožinu. Viac viď popis ovládacieho prvku Vyhľadávať v zvolenej skupine / filtri.
- Obmedzenie množiny prehľadávaných indexov - v rámci definície fulltextového hľadania v určitej agende je možné vytvoriť niekoľko indexov nad rôznymi položkami a následne jednotlivé indexy aktivovať alebo deaktivovať podľa potreby. Viac viď popis ovládacieho prvku Indexy.
Neúmyselná aplikácia obmedzenia je najčastejší spôsob, prečo fulltextové hľadanie nenájde všetky požadované dáta.
Pre pochopenie fungovania definície fulltextového hľadania ponúkame dva typové príklady:
Komplexný príklad, ktorý popisuje vytvorenie definície fulltextového hľadania aj úskalia v podobe nesprávne zadaného minimálneho a maximálneho počtu slov.
V agende Adresár firiem majme založené tri firmy s názvami AAA, XY a Česká automobilka a.s. V agende Fulltextové hľadanie vytvorme nový záznam, naviažme ho na agendu Adresár firiem, pomocnú db. tabuľku ponechajme s názvom Firms (v databáze tak vznikne tabuľka s názvom FSU$FIRMS). Ďalej založme tieto riadky: 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 Name (Názov) a definíciu uložme. Následne vyvolajme nad uloženým záznamom funkciu Aktualizovať 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 enteru vykonáme dotaz, tak systém nič nenájde, pretože sme v definícii obmedzili min. dĺžku slova na 3 znaky. Rovnako tak aj pri pokuse o hľadanie slova automobilka bude výpis prázdny, pretože maximálna dĺžka slova bola nastavená na 8 znakov (a v tabuľke je teda uložené slovo automobi, pretože systém slová orezáva na zadaný počet znakov zľava). Úspešné výsledky teda získame pri reťazcoch 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šom prípade by teda ideálne nastavenie bolo minimálna dĺžka slova 2 (aby sa do tabuľky dostal aj názov firmy XY) a maximálna dĺžka slova najmenej 11 (aby sa do tabuľky dostalo celé slovo automobilka). Ak sa slová delia, potom 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.
Komplexný príklad, ktorý popisuje vytvorenie definície fulltextového hľadania nad agendou Faktúry vydané pomocou čísla dokladu v kombinácii s inteligentným delením
V agende Faktúry vydané majme založené tri faktúry s číslami dokladu FV-1/2011, FV-1/2012 a FV-2/2012. V agende Fulltextové hľadanie vytvorme nový záznam, naviažme ho na agendu Faktúry vydané, pomocnú db. tabuľku ponechajme s názvom IssuedInvoices (v databáze tak vznikne tabuľka s názvom 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ásledne vyvolajme nad uloženým záznamom funkciu Aktualizovať fulltext.
Pokiaľ 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 enteru vykonáme dotaz, tak systém zobrazí všetky tri faktúry. Pokiaľ do výrazu zadáme *2012, tak systém zobrazí iba faktúry z roku 2012. Pokiaľ 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ú aj znaky "-" a "/" a do databázy sú teda uložené vcelku.
Komplexný príklad, ktorý popisuje vytvorenie definície fulltextového hľadania nad agendou Skladové karty pomocou časti kódu.
V agende Skladové karty potrebujeme vyhľadávať v kóde skladových kariet napríklad časť kódu ako 11-04 alebo 18-30, alebo 20-48. Vytvoríme nový index fulltextového hľadania pre skladové karty a hodnoty zadáme podľa tabuľky nižšie. Z tabuľky je najdôležitejší stĺpec Názov a Výraz. Stĺpec Popis len vysvetľuje dôvod nastavenia a uvádza prí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)) | Vyhľadávanie podľa časti kódu začínajúcej dva znaky pred posledným výskytom znaku - Napríklad kód . SJT00RT20-48SB(014) Vytvorí záznam do hľadania: 20-48SB(014) Vďaka tomu možno vyhľadať len zadaním: 20-48 | Biele znaky |
Tento príklad nadväzuje veľmi úzko na predchádzajúci príklad. Pre prípady, keď by bolo treba hľadať v texte nie pred posledným výskytom znaku-, ale pred predposledným, stačí upraviť výraz podľa tabuľky nižšie. Z tabuľky je najdôležitejší stĺpec Názov a Výraz. Stĺpec Popis len vysvetľuje dôvod nastavenia a uvádza prí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))) | Vyhľadávanie podľa časti kódu začínajúcej dva znaky pred predposledným výskytom znaku - Napríklad kód LJT06RT-09-98S(014) F472 Vytvorí záznam do hľadania: RT-09-98S(014) F472. Vďaka tomu možno vyhľadať len zadaním: RT-09. | Biele znaky |
Výraz uvedený vyššie v tabuľke možno vložiť v agende Skladové karty do vlastného stĺpca, kde je následne vidieť, na aké slová sa kód rozdelí.
Výraz v stĺpci, ktorý bol použitý v rámci nastavenia indexu fulltextového hľadania, zobrazí, na aké slová sa Kód rozdelí. Možno tak ľahko skontrolovať, či výraz rozdelí text podľa potreby.
Komplexný príklad, ktorý popisuje vytvorenie fulltextového hľadania nad agendou Skladové karty za pomoci názvu
Podobne ako v predchádzajúcich príkladoch budeme vyhľadávať v číselníku skladových karietartiklů, tentoraz v poli Názov. .Napríklad časť názvu ako 1900nd. Upravíme existujúci index, ktorý sme vytvorili v predchádzajúcom príklade pre pole Name. Hodnoty zadáme podľa tabuľky nižšie. Z tabuľky je najdôležitejší stĺpec Názov a Výraz. Stĺpec Popis len vysvetľuje dôvod nastavenia a uvádza príklad.
| Typ | Názov | Výraz | Popis | Delenie slov |
|---|---|---|---|---|
| QR výraz | Name without chars ( ) | NxSearchReplace(NxSearchReplace(Name, '(', ' ', 2), ')', ' ', 2) | Vyhľadávanie podľa slov v názve bez znakov () Napríklad v názve konektor socker, 18+3 dt. AWG20 (1900ND08S1A00A) Index vytvorí slová na hľadanie: konektor socker, 18+3 dt. AWG20 1900ND08S1A00A Vďaka tomu je možné vyhľadať len zadaním výrazu: 1900nd. | Biele znaky |
Pri veľkom množstve záznamov môže byť potrebné fulltextové vyhľadávanie optimalizovať. V tejto kapitole sa pozrieme, aké sú vhodné spôsoby optimalizácie.
Obmedzenie záznamov pre aktualizáciu fulltextu
Ak máme napríklad nastavený fulltext v agende Objednávky prijaté pre hľadanie skladových kariet v obsahu objednávok a ak často dochádza k zmenám názvu skladových kariet, je potrebné pomocou automatickej úlohy prepočítavať aj už uložené údaje, ak vieme, že k zmenám dochádza. Prepočet je možné naplánovať pomocou naplánovanej úlohy Aktualizácia fulltextu. Ak je napríklad objednávok viac ako 10 000, odporúčame obmedziť aktualizačný rozsah napr. len na objednávky vytvorené v tomto roku pomocou obmedzenia nastavovaného na definícii fulltextového poľa s názvom Výraz pre Obmedzenie spracovávaných záznamov
Výraz bude vyzerať nasledovne:
'RT.DOCDATE$DATE >= ' + NxDateToFloat(Date) - 365
Duplikácia slov
Technicky databáza duplikuje použité slová do databázy, ak sa opakujú rovnaké slová vo vybraných poliach (zvyčajne zadaných ako samostatné indexy), aby bolo možné hľadať samostatne podľa jednotlivých indexov. V prípade veľkých dát s viac ako 100 000 záznamami je dobré obmedziť počet indexov na minimum tým, že do jednej definície zlúčime viac polí podľa prípadov použitia, ako používatelia naozaj hľadajú.
Napr. máme 800 000 skladových kariet a používatelia zvyčajne hľadajú podľa polí Názov a Špecifikácia. Tak je vhodné urobiť jednu definíciu indexu s výrazom Name + ' ' + Specification
Systém potom uloží len unikátne slová z oboch dvoch textových polí a tým zvyčajne dochádza k zníženiu počtu informácií uložených pre fulltextové hľadanie.
Fulltextové hľadanie je tiež možné logovať zadaním prísluš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. Logovanie behu aplikácie.
