Dezvoltarea si implementarea Bazelor de Date Full Text in SGBD Oracle Profesor coord onator Absolvent Conf. Dr. Cristian Kevorchian Ionut Preda… [610003]

LUCRARE DE LICENTA
Dezvoltarea si implementarea Bazelor de Date
Full Text in SGBD Oracle

Profesor coord onator Absolvent: [anonimizat] 201 7

Cuprins
1. Introducere ………………………….. ………………………….. ………………………….. ………………………….. ……. 3
2. Configurarea Bazei de Date pentru a lucra in regim full text. ………………………….. ……………………. 6
3. Crearea structurii Bazei de Date si Indexarea acesteia ………………………….. ………………………….. .. 11
4. Inserarea datelor in tabela ………………………….. ………………………….. ………………………….. ………….. 13
5. Interogarea Bazei de Date ………………………….. ………………………….. ………………………….. ………….. 17
6. Prezentarea documentelor in Oracle Text ………………………….. ………………………….. …………………. 20
7. Clasificarea Documentelor in Oracle Text ………………………….. ………………………….. ………………… 22
a. Clasificarea bazata pe reguli ………………………….. ………………………….. ………………………… 23
b. Clasificarea supravegheata ………………………….. ………………………….. ………………………….. . 27
i. Clasificarea supravegheata cu algoritmul Decision Tree ………………………….. ……………. 28
ii. Clasificarea supravegheata cu algoritmul SVM ………………………….. ……………………….. 31
c. Clasificarea nesupravegheata(clust ering) ………………………….. ………………………….. ……….. 34
8. Tuning Oracle Text ………………………….. ………………………….. ………………………….. …………………… 36
9. Alte soluții tehnologice pentru bazele de date full -text ………………………….. ………………………….. . 40
a. Full Text Database in MySQL ………………………….. ………………………….. ……………………… 40
b. Full Text Database in SQL Server ………………………….. ………………………….. …………………. 42
10. Ciclul de proiectare a aplicatiei ………………………….. ………………………….. ………………………….. … 46
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ………… 50
Anexa figurilor ………………………….. ………………………….. ………………………….. ………………………….. ……. 50

1. Introducere

Contextul general al Bazele de Date are aplicabilitate la orice nivel (fie la nivel de
aplicatie, fie la nivel de date) , in toate domeniile . Aplicatiile mari, de tip ERP (Enterprise
Resource P lanning ), BI (Business Inteligense), Data Warehouse dar si magazinele online,
bibliotecile online, toate folosesc baze de date, unde atat datele de business cat si cele de
aplicatie sunt stocate pentru a facilita o functionalitate cat mai usoara a programe lor dar si o
experienta cat mai placuta utilizatorilor printr -un acces cat mai rapid la date .
In bazele de date putem stoca formate diferite de date . Fiecare format de baza de date ne
pune la dispozitie un format propriu al informatiilor. Bazele de date pot fi de mai multe feluri:

 Baze de date active. Sunt baze de date ale caror arhitecturi au la baza evenimente si
statusuri. Utilitatea acestor baze de date se regaseste in monitorizari pentru securitate, statistici,
alerte, etc. Majoritatea bazel or de date relationale modern e includ baze de date active prin
implementarea trigger -elor,
 Bazele de date pentru animatii. Sunt baze de date care inmagazineaza miscari
umane sau fragmente de animatii care analizate si interrogate pot ajuta la crearea de no i animatii.
 Back -end database tin date dar nu include elemente de aplicatie back -end (query,
forms, macro -uri, rapoarte)
 Centralized database sunt bazele de date localizate, stocate si mentinute intr -o
singura locatie. Accesul userilor se face prin retea.
 Cloud database sunt bazele de date care ruleaza pe o platforma cloud. La aceste baze
de date, accesul este permis ca si serviciu.
 Collection database . In muzee sau arhive, colectiile de material sau obiecte sunt
tinute in mod normal in cataloage de colectii.In zzilele noastre, aceste cataloage sunt
implementate folosinduse baze de date. Accesul se poate face si online.
 Column -oriented DBMS sunt sisteme de baze de date care tin datele din tabele in
coloane decat pe linii. In sistemul de date orientate pe coloana, informatiile pot fi accesate cu o
mai mare acuratete in loc de a descarca informatii non -necesare.
 Cooperative database sunt bazele de date care impart informatii intre mai multe
companii . Practic fiecare companie pune la dispozitie anumite in formatii si se foloseste de cele
ale altor companii. Astfel de baze de date sunt folosite in cazul promotiilor prin email, detectarea
fraudelor electronice, in lupta cu spam -urile prin email.
 Distributed database este un system de baze de date al carei med iu de stocare nu
este atasat la un singur processor. Aceste baze de date pot fi tinute pe mai multe calculatoare
localizate in aceeasi locatie fizica sau pot fi dispersate in retea.
 Document -oriented database este una din principalele categorii ale bazelor de date
NoSQL

 Endgame table base sunt baze de date care contin analize amanuntite, precalculate
ale jocurilor de sah. Sun folosite, in mod normal, de engine -urile jocurilor de sah sau de oameni
pentru a analiza in retrospectiva un meci de sah care deja s -a termiant.
 Government database
 Mobile database sunt bazele d e date folosite in reteaua mobi la de telefonie sau PDA –
uri prin care aparatele fac schimb de informatii despre contacte, liste de preturi, informatii despre
calatorii, etc.
 Navigational database este un tip de baza de date care era folosit cu precadere in
perioada mediilor de stocare pe benzi magnetice. In aceste baze de date, informatiile se gasesc
urmand referinte de la alte obiecte, astfel navigand din nod in nod.
 Object database . In aceste tip uri de baze de date, informatiile sunt tinute in forma
obiectele, asa cum sunt folosite in programarea pe obiecte.
 Parallel database sunt baze de date care cauta sa imbunatateasca performantele
diferitelor operatiuni, precum: incarcarea dedate, construirea indecsilor, evaloarea interogarilor,
etc. Chiar daca datele sunt stocate intr -o maniera distribuita, distributia este guvernata exclusiv
din considerente ale performantelor. Bazele de date paralele imbunatatesc viteza de procesare si
de input/output prin folosire amai multor procesoare si disck -uri in paralel.
 Relational database este o baza de date digitala a carei organizare se bazeaza pe
modelul relational al datelor, asa cum a fost propusa de E. F. Codd in 1970. Toate bazele de date
relationale foloses c limbaje SQL (Structured Query Language) pentru a fi mentinute. Diferitele
sisteme care deservesc bazele de date se numesc RDBMS -uri (Relational DataBase Management
Systems).
 Very large database sunt bazele de date cate contin un numar extreme de mare de
randuri si care ocupa un spatiu de stocare foarte mare. In general, aceste baze de date sunt cela de
peste 1T(1 Terabyte). Uneori, bazele de date sunt componente ale analizelor Big Data.

Incadrandu -se in lista de mai sus, Oracle (prin Oracle Text ) ne ofera posibilitatea de a
crea aplicatii bazate pe interogarea textuala sau plicatii de clasificare a documentelor.
Oracle Text este un motor de cautare si analiza textuala oferit de Oracle Corporation . El
este oferit ca parte integrata a Oracle Database RDBMS.
Oracle Text ne pune la dispozitie metode de indexare, teme si cuvinte de cautare si
posibilitatea vizualizarii textelor. Pentru a planifica o aplicatie Oracle Text, este necesar ca in
prealabil sa stim tipul de interogari pe care dorim sa le executam, astfel ajutandu -ne sa alegem
metoda cea mai buna de indexare a bazei de date.
Putem considera urmatoarele categorii de aplicatii pentru Oracle Text:
1. Document Collection Applications
2. Catalog Information Applications
3. Document Classification Applications
4. XML Search Applicat ions

1. Document Collection Applications . Aplicatiile de acest fel permit utilizatorilor sa
caute colectii de documente precum site -uri web, librarii digitale sau “warehouse” -uri de
documente. Colectiile sunt, in mod normal, statice, fara schimbari majore de continut dupa
indexarea lor. Documentele pot fi de marimi si forme diferite: HTML, PDF sau Microsoft Word.
Aceste documente sunt tinute in tabele iar cautarea lor de face dupa o indexare in prealabil.

2. Catalog Information Applications constau in informatii de tip invent ar, precum
magazine online de carti sau site -uri de licitatii. Informatiile stocate reprezinta titluri de carti si
preturi. Continutul informatiilor sunt modificate cu regularitate pentru a pastra updatat catalogul
de in ventor.

3. Intr-un Document Classification Application , textul de intrare sau setul de
documente este comparat cu un set de reguli predefinite. Daca documentul indeplineste regulile,
aplicatia executa anumite actiuni (ex: trmite documentul pe email la diferi ti useri, eticheteaza
documentul, etc.).

4. XML Search Applications sunt aplicatii care fac cautari in documente XML . O
cautare obisnuita, se efectueaza intr-un set de documente pentru a le returna pe cele care
indeplinesc anumite conditii. Cautarile XML, adesea, folosesc structura fisierului pentru a limita
cautarile . In urma cautarilor, sunt returnate doar partile documentelor care indeplinesc conditiil e
de cautare. Interogarile in documente XML se numesc interogari XPATH

2. Configurarea Bazei de Date pentru a lucra in regim full text.

Inainte de a crea indec șilor si folosirea pachetelor Oracle Text predefinite, trebuie creat
un username caruia trebuie sa ii atribuim rolul CTXAPP1.

Pentru a crea un Oracle Text username, se urmeaza pa si:

1. Ne conectam cu un user cu drepturi administrative.
CONNECT sys;

2. Se creaza noul username (myuser)
CREATE USER myuser IDENTIFIED BY myuser_password;

3. Se atribuie roluri de RESOURSE2, CONNECT3 si CTXAPP nou -creatului user
GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;

4. Se dau privilegii noului user pe pachetele Oracle Text.
GRANT EXECUTE ON CTXSYS.CTX_CLS4 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DDL5 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DOC6 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT7 TO myuser;

1 Rolul CTXAPP este definit de sistem care permite utilizatorilor sa creeze si sa stearga preferinte si sa foloseasca
pachete predefinite Oracle Text.
2 Rolul RESOURCE da drepturi de creare de Tipuri, Tabele, Clustere, Triggere, Operatori, Secvente, Indec și si
Proceduri.
3 Rolul CONNECT permite userilor sa creeze sesiuni de conexiune la baza de date.
4 Permite userilor sa clasifice documentele
5 Permite c rearea de preferinte, grupuri de sectiuni si “stoplists” pentru indec șii de tip Text.
6 Sunt folosite pentru serviciile documentelorprecum sublinierea rezultatului cautarilor sau generare unei liste de
teme pentru document.
7 Permite folosirea logurilor pe ntru index

