Dezvoltarea si implementarea Bazelor de Date Full Text in SGBD Oracle Profesor coord onator Absolvent Conf. Dr. Cristian Kevorchian Ionut Preda… [610005]
LUCRARE DE LICENTA
Dezvoltarea si implementarea Bazelor de Date
Full Text in SGBD Oracle
Profesor coord onator Absolvent: [anonimizat] 201 7
Cuprins
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ………. 3
Configurarea Bazei de Date pentru a lucra în regim full text. ………………………….. ………………………. 6
Crearea structurii Bazei de Date si Indexarea acesteia ………………………….. ………………………….. ….. 10
Inserarea datelor in tabela ………………………….. ………………………….. ………………………….. …………….. 12
Interogarea Bazei de Date ………………………….. ………………………….. ………………………….. …………….. 16
Prezentarea documentelor in Oracle Text ………………………….. ………………………….. ……………………. 19
Tuning Oracle Text ………………………….. ………………………….. ………………………….. ……………………… 21
Alte soluț ii tehnologice pentru bazele de date full -text………………………….. ………………………….. ….. 25
Full Text Database in MySQL ………………………….. ………………………….. ………………………….. .. 25
Full Text Database in SQL Server ………………………….. ………………………….. ………………………. 27
Aplicatia ………………………….. ………………………….. ………………………….. ………………………….. ………… 31
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ……. 32
Anexa figurilor ………………………….. ………………………….. ………………………….. ………………………….. .. 32
Introducere
Contextul general al Bazele de Date își găsesc are aplicabilitate a la orice nivel de decizie
al unei afaceri (fie la nivel de aplicatie, fie la nivel ul surselor de date constituite ), indiferent de
industria căreia îi aparține .
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 programelor dar si o experienta cat mai placuta utilizatorilor pri ntr-un acces cat mai rapid
la date . Reformuleaza fraza! Nu are sens!
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 bazelor de date relationale modern e inclu d 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 noi animatii.
• Back -end database tin da te 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 c are 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 acc esate 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 informatii 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 mediu de stocare nu este
atasat la un s ingur 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 tipuri de baze de date, informatiil e 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 exc lusiv 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 folosesc 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 b aze 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 informati i 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 inventor.
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 diferiti useri, etichet eaza 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
Configurarea Bazei de Date pentru a lucra în regim full text .
Inainte de a crearea 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, Indexi si
Proceduri.
3 Rolul CONNECT permite userilor sa creeze sesiuni de conexiune la baza de date.
4 Permite userilor sa clasifice documentele
5 Permite cr earea de preferinte, grupuri de sectiuni si “stoplists” pentru indexii de tip Text.
6 Sunt folosite pentru serviciile documentelorprecum sublinierea rezultatului cautarilor sau generare unei liste de
teme pentru document.
7 Permite folosirea logurilor pent ru 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. Fie 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 inde cș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 wild -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, indexii 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 rezultatele.
5. Pe urma, userul ori face o alta cautare, ori face o actiun e (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, acestea urmeaza trasee prestabilite.
• XML Search Applications . Pentru a eficienti za viteza de executie a interogarilor
existNode() pe coloanele de tip XMLType, se foloseste indexul CTXXPATH.
Crearea structurii Bazei de Date si Indexarea acesteia
Intrucat aplicatia folosita spre exemplificare este de tipul “Document Collection
Appl ication”, 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 default 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) INDEX TYPE IS CTXSYS.CONTEXT;
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_date 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 lansand u-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:
• Incarcarea datelor in retea. Utilitarul se poate lansa de pe un PC si i se poate spun e 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, bazandu -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 genera rapoarte de eroare amanuntite pentur debugging
• Se pot folosi fisiere sec undare 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 valoar e 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_Anton_Roman.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
colosul_picioare_lut.pdf;10;.pdf;0 1-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 Digitala.pdf;10;.pdf;01 -JAN-2001;01-JAN-2001;01-JAN-2001;
Stephenie Meyer – 1. Amurg (Twilig ht).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 no ptii.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
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 de 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 operatori pent ru a defini criteriile de cautare. Criteriile de cautare pot fi
• logice (expresii care descriu un criteriu strict de potriv ire)
• 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 rezultat.
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.TRA IN. 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 cuvantul ”Parlamentul”), 5 (pentru
ca contine cuvintele ”promulgat o lege”), 7 (pentru ca contine cuvantul ”pensionarilor”) si 8
(pentru ca contine cuvantul ”bugetarilor”).
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 valorile 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: cutremur , 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 vrei 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 c uvantului
cautat este returnat impreuna cu textul inconjurator. 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 coasta
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 cutremur din istoria modernă
(de când sunt înregistr ate 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 Lankă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 localiz ate incendii care au devastat zone largi de paduri dar si cartiere
intregi de locuinte.
Autoritatile au decretat stare de urgenta.
Tuning Oracle Text
La fel ca si in celelalte tipuri de baze de date, si in Oracle T ext se pot face oprimizari pent ru
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 recomanda sa se colec teze 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 predic ate 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 ta bela 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 paralel, 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 cursorului ”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 com binate asa 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 final 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 Or acle 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 folosind 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 mult e 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 proble me, putem dezactiva procesarile paralele
ALTER INDEX <text index name> NOPARALLEL;
ALTER INDEX <text index name> PARALLEL 1;
Alte soluții tehnologice pentru bazele de date full -text
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 pent ru 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
flexibila
• 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 efectueaza 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 automat 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, …) ;
creand indexul pentru o anumnita tabela
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 al goritmi de cautare sau
cautarei si inlocuire de siruri de caractere
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 In tel® 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
Full Text Database in SQL Server
Full text database in SQL server permite utilizatorilor si aplicatiior sa execute interogari
bazate pe seturi de caractere in tab elele 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 precedent, 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, catalo agele 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 asociem
cu catalogul. Daca nu este specificat catalogul, indexul este asociat cu catalog ul 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 a iba 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 INDEX 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 pro pozitia ”an apple and an orange”, cuvintele ”an” si ”and” sunt considerate ”noice
words” si nu sunt incluse in index. Doar cuvintele ””apple” si ”orange” sunt 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”. Acestea sunt salvale
in ”stoplists” care sutn salvate pe serverul SQL. Se pot crea ”stoplist”uri folos ind 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 u n 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 aluminu m’) b
ON a.description_id = b.[KEY]
WHERE b.RANK > 2
ORDER BY b.RANK DESC ;
Aplicatia
Bibliogra fie
2016. [1] Wikipedia – Category:Types of databases. December 03.
https://en.wikipedia.org/wiki/Category:Types_of_databases.
n.d. [2] Oracle – Text Application Developer's Guide.
https://docs.oracle.com/cd/B28359_01/text.111/b28303/toc.htm.
n.d. [3] Oracle – Oracle Text CONTAINS Query Operators.
https://docs.oracle.com/cd/B19306_01/text.102/b14218/cqoper.htm#BABJFFAD.
n.d. [4] MySQLTutorial – MySQL Full -Text Search. http://www.mysqltutorial.org/mysql -full-text-
search.aspx.
n.d. [5] SimpleTalk – Undestanding Full -Text Indexing in SQL Server. https ://www.simple –
talk.com/sql/learn -sql-server/understanding -full-text-indexing -in-sql-server/.
n.d. [6] Microsoft – Query with Full -Text Search. 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
Figura 3 – Schema aplicatiei de tipul “Catalog Information Application” ………………………….. ….. 8
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 ………………………….. ………………………….. …….. 13
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Dezvoltarea si implementarea Bazelor de Date Full Text in SGBD Oracle Profesor coord onator Absolvent Conf. Dr. Cristian Kevorchian Ionut Preda… [610005] (ID: 610005)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
