ORACLE TEXT -3 CONTEX INDEX (WORD, PDF, HTML VS.)

pdf, word, html, sql gibi dosyaları CONTEX index olarak tutarak içerisinde hızlı arama yapmamızı sağlayan yapılardır. Yapacağımız örnekte belgelerimizi bir procedure aracılığı ile BLOB bir alanda tutup daha sonra bu tablodaki bu alanı CONTEX İndex ile indexleyeceğiz ve içerisinde arama yapacağız.

Öncelikle verilerimizi tutabileceğimiz bir tablo oluşturalım.

create table my_docs
(
id number,
name varchar2(200),
doc BLOB
)

alter table my_docs add constraint my_docs_pk PRIMARY KEY (id)
create sequence my_doc_id_sq;

Dökümanlarımızın bulunduğu yer için bir directory oluşturuyoruz.

create or replace directory documents as '/documents';

Dökümanlarımızı tablomuza insert eden bir procedure hazırlıyoruz

create or replace procedure load_file_my_docs(p_file_name IN my_docs.name%type) as
    lv_bfile    BFILE;
    lv_blob     BLOB;
 BEGIN
    INSERT INTO my_docs (id, name, doc)
    values(my_doc_id_sq.NEXTVAL,p_file_name,empty_blob())
    RETURN doc INTO lv_blob;
    
    lv_bfile:=BFILENAME('DOCUMENTS',p_file_name);
    DBMS_LOB.FILEOPEN(lv_bfile,DBMS_LOB.FILE_READONLY);
    DBMS_LOB.LOADFROMFILE(lv_blob,lv_bfile,DBMS_LOB.GETLENGTH(lv_bfile));
    DBMS_LOB.FILECLOSE(lv_bfile);
    
    COMMIT;
 END;

Dosyalarımızı procedure çağırarak insert edelim

exec load_file_my_docs('test.docx');
exec load_file_my_docs('test.pdf');
load_file_my_docs('test.html')


 EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_DOCS', cascade=>TRUE);

Bu dosyalarımız indexleyelim,

 create index my_docs_idx on my_docs(DOC) INDEXTYPE is CTXSYS.CONTEXT;

Artık bu dosyalarımız içerisinde arama yapabiliriz.

select SCORE(1) score,id,name  from my_docs 
where contains(doc,'aranacak kelime',1)>0 
order by score(1) desc;