GRANT EXECUTE ON CTXSYS.CTX_QUERY8 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_REPORT9 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_THES10 TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER11 TO myuser;

In continuare, trebuiesc create tabele si populate cu date. Popularea tabelelor cu texte se
poate face in 2 feluri:

1. Fie folosindu -se comanda INSERT
2. Ori folosindu -ne de SQL*Loader (o alta aplicatie care se instaleaza odata cu baza de
date).

In functie de tipul de aplicatie (enumerate mai sus) pe care dorim sa il cream, folosim
anumiti indecși si anumite modalitati de interogare:

 Document Collection Applications foloseste index CONTEXT pe coloana text a
tabelei iar interogarea se face folosind operatorul CONTAINS . Daca se modifica datele din
tabela, indexul trebuie reactualizat. Pentru asta se foloseste procedura SYNC_INDEX din
pachetul CTX_DDL.

Figura 1 – Schema aplicatiei de tipul “Document Collection Application”
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp014. gif

8 Se foloseste pentru crearea raspunsurilor la interogari si expresiilor de interogare stocate
9 Se foloseste pentru a crea rapoarte pe indexari si interogari
10 Permite efectuara de operatiuni pe ”thesauri”
11 Permite definirea si utilizarea de w ild-card-uri

Figura 2 – Schema ordinii operatilor aplicatiei de tipul “Document Collection Application”
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp015.gif

1. Userul face o interogare dupa o secven ță de text .
2. Aplicatia executa interogarea folosind operatorul “CONTAINS”
3. In urma interogarii, aplicatia returneaza o lista cu rezultatele ( documentele ca re contin
cuvantul/cuvintele supuse cautarii, dupa relevanta lor).
4. Din lista returnata, user -ul selecteaza documetul pe care doreste sa il incarce .
5. Aplicatia returneaza intreg documentul selectat spre a fi vizualizat.

 Catalog Information App lications foloseste index CTXCAT pe coloanele folosite cel
mai des in cautari. Operatorul folosit este CATSEARCH. Intrucat cataloagele de produse se
ordoneaza adesea dupa pret, se poate crea un sub -index pe coloana “pret”. In cazul acestor tipuri
de aplica tii, indeșii se updateaza automat in momentul in care se insereaza linii noi.

Figura 3 – Schema aplicatiei de tipul “Catalog Information Application”
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp017.gif

Figura 4 – Schema ordinii operatiilor aplicatiei de tipul “Catalog Information Application”
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp016.gif
1. Userul face o interogare dupa un cuvant anume (ex: cd player ) si un component
structura t (ex: order by price ).
2. Aplicatia executa interogarea folosind opratorul CATSEARCH .
3. Aplicatia returneaza datele ordonate conform criteriul dorit.
4. Userul vizualizeaza rez ultatele.
5. Pe urma, userul ori face o alta cautare, ori face o actiune (cumpara obiectul).

 Document Classification Applications . Acest tip de aplicatie foloseste index
CTXRULE. Operatorul folosit este MATCHES

Figura 5 – Schema aplicatiei de tipul “Document Clasification Application”
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp018.gif

Ordin ea operatiilor aplicatiei de tipul “Document Clasification Application”

1. Se primeste unul sau mai multe documente.
2. Acestea intra intr -o stiva de documente care urmeaza sa fie analizate.
3. Se efectueaza analiza documentelelor pentru a fi clasificate
4. In urma clasificarii, a cestea urmeaza trasee prestabilite.

 XML Search Applications . Pentru a eficientiza viteza de executie a interogarilor
existNode() pe coloanele de tip XMLType, se foloseste indexul CTXXPATH.

3. Crearea structurii Bazei de Date si Indexarea acesteia

Intrucat aplicatia folosita spre exemplificare este de tipul “Document Collection
Application”, va trebui sa construim urmatoarele obiecte:

1. Tablea in care vom tine cartile. Tabela are urmatoarea structura:

Nume camp Tip de data Primary key Valoare defaul t INDEX
ID NUMBER YES SEQUENCE
FILE_NAME VARCAHR2( 255)
UPLOAD_DATE DATE SYSDATE
FILESIZE VARCHAR2(20)
FILETYPE VARCHAR2(5)
CREATION_DATE DATE
MODIFICATION_DATE DATE
ACCESSED_DATE DATE
CONTENT BFILE CONTEXT

Pentru a insera date in tabela avemnevoie de urmatoare setari prealabile:
1. Userul current trebuie sa aiba drepturi de a crea TRIGGER, SEQUENCE, TYPE,
PROCEDURE, TABLE, INDEX, ALTER SESSION, SYNONYM. De asemenea trebuie sa aiba
drepturi de a crea o sesiune de lucru, Oracle Text indecsi, preferinte pe indecsi si de a folosi
pachete.

Pentru toate aceste operatii, userul current ia drepturi de RESOURCE, CONNECT si
CTXAPP:
GRANT RESOURCE, CONNECT, CTXAPP to licenta;
2. Urmatorul pas, este crearea unui locatii fizice pe hard disk unde vom tine fisierele
text.
Din command prompt:

D:\mkdir D:\Oracle\datastore
3. In continuare, in baza de date vom crea o secventa:

CREATE SEQUENCE my_doc_seq MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 START
WITH 1 NOCACHE NOORDER NOCYCLE;

si un director pe care il vom lega de locatia fizica mai -sus create pe hard disk:

CREATE OR REPLACE DIRECTORY documents AS ‘ D:\Oracle\datastore ’;

4. De as emenea, este necesar sa cream un index de tip CONTEXT pentru tabela noastra,
pentru a putea facilita interogarile:

CREATE INDEX my_doc_idx ON my_doc(content) INDEXTYPE IS CTXSYS.CONTEXT;

4. Inserarea datelor in tabela

Inserarea datelor se poate face in 2 modalitati :
1. Prin utilizarea instructiunii INSERT
2. Cu ajutorul utilitarului SQL *Loader

1. Utilizand instructiunea INSERT, sintaxa este urmatoarea:

INSERT INTO my_doc
( id
, file_name
, upload_date
, filesize
, filetype
, creation_date
, modification_date
, accessed_date
, content)
VALUES
( my_doc_seq.nextval
, p_file_name
, SYSDATE
, p_file_size
, p_file_type
, p_creation_date
, p_modification_date
, p_accessed_date
, BFILENAME(‘DOCUMENTS’, ‘p_file_name’));

, unde:
 my_doc_seq.nextval este secventa create mai sus
 p_file_name este numele fisierului
 p_file_size este marimea fisierului, exprimata in KB
 p_file_type este extensia(tipul) fisierului
 p_creation_date este data crearii initialea afisierului, luata din METADATA
 p_modification_d ate este data ultimei modificari a fisierului, luata din METADATA
 p_accessed_date este data ultimei accesari a fisierului, luata din METADATA
 BFILENAME (‘DOCUMENTS’ , ‘p_file_name’) este referinta catre locatia fizica a
fisierului de pe hard disk.
Toate valorile de mai sus sunt extrase cu ajutorul intefetei utilizator care apoi sunt pasati
ca parametrii unei procedure care ii foloseste pentru a face insertul in baza de date.

2. SQL* Loader este un utilitar de la Oracle care se instaleaza odata cu clientul de baze
de date. Acesta se foloseste pentru a incarca date in daza de date lansandu -se in linie de comanda
cu parametrii. SQL*Loader este o aplicatie de parsare a datelor care pune putine limitari in
formatul datelor din fisier. Se poate folosi pentru:
 Incar carea datelor in retea. Utilitarul se poate lansa de pe un PC si i se poate spune sa
incarce date pe un alt server.
 Datele pot proveni din fisiere multiple
 Datele se pot incarca in tabele multiple, nu doar una singura
 Datele se pot incarca selective, bazan du-ne pe anumite criteria de sortare
 Datele pot fi manipulate inainte de a fi incarcate. Se pot efectua unele calcule
artimetice sau la nivel de character, folosindu -se functii SQL
 Se pot genera chei unice, secventiale, pentru coloane chei primare
 Se pot g enera rapoarte de eroare amanuntite pentur debugging
 Se pot folosi fisiere secundare pentru incarcarea tipurilor de date LOB sau al
colectiilor

Figura 6 – Schema functionarii SQL*Loader -ului
Sursa: https://docs.oracle.com/cd/B19306_01/server.102/b14215/sut81088.gif
O lista a parametrilor cu care poate fi lansat utilitarul SQL*Loader se poate obtine
executand in command prompt:
D:\sqlldr

Comanda SQLLDR se executa in felul urmator:

D:\sqlldr param1 = val1 param2 = val2 param3 = val3 …

Cei mai importanti parametrii sunt:
 userid – credentialele de conect are la baza de date (in format “username/password”)
 control – fisierul de contro l in care este descrisa structura fisierului de date , care
trebuie sa fie identica cu cea a tabelei destinatie
 data – fisierul de date
 log – fisierul de loguri
 bad – fisierul in care vor fi scrise liniile care au generat eroare
 discard – fisierul in care vor fi scrise liniile care au fost omise
 errors – parametru de tip valoare care specifica numarul de erori permise
 skip – parametru de tip valoare care specifica numarul de inregistrari care pot fi omise

Pentru a pute a insera date in tabela folosind utilitarul SQL*Loader, trebuie sa generam
fisierul de control ( .CTL ) si de asemenea, trebuie sa generam dimanic , fisierul de date (.DAT ),
care trebuie sa fie corespunzator structurii tabelei destinatie si parametrului “control”.

Fisier CTL
load data
infile 'F: \!!! Licenta \SQLLoader \loader.dat'
into table my_doc
replace
fields terminated by ';'
( id SEQUENCE(1, 1)
, file_name CHAR(255)
, upload_date SYSDATE
, filesize CHAR(20)
, filetype CHAR(5)
, content BFILE(CONSTANT 'documents', file_name)
, creation_date DATE "DD -MON-YYYY"
, modification_date DATE "DD -MON-YYYY"
, accessed_date DATE "DD -MON-YYYY")

Disier DAT, care se va crea dinamic din interfata

