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;
Bir yanıt yazın