moartea-lui-ivan-ilici.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
incursiuni in alte lumi.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 2. LUNA NOUA model.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Carte_de_bucate_Radu_Anto n_Roman.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
colosul_picioare_lut.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Carlo Collodi – Pinocchio.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Brown Dan – Ingeri si Demoni.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Asimov-Bun-gust.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
wordfile.docx;10;.docx;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
brown dan – codul lui da vinci.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Brown Dan – Fortareata D igitala.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 1. Amurg (Twilight).pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Asimov-Cel-din-urma-raspuns.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 4. Zori de zi.pdf ;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 3. Eclipsa.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephen-W-Hawking-Scurta-istorie-a-timpului.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 0. Poster Twilight.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 5. Soarele de la miezul noptii.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-
2001;
text.txt;10;.txt;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
test.doc;10;.doc;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
htmldoc.html;10;.html;01 -JAN-2001;01-JAN-2001;01-JAN-2001;

NOTA: Valorile de tip data, numele fisierelor, extensia lor cat si marimea lor, sunt
hardcodate, doar pentru exemplificare. Daca se folosea aceasta metoda de inserare a datelor in
tabela, atunci ele proveneau din METADATA.

Ultimul lucru care ar mai trebui facut pentru ca datele sa ajunga in tabela este rularea
comenzii sqlldr din command prompt

D:\ C:\Users\Ionut>sqlldr userid=l icenta/02021979 control='F: \!!!
Licenta\SQLLoader \loader.ctl' log='F: \!!! Licenta \SQLLoader \loader.log'
data='F: \!!! Licenta \SQLLoader \loader.dat'

Pentru mai multe informatii legate de incarcarea datelor cu SQL&Loader se poate vizita
site-ul Oracle dedicat

5. Interogarea Baz ei de Date

O interogare simpla peste o baza de dare Oracle Text primeste ca parametru un cuvant
impreuna cu sau fara un operator. Baza d e date returneaza toate documentele indexate in
prealabil) care satisfac expresia impreuna cu o valoare de relevanta numita ”scor”. Valoarea
”scor” poate fi folosita pentur ordonarea documentelor in setul de rezultate.

Pentru a scrie o interogare Oracle Text se foloseste instructiunea SELECT. In functie de
indexul create, se foloseste ori operatorul CONTAINS ori CATSEARCH in clauza WHERE.
Acesti operatori se pot folosi si programatic, in PLSQL, in cursoare.

1. Interogare cu operatorul CONTAINS. Trebuie folosit atunci cand se foloseste indexul
CONTEXT . Acest index se foloseste pent ru indexarea colectiilor de documente mari (ie.
Aplicatii de tipul bibliotecilor online, ziare online, etc) . Impreuna cu oper atorul CONTAINS, se
pot folosi alti operator i pent ru a defini criteriile de cautare. Criteriile de cautare pot fi

 logice (expresii care descriu un criteriu strict de potrivire)
 de proximitate (utilizand operatorii NEAR/ONEAR )
 criterii ”oarecum similare” (fuzzy – se folosesc atunci cand valoarea cautata nu se
potriveste 100% cu valoarea in baza de date
 bazate pe aceeasi radaciba lingvistica (stemming)
 Thesaurus operators
 Bazate pe caractere ”wildcard”
 Bazate pe operatorul ABOUT

SELECT SCORE(1),
file_name
FROM my_doc
WHERE CONTAINS (content, ‘test’, 1) > 0
ORDER BY SCORE(1) DESC;

Operatorul COTAINS trebuie sa fie totdeauna strict mai mare decat 0(zero), ceea ce
specifica, ca valoarea ”scor” returnata de CONTAINS trebuie sa fie strict mai mare decat 0
pentru a fi returnat un rezulta t.

Exempl u PLSQL unde se poate folosi operatorul CONTAINS:

DECLARE
row_no PLS_INTEGER := 0;
INTEGER
FOR i IN (SELECT SCORE(1),
file_name
FROM my_doc
WHERE CONTAINS(content, ‘test’, 1) > 0
ORDER BY SCORE(1) DESC;)
LOOP
row_no := row_no + 1;
DBMS_OUTPUT.PUT_LINE(i.title || ': ' || i.score);
EXIT WHEN row_no = 10;
END LOOP;
END;

2. Interogare cu operatorul CATSEARCH. Acest operator trebuie folosit atunci cand
indexarea se face cu CTXCAT. Indexul CTXCAT se foloseste atunci cand aplicatia foloseste
texte de lungime scurta coloane de tip text si alte informatii asociate (ie. magazine online,
cataloage de produse, etc.).

Operatorii asociati tipurilor de interogari CATSEARCH se limiteaza la AND si OR.
Pentru a defini criterii structurate se mai folosesc operatori GRATER THAN (>), LESS THAN
(<), EQUALITY(=), BETWEEN, IN.

SELECT
FROM auction
WHERE CATSEARCH(title, 'camera' , 'category_id = 99 ORDER BY bid_close DESC')
> 0;

3. Interogare cu operatorul MATCHES. Cand se creaza un index CTXRULE, operatorul
folosit trebuie sa fie MATCHES pentru a clasifica documente. Indexul CTXRULE este necesar
pentur un set de interogari care definesc criteriile de clasificare.

Spre exemplu, daca se primeste unu grup de fisiere care trebuiesc clasificate, trebuiesc
create o serie de interogari care definesc catogoriile. Pentru asta se creaza interogarile ca si linii
in coloane de tip text. Acest tip de tabela se poate crea cu procedura CTX_CLS.TRAIN. Apoi se
indexeaa tabela cu indexul CTXRULE. Cand se primesc documentele, se foloseste operatorul
MATCHES pentru a clasifica fiecare fisier.

CREATE TABLE clasificari (
id NUMBER,
string VARCHAR2 (80));

INSERT INTO queries VALUES (1, ‘Parlamentul );
INSERT INTO queries VALUES (2, 'Senatul);
INSERT INTO queries VALUES (3, 'Camera deputatilor ');
INSERT INTO queries VALUES (4, 'Guvernul ');
INSERT INTO queries VALUES (5, 'promulgat o lege ');
INSERT INTO queries VALUES (6, 'abogat o lege ');
INSERT INTO queries VALUES (7, 'pensionarilor ');
INSERT INTO queries VALUES (8, 'bugetarilor ');

CREATE INDEX clasificari_idx ON clasificari( string) INDEXTYPE IS
CTXSYS.CTXRULE;

SELECT id FROM clasificari
WHERE MATCHES(string, Parlamentul a promulgat o lege care mareste veniturile
pensionarilor si bugetarilor cu 50% .') > 0;

Aceasta interogare va return clasificarile 1 (pentru ca contine cuv antul ”Parlamentul”), 5 (pentru
ca contine cuvintele ”promulgat o lege”), 7 (pentru ca contine cuvantul ”pensionarilor”) si 8
(pentru ca contine cuvantul ”bugetarilor”).

6. Prezentarea documentelor in Oracle Text

In Oracle Text, cuvintele cheie, dupa care se face cautarea, pot fi evidentiate pentru a
ajuta utilizatorul sa le observe cu o mai mare usurinta. Se pot genera 3 modalitati de evidentiere a
rezultatelor:
1. Doar valorile cautate sunt marcate.
2. Sunt marcate val orile care au legatura cu cu vantul cautat
3. Valorile cautate sunt evidentiate impreuna cu textele din jurul lor.

1. In cazul in care este evidentiat textul cautat, se specifica conditia de cautare iar Oracle
Text marcheaza cuvintele in document care satisfac conditia de cautare. Ca rezultat se obtine fie
un fisier test fie un fisier HTML.

Exemplu:

2. In cazul in care se opteaza pentru marcarea cuvintelor care au legatura cu cuvantul
cautat, se foloseste interogare cu predicatul ABOUT. Procedurile pachetului CTX_DOC
marcheaza cuvinte sau fra ze cu cea mai mare relevanta in interogarea ABOUT.
Astfel, se defineste o colectie de cuvinte care au legatura cu un anume con text. S pre
exemplu, pentru cuvantul ”calamitate”, definim legturile: cutre mur, seism , incendi i, taifun, …
La un semn, un țărm de altul, legând vas de vas, se leagă
Și în sunet de fanfare trece oastea lui întreagă;
Ieniceri, copii de suflet ai lui Al lah și spahii
Vin de -ntunecă pământul la Rovine în câmpii;
Răspândindu -se în roiuri, întind corturile mari…
Numa -n zarea depărtată sună codrul de stejari.

Iată vine -un sol de pace c -o năframă -n vârf de băț.
Baiazid, privind la dânsul, îl întreabă cu dispreț:
– Ce vre i tu?
– Noi? Bună pace! Și de n -o fi cu bănat,
Domnul nostru -ar vrea să vază pe măritul împărat.

tornada, tsuna mi, inundatii ; iar intr -un articol despre vreme, daca se va face cautare dupa
cuvantul ”calamitate”, oricare din cuvintele legate de acesta va fi marcat

Exemplu:

3. In cea de 3 -a modalitate de evidentiere a textelor, nu este returnat tot documentul ci
doar contextul in care se situeaza cuvintele cautate. Astfel procedurile CTX_DOC.SNIPPET si
CTX_DOC.POLICY_SNIPPET produc o concordanta a documentului in care aparitia cuvantului
cautat este returnat impreuna cu textul inconjura tor. Acest rezultat este adesea cunoscut ca si
”Cuvat in Context” (Key Word in Context) datorita faptului ca nu este returnat tot documentul ci
doar fraza din care face parte cuvantul cautat.
Cele 2 proceduri, CTX_DOC.SNIPET si CTX_DOC.POLICY_SNIPPET sunt
echivalente cu exceptia faptului ca prima dintre ele nu necesita un index.

Cutremur ul din Oceanul Indian din 2004 a fost un seism submarin cu o magnitudine de 9,0
grade pe scara Richter desfășurat în estul Oceanului Indian pe 26 decembrie 2004 (la 00:58
UTC, sau 07:58 ora locală). Cutremur ul, care a avut epicentrul în mare, aproape de co asta
nordică a insulei indoneziene Sumatra, a provocat o serie de valuri tsunami care au afectat
regiunile costiere ale unui număr de opt țări asiatice și care au cauzat moartea a peste
120.000 de persoane. Acesta a fost al cincilea cel mai puternic cutrem ur din istoria modernă
(de când sunt înregistrate cu ajutorul seismografelor).
Mai multe valuri tsunami au lovit regiunile costiere din Oceanul Indian, devastând regiuni
întregi, printre care insula Phuket, Tailanda, Aceh (Indonezia), coasta de est a Sri L ankăi,
zonele costiere din statul Tamil Nadu (Indiei) și chiar și locuri mai îndepărtate precum
Somalia, care se află la 4.100 km est de epicentru.
Datorita inundatii lor produse, nulte zone au ramas sinistrate izbucnind epidemii ale unor
boli cauzate de contaminarea apei.
In multe zone au fost localizate incendii care au devastat zone largi de paduri dar si cartiere
intregi de locuinte.
Autoritatile au decretat stare de urgenta.

7. Clasificarea Documentelor in Oracle Text

O problema majora cu care se confrunta companiile si institutiilein zilele noastre este
aceea de supraincarcare a informatiilor. Sep ararea documentelor de interes de cele care nu se
refera la subiecul dezbatut reprezinta provocarea ingeniozitatii atat a indivizilor cat si a
companiilor.
O modalitate de a analiza numeroase documente este de a folosi motoare de cautare cu
cuvinte cheie. Un dezavantaj major al acestor motoare de cautare este ca nu discrimineaza
contextual din care fac parte cuvintele respective. In multe limbi, un cuvant poate avea mai multe
sensuri astfel ca o cautare poate returna mai multe potriviri fara ca toate sa se potriveasca cu
subiectul dorit.

Spre exemplu, o cautare dupa expresia “A da col țul”, poate returna documente diferite ca
si context datorita multiplelor intelesuri ale expresiei.
O strategie alternative este ca, in prealabil, documentele sa fie sortate de catre oameni dar
acest lucru nu este posibil pentru volume foarte mari de documente.

Oracle Text ofera diferite abordari pentru clasificarea docuemntelor:
1. In clasificarea bazata pe reguli , noi trebuie sa ne scriem singuri regulile.
2. In clasificarea supravegheata , Oracle creaza un set de reguli de clasificare care au la
baza un set de documente de proba car e sunt pre -clasificate.
3. In clasificarea nesupravegheata , cunoscuta ca si clus tering, Oracle Text indeplineste
toti pasii de scriere a regulilor si clasificare a docu mentelor.

Oracle Text ne permite sa cream aplicatii de clasificare a documentelor. O astfel de
aplicatie intreprinde o actiune bazata pe continutul documentului. Actiunile includ atribuirea de
ID-uri de categorii unui document pentru o cautare viitoare sau pentru trimiterea documentului
unui utilizator. Rezultatul este un set sau un flux de documente clasificate.

Figura 7 – Prezentarea un ei aplicatii de clasificare a documentelor
Sursa: https://docs.oracle.com/cd/B28359_01/text.111/b28303/img/ccapp018.gif

Solutii de clasificare:
a. Clasificarea bazata pe reguli . In cadrul acestui tip de clasificare, se grupeaza
documentele, se decid categorii si se formuleaza regulile care definesc aceste categorii . Aceste
reguli reprezinta interogarile care se folosesc. Apoi, se indexeaza regulile si se foloseste
operator ul MATCHES pentru a clasifica documentele.

Avantaje: Clasificarea bazata pe reguli este foarte precisa pentru seturi de documente
mici. Rezultatele se bazeaza pe ceea ce definim, deoarece astfel definim regulile.
Dezavantaje: Regulile de definire pot fi p lictisitoare pentru seturile de documente mari cu
mai multe categorii. Daca documentul creste este posibil sa fie necesar sa scriem in mod
corespunzator mai multe reguli.

Clasificarea bazata pe reguli (denumita uneori si clasificare simpla) este modalitatea de
baza pentru crearea unei aplicatii de clasificare Oracle Text.
Pasii pentru a crea o aplicatie de clasificare bazata pe reguli sunt:
 Crearea unei tabele pentru documentele care urmeaza sa fie clas ificare si popularea ei
cu date.
 Crearea unei tabele de reguli (cunoscuta si ca tabela de categorii). Tabelul de
categorii pe care le numim, spre exemplu „medicina”, „finante” si regulile care sorteaza
documentele in acele categorii.
Aceste reguli, sunt d e fapt interogari.

Exemplu: Ar putea fi creata categoria „medicamente” ca fiind compusa din documentele
care contin cuvintele „spital”, „doctor” sau „boala” astfel incat sa stabilim o regula a
formularului „spital OR medic OR boala”.

 Crearea indexului CTXRULE pe tabela de reguli .
 Clasificarea documentelor.

Exemplu de clasificare pe baza de reguli:

Odata ce regulile sunt create, le putem indexa si apoi folosi cu operatorul MATCHES
pentru a clasifica documentele.

Crearea schemei:
create table news_table (
tk number primary key not null,
title varchar2(1000),
text clob);

create table news_categories (
queryid number primary key not null,
category varchar2(100),
query varchar2(2000));

create table news_id_cat (
tk number,
category_id number);

Incarcarea datelor cu SQL Loader:
LOAD DATA
INFILE 'loader.dat'
INTO TABLE news_table
REPLACE
FIELDS TERMINATED BY ';'
(tk INTEGER EXTERNAL,
title CHAR,
text_file FILLER CHAR,
text LOBFILE(text_file) TERMINATED BY EOF)

Crearea categoriilor:

In acest pas definim categoriile si scriem regulile pentru fiecare categorie.

Categorii Definite
Statele Unite Europa Orientul Apropiat
Asia Africa Conflicte
Finante Tehnologie Consumabile Electronice
America Latina Politica Lumii Politica Statelor Unite
Dezastre Naturale Legislatie Noutati Muzicale
Astronomie Paleontologie Sanatate

O regula este o interogare care selecteaza documente pentru o categorie. Spre exemplu,
categoria Asia, are ca regula „China OR Pachistan OR India OR Japonia”. Inseram regulile in
tabela “news_categories ” dupa cum urmeaza:
insert into news_categories value s
(1,'Statele Unite','Washington OR George Bush OR Colin Powell');

insert into news_categories values
(2,'Europa ','Anglia OR Marea Britaine OR Germania');

insert into news_categories values
(3,'Orientul Apropiat ','Israel OR Iran OR Palestin a');

insert into news_categories values
(4,'Asia','China OR Pa chistan OR India OR Japonia');

insert into news_categories values
(5,'Africa','Eg ipt OR Keni a OR Nigeria');

insert into news_categories values
(6,'Conflict e','razboi OR soldati OR armata OR trupe');

insert into news_categories values
(7,'Finan te','profit OR pierderi OR Wall Street');

insert into news_categories values
(8,'Technolog ie','software OR computer OR Oracle OR IBM OR Microsoft');

insert into news_categories values
(9,'Consum er electronics','HDTV OR electronic e');

insert into news_categories values
(10,'America Latina','Venezuela OR Col umbia OR Argentina OR Brazilia');

insert into news_categories values
(11,'Politica Lumii ','Hugo Chavez OR George Bush OR Tony Blair OR Saddam
Hussein OR United Nations');

insert into news_categories values

(12,'Politica Statelor Unite ','George Bush OR Democrat ii OR Republican ii OR
drepturi civile OR Senat OR Casa Alba ');

insert into news_categories values
(13,'Astronom ie','Jupiter OR Pamant OR stea OR planeta OR Orion OR Venus OR
Mercur OR Marte OR Calea Lactee OR Telescop OR NASA OR astronaut');

insert into news_categories values
(14,'Paleontolog ie','fosil e OR cercetator OR paleontolog OR dinozaur OR
Natura');

insert into news_categories values
(15,'Sanatate ','celule stem OR embrion or sanatate OR medical OR medicina
OR Organizati a Mondiala a Sanatatii OR SIDA OR HIV OR virus OR centrele
pentru controlul dezastrelor OR vaccinare');

insert into news_categories values
(16,'Dezastre Naturale ','cutremur OR uragan OR tornada');

insert into news_categories values
(17,'Legislatie ','Curtea Suprema OR ilegal OR legal Or legislati e');

insert into news_categories values
(18,'Noutati Muzicale ','piraterie OR anti-piraterie OR copyright CD-uri OR
muzica OR artist OR cantec');

commit;

Crearea indexului CTXRULE pe coloana „query” a tabelei „ news_categories ”:
create index news_cat_idx on news_categories(query)
indextype is ctxsys.ctxrule;

Clasificarea documentelor:
Pentru a clasifica documentele, construim procedura PLSQL „clasifica” care parcurge
tabela „new_table” potriveste fiecare document cu o categorie si scrie categoriile rezultate in
tabela "news„id_cat”.
procedure clasifica
is
v_document clob;
v_item number;
v_doc number;
begin

for doc in (select tk, text from news_table)
loop
v_document := doc.text;
v_item := 0;
v_doc := doc.tk;
for c in (select queryid, category f rom news_categories
where matches(query, v_document) > 0 )
loop

v_item := v_item + 1;
insert into news_id_cat values (doc.tk,c.queryid);
end loop;
end loop;

end clasifica;

Urmatoarele considerente se aplica indexarii unui index CTXRULE:

 Daca este folosit clasificatorul SVM_CLASSIFIER, se pot utiliza lexerii
BASIC_LEXER, CHINESE_LEXER, JAPANESE_LEXER sau KOREAN_MORPH_LEXER.
Daca nu se utilizeaza SVM_CLASSIFIER, numai lexerul BASIC_LEXER poate fi folosit pentru
a indexa setul de interogari .
 Filtrele, memoria, datele de stocare si parametrii nu se aplica indexului CTXRULE.
 Clauza d e stocare CREATE INDEX este acceptata pentru crearea indexului
interogarilor.
 Listele de cuvinte sunt acceptate pentru operatia de stopare a setului de interogari.
 Interogarile pentru indexul CTXRULE sunt similar cu cele pentru interogariel
CONTAINS. Expresia de baza este suportata la efl ca si urmatorii operatori: ABOUT, AND,
NEAR, OR, NOT, STEM, WITHIN, THESAURUS. Grupurile de sectiuni sunt acceptate pentru
utilizarea operatorului MATCHES pentru clasificarea documentelor. Cu toate acestea,
CTXRULE nu suporta in mod direct interogarile de pe coloana, astfel trebuie sa utilizam o
rescriere a interogarii pe interogarea CONTEXT.

b. Clasificarea supravegheata . Aceasta metoda este similara cu clasificarea pe
reguli, dar pasul descriere a regulilor este automatizat cu CTX_CLS.TRAIN(procedura TRAIN a
pachetului CTX_CLS). CTX_CLS.TRAIN formuleaza un set de reguli de clasificare dintr -un set
de documente pre -clasificate care sunt furnizate. Ca si in cazul clasificarii bazate pe reguli, se
foloseste operatorul MATCHES pentru clasificare.
Oracle Text ofera 2 versiuni ale clasificarii supravegheate, una utilizand prefe rinta
RULE_CLASSIFIER si una utilizand preferinta SVM_CLASSIFIER.

Avantaje: Regulile sunt scrise automat pentru utilizator. Acest lucru este folositor in
cazul documentelor foarte mari.
Dezavantaje: Documentele trebuisc incadrate in categorii inainte de a genera regulile.
Regulile nu pot fi la fel de precise sau exacte ca cele scrise manual.

Cu clasificarea supravegheata, se foloseste procedura CTX_CLS.TRAIN pentru a
automatiza etapa de scriere a regulilor. CTX_CLS_TRAIN foloseste un set de instructiuni de
exemple de documente pentru a deduce regulile de clasificare. Acesta este avantajul major fata
de clasificare bazata pe reguli in care trebuie sa scriem noi regulile de clasificare.

Cu toate acestea, inainte sa folosim procedura CTX_CLS.TRAIN, trebuie s a cream
manual categorii si trebuie sa corelam fiecare document din setul de tipare cu o categorie.
Cand regulile sunt generate, pot fi indexate pentru a crea indexul CTXRULE, apoi putem
utiliza operatorul MATCHES pentru a clasifica un set de decumente no i.
Se poate alege intre 2 algoritmi pentru clasificarea supravegheata:

 Decision Tree (Clasificarea prin Arborele de Decizie). Avantajul acestui algoritm este
ca regulile generate sunt usor de observat si modificat.
 SVM -based (Clasificarea bazata pe SVM). Aceasta metoda foloseste algoritmul
Support Vector Machine (SVM) pentru crearea regulilor. Adesea, acest algoritm este mai precis
decat algoritmul Decision Tree. Dezavantajul este ca sunt create reguli binare, greu de inteles.

i. Clasificarea supravegheata c u algoritmul Decision Tree

Pentru a folosi clasificare prin arborele de decizie, se seteaza argumentul lui
CTX_CLS.TRAIN pe RULE_CLASSIFIER.
Aceasta forma de clasificare foloseste algoritmul arborelui de decizie pentru a crea reguli.
In general un arbore de decizie este o metoda de alegere intre 2 (sau mai multe, dar in general 2)
optiuni. In clasificarea documentelor, optiunile sunt „documentul se potriveste cu tiparul” si
„documentul nu se potriveste cu tiparul”.
Un arbore de decizie are un set de atribute care pot fi testate. In cazul de fata, acestea
includ:
 Cuvant din document
 Parti ale cuvintelor din document
 Sinonime din document
Algoritmul de invatare din Oracle Text construieste unul sau mai mult arbori de decizie
pentru fiecare categorie fur nizata in tipar. Apoi, acesti arbori de decizie sunt codificati in
interogari potrivite pentru a fi folositi de indexul CTXRULE.
Arborii de decizie incluld conceptul de incredere. Fiecare regula generata este alocata
unei valori procentuale care reprezinta precizia regulii, avand in vedere tiparul curent. In
exemple simple, aceasta precizie este aproape intotdeauan 100% dar aceasta reprezinta limitarile
tiparului.
Avantajul algoritmului Arborelui de decizie este ca poate genera reguli usor de citit si
modificat de catre om. Folosirea algortimului Arborelui de Decizie are sens atunci cand dorim sa
generam automat (cu ajutorul calculatorului) cea mai mare parte a regulilor dar dorm sa le
editam ulterior prin modificarea setului de reguli.

Exemplu de cl asificare supravegheata, folosi nd Arborele de Decizie:
Urmatorul exemplu SQL parcurge crearea documentului si a tabelelor de clasifica re, a
clasificarii documentelor, si genereaza reguli. Apoi genereaza reguli cu CTX_CLS.TRAIN.
Regulile sunt apoi indexate cu indexul CTXRULE si apoi clasificate cu operatorul MATCHES.
Pasii generali pentru clasificare supravegheata sunt:
 Crearea reguli lor categoriei
 Indexarea regulilor pentru categorizarea noilor documente
Crearea regulilor categoriei.
Procedura CTX_CLS.TRAIN are nevoie de un document de tipar. Un tipar este un set de
documente care au fost deja atribuite unei categorii.
Crearea si popularea unei tabele pentru documentul de tipar
create table docs (
doc_id number primary key,
doc_text clob);

insert into docs values
(1, 'MacTavishes is a fast -food chain specializing in burgers, fries and –
shakes. Burgers are clearly their most important line.');

insert into docs values
(2, 'Burger Prince are an up -market chain of burger shops, who sell burgers –
and fries in competition with the likes of MacTavishes.');

insert into docs values
(3, 'Shakes 2 Go are a new venture in the low -cost restaurant arena,
specializing in semi -liquid frozen fruit -flavored vegetable oil products.');

insert into docs values
(4, 'TCP/IP network engineers generally need to know about routers,
firewalls, hosts, patch cables networking etc');

insert into docs values
(5, 'Firewalls are used to protect a network from attack by remote hosts,
generally across TCP/IP');

Crearea tabelelor de categorii, descrierilor categoriilor si id -urilor
create table category_descriptions (
cd_category number,
cd_description varchar2(80));

create table doc_categories (
dc_category number,
dc_doc_id number,
primary key (dc_ category, dc_doc_id))
organization index;

insert into category_descriptions values (1, 'fast food');
insert into category_descriptions values (2, 'computer networking');

Atribuirea fiecarui document unei categorii
insert into doc_categories values (1, 1);
insert into doc_categories values (1, 2);
insert into doc_categories values (1, 3);
insert into doc_categories values (2, 4);
insert into doc_categories values (2, 5);

Crearea indexului CONTEXT pentru a fi folosit de procedura CTX_CLS.TRAIN
exec ctx_ddl.create_preference('my_lex', 'basic_lexer');
exec ctx_ddl.set_attribute ('my_lex', 'index_themes', 'no');
exec ctx_ddl.set_attribute ('my_lex', 'index_text', 'yes');

create index docsindex on docs(doc_text) inde xtype is ctxsys.context
parameters ('lexer my_lex');

Crearea tabelei de reguli
create table rules(
rule_cat_id number,
rule_text varchar2(4000),
rule_confidence number
);

Apelarea proecdurii CTX_CLS.TRAIN pentru a genera categoria de reguli
begin
ctx_cls.train(
index_name => 'docsindex',
docid => 'doc_id',
cattab => 'doc_categories',
catdocid => 'dc_doc_id',
catid => 'dc_category',
restab => 'rules',
rescatid => 'rule_cat_id',
resquery => 'rule_text',
resconfid => 'rule_confidence'
);
end;

Potrivirea regulilor generate dupa categorie
select cd_description, rule_confidence, rule_text
from rules, category_descriptions
where cd_category = rule_cat_id;

Indexarea regulilor pentru categorizarea noilor documente
Indexarea regulilor pentru a crea indexul CTXRULE
create index rules_idx on rules (rule_text) indextype is ctxsys.ctxrule;

Testarea unui document folosind operatorul MATCHES
declare
incoming_doc clob;
begin
incoming_doc
:= 'I have spent my entire life managing restaurants selling burgers';
for c in
( select distinct cd_description from rules, category_descriptions
where cd_category = rule_cat_id
and matches (rule_text, incomi ng_doc) > 0) loop
dbms_output.put_line('CATEGORY: '||c.cd_description);
end loop;
end;

ii. Clasificarea supravegheata cu algoritmul SVM

Cel de -al doilea algoritm pe care il putem folosi pentru a pregati tiparele este cunoscut
sub denumirea de SVM (Support Vector Machine). SVM este un tip de algoritm derivat din
teoria invatarii statistice ( Statistical Learning Theory ). O proprietate a algoritmului SVM este
abilitatea de a put ea defini un tipar dintr -un set mic de exemple.
Folosirea algoritmului SVM este asemenatoare cu cea a Arborelui de Decizie, cu
urmatoarele diferente:

 Preferinta folosita catre apelul CTX_CLS.TRAIN trebuie sa fie de tip
SVM_CLASSIFIER in loc de RULE_CLASSIFIER (Daca nu dorim sa modificam toate
atributele, putem sa folosim preferinta predefinita CTXSYS.SVM_CLASSIFIER).
 Indexul CTXRULE de pe tabela nu trebuie populat cu date, adica se poate folosi
cuvantul cheie NOPUPOLATE. Clasificatorul il folose ste doar pentru a gasi sursa textului , prin
preferintele de date si filtre, si pentru a determina cum trebuie procesat textul.
 Tabela pentru regulile generate trebuie sa aiba(cel putin) aceste coloane:

cat_id number,
type number,
rule blob );

Dupa cum se poate observa, regula generala este scrisa intr -o coloana BLOB. Asadar
utilizatorul nu o poate edita sau modifica. Compromisul este ca folosind algorimul SVM se
obtine o precizie considerabil mai buna decat in cazul algorimului Arborel ui de Decizie.
Daca este folosita metoda SVM, memoria alocata trebuie sa fie suficient de mare pentru a
incarca tiparul SVM; in caz contrar, aplicatia se va termina in eroare (out -of-memory).
Memoria alocata se calculeaza dupa formula:
Memoria minima necesara (in bytes) = numarul de categorii unice x numarul de
caracteristici
example: ( value of MAX_FEATURES
attributes ) x 8

Daca este necesar sa indeplinim cerintele minime de memorie, fie:
 Marim memoria SGA
 Marim memoria PGA

Exemplu de clasificare supravegheata, folosin d algoritmul SVM :

Crearea si popularea tabelei de tipare a documentelor
create table doc (id number primary key, text varchar2(2000));
insert into doc values(1,'1 2 3 4 5 6');
insert into doc values(2,'3 4 7 8 9 0');
insert into doc values(3,'a b c d e f');
insert into doc values(4,'g h i j k l m n o p q r');
insert into doc values(5,'g h i j k s t u v w x y z');

Crearea si popularea tabelei de categorii
create table testcategory (
doc_id number,
cat_id number,
cat_name varchar2(100)
);
insert into testcategory values (1,1,'number');
insert into testcategory values (2,1,'number');
insert into testcategory values (3,2,'letter');
insert into testcategory values (4,2,'letter');
insert into testcategory values (5,2,'letter');

Crearea indexului CONTEXT pe tabela de documente
create index docx on doc(text) indextype is ctxsys.context
parameters('nopopulate');

Setarea SVM_CLASSIFIER -ului
exec ctx_ddl.create_preference('my_classifier','SVM_CLASSIFIER');
exec ctx_ddl.set_attribute('my_classifier','MAX_FEATURES','100');

Crearea tabelei rezultatelor
create table restab (
cat_id number,
type number(3) not null,
rule blob
);

Crearea tiparelor
exec ctx_cls.train('docx', 'id','testcategory', 'doc_id', 'cat_id', 'restab',
'my_classifier');

Crearea unui index CTXRULE pe tabela regulilor
exec ctx_ ddl.create_preference ('my_filter ', 'NULL_FILTER ');
create index restabx on restab(rule)
indextype is ctxsys.ctxrule
parameters(‘filter my_filter classifier my_classsifier’);

Acum putem clasifica 2 documente necunoscute
Select cat_id, match_score(1)
from restab
where matches(rule, ‘4 5 6’, 1) > 50;

Select cat_id, match_score(1)
from restab
where matches(rule, ‘f h i’, 1) > 50;

c. Clasificarea nesupravegheata(clust ering) . Toti pasii de la gruparea
documentelor la scrierea regulilor sunt automatizati cu CTX_CLS.CLUSTERING. Oracle Text
analizeaza statistic setul de documente si le coreleaza c u clusterele in functie de continut.
Avantaje : Nu este necesar sa furnizam regulile de clasificare sau exemple de documente
pentru a crea sabloane de clasificare. Ajută la descoperirea tiparelor și a asem anarilor de con tinut
din setul de documente care ar putea fi trecute cu vederea.
Dezavantaje: Deoarece operatia de grupare nu este definita de utilizator, ci pe un algoritm
intern, pot aparea grupari neasteptate, intrucat regulile care creaza grupurile nu sunt vizibile.
Operatia de clasificare este consuma toare ce resurse din punctul de vedere al procesorului si
poate dura la fel de mult timp ca si indexarea.
Folosind clasificare bazata pe reguli userii trebuie sa scrie regulile pentru clasificarea
documentelor. Prin clasificarea supravegheata, Oracle Text scrie regulile dar userii trebuie sa
furnizeze un tipar pentru pre -clasificarea documentelor. In clasificarea nesupravegheata
(cusnoscuta ca si clustering), userii nu trebui nici macar sa furnizeze tiparul de pre -clasificare a
documentelor; clasificarea ef ectuandu -se prin procedura CTX_CLS.CLUSTERING.
Procedura CTX_CLS.CLUSTERING creaza o ierarhie a grupurilor de documente
cunoscute sub numele de clustere, si, pentur fiecare document, returneaza scoruri de relevanta
pentru toate grupurile de frunze.
Spre ex emplu, presupunem ca exista o colectie vasta de documente referitoare la animale.
CTX_CLS.CLUSTERING ar putea crea un cluster de frunze despre caini, altul despre pisici,
altul despre pesti siinca unul despre ursi. Primele 3 clustere pot fi grupate sub un grup de noduri
privind animalele de companie. De asemenea, presupuneam ca mai avem inca un document
despre o rasa de caine (Chihuahua).
Procedura CTX_CLS.CLUSTERING atribuie clusterul „caini ” docum entului cu un scor
de relevanta foarte mare, in tip ce clusterul „pisici” ar fi atribuit cu o relevanta mai mica iar
clusterele „pesti” si „ursi” ar fi atribuite cu scoruri de relevanta si mai mici. Odata ce au fost
atribuite scoruri pentru clusterele tuturor documentelor, aplicatia poate actiona pe baza scoru rilor
de relevanta.
Asa cum am mentionat in clasificarea supravegheata, bazata pe algoritmul Arbori lor de
Decizie, atributele utilizate pentru determinarea clusterelor, pot consta in cuvinte simple, parti
din cuvinte sau sinonime ale cuvintelor.
Procedura CTX_CLS.CLUSTERING expune rezultatele in doua tabele (care pot fi tabele
din memorie):
 O tabela de atribuire a documentelor care care arata gradul de similitudine dintre
document si fiecare frunza a clusterului.
 O tabela de descriere a clusterului care contine informatii despre ce inseamna un
cluster general.

Exemplu de clasificare nesupravegheata:
set serverout on

/* collect document into a table */
create table collection (id number primary key, text varchar2(4000));

insert into collection values (1, 'Oracle Text can index any document or
textual content.');

insert into collection values (2, 'Ultra Search uses a crawler to access
documents.');

insert into collection values (3, 'XML is a tag -based markup language.');

insert into collection values (4, 'Oracle Database 11g XML DB treats XML
as a native datatype in the database.');

insert into collection values (5, 'There are three Text index types to cover
all text search needs.');

insert into collection values (6, 'Ultra Search also provides API
for content management solutions.');

create index collectionx on collection(text)
indextype is ctxsys.context parameters('nopopulate');

/* prepare result tables, if you omit this step, procedure will create table
automatically */
create table restab (
docid NUMBER,
clusterid NUMBER,
score NUMBER);

create table clusters (
clusterid NUMBER,
descript varchar2(4000),
label varchar2(200),
sze number,
quality_score number,
parent number);

/* set the preference */
exec ctx_ddl.drop_preference('my_cluster');
exec ctx_ddl.create_preference('my_cluster','KMEAN_CLUSTERING');
exec ctx_ddl.set_attribute('my_cluster','CLUSTER_NUM','3');

/* do the clustering */
exec ctx_output.start_log('my_log');
exec ctx_cls.clustering('collectionx','id','restab','clusters','my_cluster');
exec ctx_output.end_log;

8. Tuning Oracle Text

La fel ca si in celelalte tipuri de baze de date, si in Oracle T ext se pot face oprimizari
pentru a imbunatati performantele cau tarilor si indexarilor. Aceste optimizari pot fi:

1. Oprimizari cu statistici
2. Optimizari pentru timpul de raspuns
3. Optimizari pentru parcurgerea datelor. Acestea returneaza toate rezultatele in cel mai
scurt timp
4. Interogari paralele

1. Optimizarea cu statistici foloseste statistici colectate din tabele si indecsi intr -o
interogare pentru a intocmi un plan de executie care poate procesa interogarea in cel mai eficient
mod posibil. Ca regula generala, Oracle reco manda sa se colecteze statistici pe tabela de baza
daca suntem interesati sa imbunatatim performantele interogarii.
Optimizatorul incearca sa aleaga cel mai bun plan de executie bazat pe urmatorii
parametrii:
 Selectivitatea predicatului CONTAINS
 Selectivitatea altor predicate in interogare
 Costurile de procesor si I/O pentru a rezolva cerinta predicatului CONTAINS

In mod normal, Oracle Text foloseste optimizatorul bazat pe costuri pentru a determina
cel mai bun plan de executie. Pentru a permite optimizatorului sa faca o estimare mai buna a
costurilor, se pot calcula, separat, statisticile pe tabela pe care se vor face interogarile. Pentru
aceasta se foloseste urmatoarea sintaxa:
ANALYZE TABLE < nume_tabela > COMPUTE STATISTICS;
De asemenea, se pot estima statistici pe o tabela referitor la un anumit numar de linii din ea
ANALYZE TABLE < nume_tabela > ESTIMATE STATISTICS 1000 ROWS;
sau procentual
ANALYZE TABLE < nume_tabela > ESTIMATE STATISTICS 50 PERCENT;
De asemenea se pot colecta statistici in paral el, folosind procedura
DBMS_STATS.GATHER_TABLE_STATS
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('owner', ' nume_tabela ', estimate_percent => 50,
block_sample => TRUE, degree => 4) ;
END;

Exemplele de cod de mai sus colecteaza statistici pentru toate obiectele asociate cu tabela
”nume_tabela” inclusiv coloanele tabelei si orice index(b -tree, bitmap) asociati cu tabela.
Pentru a recolecta statisticile din tabela, se foloseste comanda ANALYZE de oricate ori
este nevoie sau se foloseste pachetul DBMS_STATS
ANALYZE INDEX <nume_index> COMPUTE STATISTICS;
or
ANALYZE INDEX < nume_index> ESTIMATE STATISTICS SAMPLE 1000 ROWS;
or
ANALYZE INDEX < nume_index> ESTIMATE STATISTICS SAMPLE 50 PERCENT;

Pentru a sterge statistici de pe tabela se foloseste sintaxa
ANALYZE TABLE < nume_tabla> DELETE STATISTICS;
Pentru a sterge statistici de pe indecsi se foloseste sintaxa
ANALYZE INDEX < nume_index > DELETE STATISTICS;

2. Optimizari pentru timpul de raspuns

In cele mai multe cazuri, in special in aplicatiile WEB, interogarile trebuiesc optimizate
pentru timpul de raspuns, cand suntem interesati in obtinerea primelor cateva rezultate dintr -o
lista mai mare in cel mai scurt timp posibil.
Pentru a obtine aceste beneficii se folosesc:
 hintul FIRST_ROWS(n) in clauza ORDER BY
 partitionari ale indexului CONTEXT
 partitionari de index pentru clauza ORDER BY SCORE

Folosirea hintului FIRST_ROWS(n) in clauza ORDER BY este indicata cand dorim
optimizarea sa fie facuta doar pentru primele ”n” linii dintr -o interogare, in cel mai scur timp
posibil. Inrucat acest hint este constisitor, Oracle recomadata ca inainte de folosirea lui sa se
colecteze statistice pe tabela folosita.
DECLARE
CURSOR c IS
SELECT /* FIRST_ROWS(10) */ file_name, accessed_date
FROM my_doc
WHERE contains( content, 'vreme') > 0
ORDER BY id DESC;
TYPE t_name IS TABLE OF c%ROWTYPE;
v_name t_name := t_name();
BEGIN

FOR i IN c
LOOP
v_name.EXTEND(1);
v_name(v_name.last).file_name := i.file_name ;
v_name(v_name.last).accessed_date := i.accessed_date ;
EXIT WHEN c%ROWCOUNT > 10;
END LOOP ;
END;

In exemplul de mai sus, es te populata o colectie de tipul NESTED TABLE cu primele 10
valori ”file_name” si ”accessed_date” din tabela ”my_doc” pentru care fisierele din campul
”content” contin cuvantul ”vreme”. Intrucat ne intereseaza doar primele 10 valori, s -a folosit
hintul FIRST_ROWS(10) pentru a optimiza cautarea pe primele 10 valori ale cur sorului ”c”.
Partitionarea datelor si crearea indexului partitionat CONTEXT pot imbunatati
performantele interogarilor. Pe o tabela partitionata, fiecarepartitie are setul propriu de indecsi.
Practic, sunt mai multi indecsi dar rezultatele sunt combinate a sa cum este necesar pentru a
produce un set de date final. Se poate crea un index CONTEXt folosind clauza LOCAL.
CREATE INDEX nume_index ON nume_tabela (nume_coloana )
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('…')
LOCAL

Folosirea hintului FIRST_ROWS in index local partitionat poate da performante scazute,
in special cand ordonarea se face dupa SCORE. Aceasta se intampla pentru ca toate rezultatele
interogarii in toate partitiile trebuiesc obtinute inainte ca rezultatul fi nal sa fie sortat.
Aceasta situatie poate fi rezolvata priin folosirea unui view inline atunci cand se foloseste
hintul FIRST_ROWS.
Spre exemplu, daca avem urmatoarea interogare si un text index local create pe tabela
my_doc:
SELECT ID, SCORE(1) FROM my_doc
WHERE contains( content, 'situatie ', 1) > 0
order by SCORE(1) DESC;
si suntem interesati doar de primele 10 randuri, putem rescrie astfel:
SELECT * FROM
(SELECT /*+ FIRST_ROWS */ id, SCORE(1) FROM my_doc
WHERE contains( content, 'situatie ', 1) > 0 ORDER BY SCORE(1) DESC)
WHERE ROWNUM < 21;

3. In mod prestabilit, interogarile sunt optimizate pentru parcurgerea datelor. Aceasta
optimizare returneaza toate datele in cel mai scurt timp posibil in modurile CHOOSE si
ALL_ROWS.
In modul FIRST_ROWS, optimizatorul din Oracle Database lucreaza pentru cel mai
rapid raspuns tinand cont de index. Acesta este comportamentul prestabilit cnad se foloseste
hintul FIRST_ROWS.
Daca dorim sa optimizam pentur parcurgerea tuturor datelor dar fo losind modul
FIRST_ROWS, atunci se poate folosi hintul DOMAIN_INDEX_NO_SORT.
SELECT /*+ FIRST_ROWS DOMAIN_INDEX_NO_SORT */ id, SCORE(1), file_name
FROM my_doc
where contains( content, 'test', 1) > 0 ORDER BY SCORE (1) DESC;

4. Interogariel paralele se refera la procesarea in paralel a unui index CONTEXT local.
Bazat pe un grad de paralelism al indexului si pe diferite atribute de sistem, Oracle determina
numarul de interogari paralele care pot fi create pentru a procesa un index . Fiecare proces de
interogare in paralel lucreaza pe una sau mai multe partitii ale indexului. Acesta este modul
prestabilit pentru interogarile paralele pentur indecsii locali.
Pentru un sistem foarte incarcat, cu numar mare de utilizatori, interogarile, in general, vor
ingreuna procesorul.
Daca intampinam astfel de probleme, putem dezactiva procesarile paralele
ALTER INDEX <text index name> NOPARALLEL;
ALTER INDEX <text index name> PARALLEL 1;

9. Alte soluții tehnologice pentru bazele de date full-text

a. Full Text Database in MySQL

MySQL suporta cautare in text (cautari normale) utilizand operatorul LIKE si expresii
regulate12. Cand numarul de linii din tabela creste si de asemenea valoarea datelor dintr -o
coloanal creste si el, apar limitari la nivel de performanata:
 MySQL trebuie sa scaneze intreaga tabela pentru a gasi exact textul cautat, bazat pe
sablonul din operatorul LIKE sau din expresia regulate.
 Folosing operatorul LIKE sau expresiile regulate, devine dificil sa avem o cautare
flexibil a
 Nu putem folosi functia RANK pentru a care rand este relevant decat intr -o cautare.

Datorita acestor limitari, MySQL a introdus cautarea Full Text. Tehnic, MySQL creaza
un index din cuvintele coloanelor supuse cautarilor full text iar cautarile se efect ueaza pe acel
index.

Inainte de a efectua o cautare full text intr -o tabela, trebuie sa i se indexeze datele . Spre
deosebire de Oracle, unde exista mai multe tipuri de indecsi tull text, in MySQl exists unul
singur, numic FULLTEXT care se reindexeaza auto mat in momentul in care datele din tabela
sunt modificate.

In MySQL indecsii full text se pot adauga pe o tabela

in momentul crearii ei
CREATE TABLE nume_tabela
( coloana1 tip_data
, coloana2 tip_data
, coloana3 tip_data

PRIMARY_KEY( key_column),
FULLTEXT(coloana1, coloana2 …)
);

dupa ce tabela a fost deja create
ALTER TABLE nume_tabela
ADD FULLTEXT(coloana1, coloana2, …) ;

12 Expresiile regulate (pe scurt regex sau regexp) mai este numita si expresie relationala. In informatica si in teoria
limbajelor formale defineste un sabloan de cautare care mai departe este utilizat in algoritmi de cautare sau
cautarei si in locuire de siruri de caractere

creand indexul pentru o anumnita tabela
CREATE FULLTEXT INDEX nume_index
ON nume_tabela(coloana1, coloana2, …);

Pentru stergerea unui index folosim comanda
ALTER TABLE nume_tabela
DROP INDEX nume_index;

Pentru cautari, se folosesc functiile MATCH() si AGAINST(). Spre exemplu, daca
dorim sa gasim produsele unui magazine care in tag contin cuvantul “processor”, vom scrie o
interogare astfel:

SELECT product_id, description, tag
FROM products
WHERE MATCH(tag) AGAINST(‘processor’) ;

iar rezultatul va fi:
BX80677I57400 Procesor Intel Core™ i5 -7400, 3.00Ghz, Kaby Lake,
6MB, Socket 1151, BOX Processor intel
FD8350FRHKBOX Procesor AMD FX X8 8350, 4000MHz, 16MB,
socket AM3+, Box Processor AMD
BX80677I77700K Procesor Intel Core™ i7 -7700K, 4.20Ghz, Kaby
Lake, 8MB, Socket 1151, BOX Processor intel
BX80662I56400 Procesor Intel® Core™ i5 -6400, 2.7GHz, Skylake,
6MB, Socket 1151, Box Processor intel
BX80662G4400 Procesor Intel® Pentium™ G4400, 3.30GHz,
Skylake, 3MB, Socket 1151, Box Processor intel
FD6100WMGUBOX Procesor AMD FX X6 6100, 3300MHz, 14MB,
socket AM3+, Box Processor AMD
FD6300WMHKBOX Procesor AMD FX X6 6300, 3500MHz, 14MB,
socket AM3+ Processor AMD
YD170XBCAEWOF Procesor AMD RYZEN 7 1700X, 3400MHz, 20MB,
socket AM4, Box Processor AMD

b. Full Text Database in SQL Server

Full text database in SQL server permite utilizatorilor si aplicatiior sa exec ute interogari
bazate pe seturi de caractere in tabelele SQL Server.
La fel ca si in Oracle sau MySQL, indecsii full text sunt bazati pe una sau mai multe
coloane de tip caracter. Tipurile de date care pot fi indexate full text in SQL Server pot fi:
 CHAR
 VARCHAR
 NCHAR
 NVARCHAR
 TEXT
 NTEXT
 IMAGE
 XML
 VARBINARY(MAX)
 FILESTREAM
Spre deosebire de MySQL si Oracle, in SQL Server, pentru a crea un index full text, el
trebuie sa fac parte dintr -un catalog de indecsi. Relatia dintre calog si indecsi este de 1 la N. Cu
alte cuvinte, un calalog poate contine mai multi indecsi dar un index poate face parte dintr -un
singur catalog .
Astfel, ordinea operatiilor este:
1. Se creaza tabela
2. Se creaza catalogul
3. Se creaza indexul

Folosindu -ne de exemplul din sub -capitolul preceden t, vom crea tabela
CREATE TABLE nume_tabela
( coloana1 tip_data
, coloana2 tip_data
, coloana3 tip_data

CONSTRAINT nume_constrangere PRIMARY_KEY(key_column));

Cataloagele sunt mecanisme de organizare a indecsilor full text. In functie de versiunea
bazei de date, cataloagele sunt implementate diferit. Singura clauza obligatorie in sintaxa de
creare a unui catalog este numele catalogului .
CREATE FULLTEXT CATALOG nume_catalog;

Dupa ce a fost creat un catalog, existenta acestuia se poate verifica interogand view -ul
sys.fulltext_catalogs
SELECT fulltext_catalog_id, name FROM sys.fulltext_catalogs;

Dupa ce am creat un catalog, suntem gata sa cream un index full text iar apoi sa il
asocie m cu catalogul. Daca nu este specificat catalogul, indexul este asociat cu catalogul
prestabilit al bazei de date, daca acesta a fost configurat ca si catalog predefinit.
Un index full text este definit la nivelul tabelei si doar unul poate sa fie definit per tabela.
Pentru ca o tabela sa suporte un index full text, aceasta trebuie sa aiba configurat un index unic.
In plus, indexul trebuie sa fie definit pe o singura coloana si trebuie sa fie non -nullable.
Pentru a crea un index full text
CREATE FULLTEXT I NDEX ON nume_tabela
( col1, col2)
KEY INDEX nume_constrangere
ON nume_catalog ;

Indexul a fost creat pe coloanele ”col1” si ”col2” cu constrangerea unica din caluza KEY
INDEX. Clauza ON specifica catalogul din care face parte indexul ;
In SQL Server intalnim notiunea de ”Noice Words”. Acestea sunt cuvinte care nu se
indexeaza. In propozitia ”an apple and an orange”, cuvintele ”an” si ”and” sunt considerate
”noice words” si nu sunt incluse in index. Doar cuvintele ””apple” si ”orange” sun t tokanizate si
introduse in index.
In SQL Server 2005, ”noice word” -urile se regasesc in calea
$SQL_Server_Install_Path \Microsoft SQL Server \MSSQL.1 \MSSQL \FTData. In acest director
se gases fisiere asociate fiecarei limbi si contin cuvinte care se exclud din indexare si tokanizare.
Aceste fisiere se pot modifica dupa necesitati, dar este recomandat ca inainte de orice modificare
sa se faca o copie de siguranta a versiunii precedente.
In SQL Server 2008,”noice words” -rile sunt inlocuite de ”stop words”. Ace stea sunt
salvale in ”stoplists” care sutn salvate pe serverul SQL. Se pot crea ”stoplist”uri folosind sintaxa:
CREATE FULLTEXT STOPLIST nume_stoplist
FROM SYSTEM STOPLIST;

Exemplul de mai sus creaza o copie a stoplistei sistem sub numele nume_stoplist. Apoi,
aceasta se poate modifica dupa necesitati:
ALTER FULLTEXT STOPLIST nume_stoplist
ADD ‘nimic’;

ALTER FULLTEXT STOPLIST nume_stoplist
DROP ‘nimic’;

Atat SQL Server 2005, 2008 cat si versiunile urmatoare pun la dispozitie un set de fisiere
XML in care gasim sinonime ale unor cuvinte pentur a permite interogari full text. Spre
exemplu, putem defini un set de sinonime pntru ”cantec”, ”melodie”, ”arie”, ”balada”. In acest
mod cand se executa o interogare pe oricare dintre aceste termene, rezultatele includ oricare
dintre cuvintele definite in set.
SQL Server include un tezaur de sinonime pentru fiecare limba suportata in cautariel full –
text. Fisierele sunt denumite inconformitate cu limba suportata, spre exemplu, pentru tezaurul in
limba engleza, fisierul se numeste ”tsend.xml” si se gaseste in calea … MSSQL \FTDATA \
Fiecare fisier vine preconfigurat cu urmatorul cod XML (i.e tseng.xml)
<!– Commented out (SQL Server 2008)

<thesaurus xmlns="x -schema:tsSchema.xml">
<diacritics_sensitive>0</diacritics_sensitive>
<expansion>
<sub>Internet Explorer</sub>
<sub>IE</sub>
<sub>IE5</sub>
</expansion>
<replacement>
<pat>NT5</pat>
<pat>W2K</pat>
<sub>Windows 2000</sub>
</replacement>
<expansion>
<sub>run</sub>
<sub>jog</sub>
</expansion>
</thesaurus>
–>
</XML>

Dupa cum se poate vedea, marea parte a fisierului este comentata dar aceasta se poate
modifica dupa necesitati intr -un editor de fisiere text.
Dupa ce se modifica fisierul de sinonime, trebuie executata procedura
sys.sp_fulltext_load_thesaurus_file.
EXEC sys.sp_fulltext_load_thesaurus_file 1033;

In SQL Server, interogarile se fac cu un set mic de functii:

 CONTAINSTABLE
 FREETEXTABLE
and predicates:
 CONTAINS
 FREETEXT
Exemplu de interogari:

1. Afisarea product_id -urilor, descrierilor si tag -urilor produselor in ca caror descriere se
regaseste cuvantul ”procesor” si al caror pret este mai mic de 89.99.
SELECT product_id, description, tag
FROM products
WHERE CONTAINS(description, ‘processor’)
AND price <= 89.99 ;

2. Afisarea numelor documentelor in al caror continut se regasesc cuvintele ”fructe”,
”sanatate”, ”vitamine”.
SELECT titlu
FROM documente
WHERE FREETEXT (documente , ‘fructe sanatate vitamine ’);

3. Afisarea description_id, description ale tuturor produselor a caror descriere contine
cuvantul ”aluminum” fie langa cuvantul ”light”, fie langa cuvantul ”lightweight. De asemenea
vor trebui returnate liniile cu rank -ul > 2.
SELECT titlu
FROM documente
WHERE FREETEXT(documente, ‘fructe sanatate vitamine’)

SELECT a.description_id
, a.description
, b.rank
FROM product_description a
INNER JOIN CONTAINSTABLE
(product_description, description, ‘light NEAR aluminum’ OR ‘lightweight
NEAR aluminum’) b
ON a.description_id = b.[KEY]
WHERE b.RANK > 2
ORDER BY b.RANK DESC ;

10. Ciclul de proiectare a aplicatiei

Cream o tabela in care vom incarca datele despre fisierele text; spunem “datele despre
fisierele text intrucat fisiere propriuzise sunt stocate pe disc, in tabela vom tine doar o fererinta
catre ele. Apoi indexam tabela cu un index de tip CONTEXT din schema CTXSYS.
CREATE TABLE MY_DOC
(ID NUMBER PRIMARY KEY,
FILE_NAME VARCHAR2(255),
UPLOAD_DATE DATE,
FILESIZE VARCHAR2(20),
FILETYPE VARCHAR2(5),
CONTENT BFILE,
CREATION_DATE DATE DEFAULT SY SDATE NOT NULL ENABLE,
MODIFICATION_DATE DATE,
ACCESSED_DATE DATE);

CREATE INDEX MY_DOC_IDX ON MY_DOC (CONTENT) INDEXTYPE IS CTXSYS.CONTEXT;

Cream o tabela pentru tokeni.
CREATE TABLE MY_TOKENS
(QUERY_ID NUMBER,
TOKEN VARCHAR2( 64),
OFFSET NUMBER,
LENGTH NUMBER);

De asemenea, am creat pachet PLSQL PKG_FULL_TEXT, care contine 2 proceduri:
 PRC_PUT_FILE – insereaza datele despre fisiere
 PRC_COUNT_TOKENS – insereaza date in tabela MY_TOKENS si reactualizeaza
indexul.
create or replace PACKAGE BODY PKG_FULL_TEXT AS

PROCEDURE PRC_PUT_FILE
( p_file_name IN my_doc.file_name%TYPE
, p_upload_date IN my_doc.upload_date%TYPE
, p_filesize IN my_doc.filesize%TYPE
, p_filetype IN my_doc.filetype%TYPE
, p_creation_date IN my_doc.creation_date%TYPE
, p_modification_date IN my_doc.modification_date%TYPE
, p_accessed_date IN my_doc.accessed_date%TYPE
, p_confirm OUT pls_integer) AS

dummy pls_integer;

BEGIN

/* inserts new files into MY_DOC table */

select count(*)
into dummy
from my_doc
where file_name = p_file_name;

if dummy = 0
then
INSERT INTO my_doc
( id
, file_name
, upload_date
, filesize
, filetype
, content
, creation_date
, modification_date
, accessed_date)
VALUES
( my_doc_seq.NEXTVAL
, p_file_name
, p_upload_date
, p_filesize
, p_filetype
, BFILENAME('DOCUMENTS', p_file_name)
, p_creation_date
, p_modification_date
, p_accessed_date);

ctx_ddl.sync_inde x('my_doc_idx');
prc_count_tokens(my_doc_seq.CURRVAL);

p_confirm := 1;
else
p_confirm := 0;
end if;

COMMIT;
END PRC_PUT_FILE;

PROCEDURE PRC_COUNT_TOKENS
( p_query_id IN my_tokens.query_id%TYPE) AS

my_tokens ctxsys.ctx_doc.token_tab;

BEGIN
/* for the new inserted files, insert tokens into the MY_TOKENS table
using procedures from CTX_DOC package of CTXSYS schema */

ctx_doc.set_key_type('PRIMARY_KEY');
ctx_doc.tokens('my_doc_idx', p_quer y_id, 'my_tokens', p_query_id);
END PRC_COUNT_TOKENS;
END PKG_FULL_TEXT;

In cadrul aplicatiei, userul are posibilitatea de a incarca fisiere in baza de date si a le
indexa; totodata, se creaza inregistrari si intr -o tabela de tokeni.

1. In prima faza, fisierele sunt salvate , pe disc, intr-o locatie stabilita
2. Prin apasarea butonului “Import files” (1), datele de pe disc se importa in baza de
date. Daca unele fisiere deja exista in baza de date, acestea nu vor mai fi incarcate inca o data.
3. Odata incarcate fisierele, putem incepe cautarea in ele. Pentru aceasta, in TextBox -ul
3, vom introduce cuvantul pe care dorim sa il cautam si apasam butonul “ Send Request” (4) .
4. Rezultatele vor fi afisate in GridView -ul 5.
2 1
3
4 5

5. Prin apasarea pe numele fisierului, continutul va fi afisat in RichTexBox -ul 7.
6. Daca CheckBox -ul “Marcheaza cuvantul” (6) este marcat, in RichTextBoxt,
continutul fisierului afisat va contine cuvantul cautat, marcat cu backgroung balben.
7. Din aplicatie se iese cu butonul “Quit” (8).

1
3
4 5
6
8 7

Bibliogra fie
[1] Wikipedia – Category:Types of databases. December 03, 2016.
https://en.wikipedia.org/wiki/Category:Types_of_databases.
[2] Oracle – Text Application Developer's Guide. n.d.
https://docs.oracle.com/cd/B28359_01/text.111/b28303/toc.htm.
[3] Oracle – Oracle Text CONTAINS Query Operators. n.d.
https://docs.oracle.com/cd/B19306_01/text.102/b14218/cqoper.htm#BABJFFAD.
[4] MySQLTutorial – MySQL Full -Text Search. n.d. http://www.mysqltutorial.org/mysql -full-text-
search.aspx.
[5] SimpleTalk – Undestanding Full -Text Indexing in SQL Server. n.d. https://www.simple –
talk.com/sql/learn -sql-server/understanding -full-text-indexing -in-sql-server/.
[6] Microsoft – Query with Full -Text Search. n.d. https://msdn.microsoft.com/en –
us/library/ms142583.aspx.

Anexa figurilor
Figura 1 – Schema aplicatiei de tipul “Document Collection Application” ………………………….. ……………… 7
Figura 2 – Schema ordinii operatilor aplicatiei de tipul “Document Collection Application” …………………. 8
Figur a 3 – Schema aplicatiei de tipul “Catalog Information Application” ………………………….. ……………….. 9
Figura 4 – Schema ordinii operatiilor aplicatiei de tipul “Catalog Information Application” …………………. 9
Figura 5 – Schema aplicatiei de tipul “Document Clasification Application” ………………………….. ………… 10
Figura 6 – Schema functionarii SQL*Loader -ului ………………………….. ………………………….. …………………. 14
Figura 7 – Prezentarea unei aplicatii de clasificare a documentelor ………………………….. ………………………. 23

Similar Posts