Burada bir kelimeden daha dar anlamlı kelimeleri nasıl bulacağımız görülüyor. Bu fonksiyonda eğer sözlük belirtirseniz derinlik bilgisi de vermeniz gerekiyor. Fonksiyonun çıktısı contains sorgulamasında kullanılmaya müsait.
set serveroutput on
declare
note varchar2(200);
begin
note := ctx_thes.nt('ship',3,'nstc');
dbms_output.put_line('Narrower Terms of SHIP');
dbms_output.put_line(note);
end;
NSTC sözlüğümüze göre çıktımız:
{SHIP}{GREASE PAINT}{UNDERWATER ANTIFOULING COATING}{BALLASTTANK}{BILGES}{COMPENSATING FUEL TANK}{SHIP BUILDINGSTANDARDS}{SUPERSTRUCTURE}{WELL DECK OVERHEAD}
Pek iyi bir sözlük hazırlamadıkları aşikâr.
Pazartesi, Şubat 28, 2005
Sözlükteki not
Bir kelimenin sözlükteki açıklamasını elde etmek için:
set serveroutput on
declare
note varchar2(200);
begin
note := ctx_thes.sn('ship','nstc');
dbms_output.put_line('SHIP');
dbms_output.put_line(' SN ' note);
end;
Sözlüğümüzde ne yazıyormuş bakalım.
SHIP
SN A waterborne vehicle large in size for deep-water navigation designed fortransporting passengers or freight.
Burada note değişkeninin boyutunda dikkatli olunması gerekiyor. Yeterince büyük seçilmezse şu hatayı veriyor:
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
set serveroutput on
declare
note varchar2(200);
begin
note := ctx_thes.sn('ship','nstc');
dbms_output.put_line('SHIP');
dbms_output.put_line(' SN ' note);
end;
Sözlüğümüzde ne yazıyormuş bakalım.
SHIP
SN A waterborne vehicle large in size for deep-water navigation designed fortransporting passengers or freight.
Burada note değişkeninin boyutunda dikkatli olunması gerekiyor. Yeterince büyük seçilmezse şu hatayı veriyor:
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
Fuzzy arama
Fuzzy arama yapmak isterseniz:
select score(1) as score, id,name from doc_table where contains(text,'fuzzy(material,60,10,weight)' ,1)>0;
select score(1) as score, id,name from doc_table where contains(text,'fuzzy(material,60,10,weight)' ,1)>0;
browse_words
Bir kelimenin indekslendiği yerin civarındaki kelimeleri bulmak için:
set serveroutput on;
declare
resarr ctx_query.browse_tab;
begin
ctx_query.browse_words('temp_text_idx','material',resarr,5, CTX_QUERY.BROWSE_AROUND);
for i in 1..resarr.count loop
dbms_output.put_line(resarr(i).word ':' resarr(i).doc_count);
end loop;
end;
Aynı sonuçları tabloya almak için önceden bir tablo yaratmanız gerekiyor.
create table restab (browse_id number, word varchar2(64), doc_count number);
begin
ctx_query.browse_words('myindex','material','restab',numwords=>6, direction=>'AROUND');
end;
select word, doc_count from restab order by word;
Elimizdeki sonuç:
MATE:1
MATERI:1
MATERIAL:26
MATERIALEASE:1
MATERIALS:38
MATERIEL:1
Yön olarak CTX_QUERY.BROWSE_BEFORE, CTX_QUERY.BROWSE_AROUND, ve CTX_QUERY.BROWSE_AFTER kullanılabilir.
set serveroutput on;
declare
resarr ctx_query.browse_tab;
begin
ctx_query.browse_words('temp_text_idx','material',resarr,5, CTX_QUERY.BROWSE_AROUND);
for i in 1..resarr.count loop
dbms_output.put_line(resarr(i).word ':' resarr(i).doc_count);
end loop;
end;
Aynı sonuçları tabloya almak için önceden bir tablo yaratmanız gerekiyor.
create table restab (browse_id number, word varchar2(64), doc_count number);
begin
ctx_query.browse_words('myindex','material','restab',numwords=>6, direction=>'AROUND');
end;
select word, doc_count from restab order by word;
Elimizdeki sonuç:
MATE:1
MATERI:1
MATERIAL:26
MATERIALEASE:1
MATERIALS:38
MATERIEL:1
Yön olarak CTX_QUERY.BROWSE_BEFORE, CTX_QUERY.BROWSE_AROUND, ve CTX_QUERY.BROWSE_AFTER kullanılabilir.
ctx_doc.theme
Bir dokümanın, sistem bilgi dağarcığına göre ana temalarının neler olduğunu görmek istiyorsanız:
create table the_themes (query_id number, theme varchar2(2000), weight number);
begin ctx_doc.set_key_type('ROWID');
ctx_doc.themes(index_name=> 'TEMP_TEXT_IDX',
textkey=>'AAAKp1AAJAABDRIAAO',
restab=>'the_themes');
end;
/
select theme,weight from the_themes order by weight desc;
drop table the_themes;
Bu da PL/SQL de hem bellekte yaratılan tabloyu kullanarak, hem de bütün bir tema ağacını göstermek için gerekli kod:
declare the_themes ctx_doc.theme_tab;
begin ctx_doc.set_key_type('ROWID');
ctx_doc.themes(index_name=> 'temp_text_idx',
textkey=>'AAAKp1AAJAABDRIAAO',
restab=>the_themes,
full_themes=>TRUE,
num_themes=>150);
for i in 1..the_themes.count loop
dbms_output.put_line(the_themes(i).theme':'the_themes(i).weight);
end loop;
end;
create table the_themes (query_id number, theme varchar2(2000), weight number);
begin ctx_doc.set_key_type('ROWID');
ctx_doc.themes(index_name=> 'TEMP_TEXT_IDX',
textkey=>'AAAKp1AAJAABDRIAAO',
restab=>'the_themes');
end;
/
select theme,weight from the_themes order by weight desc;
drop table the_themes;
Bu da PL/SQL de hem bellekte yaratılan tabloyu kullanarak, hem de bütün bir tema ağacını göstermek için gerekli kod:
declare the_themes ctx_doc.theme_tab;
begin ctx_doc.set_key_type('ROWID');
ctx_doc.themes(index_name=> 'temp_text_idx',
textkey=>'AAAKp1AAJAABDRIAAO',
restab=>the_themes,
full_themes=>TRUE,
num_themes=>150);
for i in 1..the_themes.count loop
dbms_output.put_line(the_themes(i).theme':'the_themes(i).weight);
end loop;
end;
ctx_doc.tokens
İndekslenen kelimeleri elde etmenin bir yolu:
show user
set serveroutput on size 1000000
--Yukarıdakı satır dbms tampon
--alan boyutunu arttırmak için
declare
spool theme
the_tokens ctx_doc.token_tab;
begin
--PRIMARY_KEY ya da ROWID tanımlanabilir.
ctx_doc.set_key_type('ROWID');
ctx_doc.tokens('temp_text_idx','1',the_tokens);
--Yukarıdakı 1 rakamı yerine rowid girmek gerekiyor
--Örneğin AAAKp1AAJAABDRIAAO
for i in 1..the_tokens.count loop
dbms_output.put_line(the_tokens(i).token);
end loop;
end;
/
spool off
Bu fonksiyon dokümanları sınıflandırma gibi çalışmalarda oldukça faydalı.
show user
set serveroutput on size 1000000
--Yukarıdakı satır dbms tampon
--alan boyutunu arttırmak için
declare
spool theme
the_tokens ctx_doc.token_tab;
begin
--PRIMARY_KEY ya da ROWID tanımlanabilir.
ctx_doc.set_key_type('ROWID');
ctx_doc.tokens('temp_text_idx','1',the_tokens);
--Yukarıdakı 1 rakamı yerine rowid girmek gerekiyor
--Örneğin AAAKp1AAJAABDRIAAO
for i in 1..the_tokens.count loop
dbms_output.put_line(the_tokens(i).token);
end loop;
end;
/
spool off
Bu fonksiyon dokümanları sınıflandırma gibi çalışmalarda oldukça faydalı.
Cuma, Şubat 25, 2005
Plustrace kurulumu
SQL komutlarının yürütülmesini izlemek için sistem yöneticisinin (dbadm rolündeki) ilk önce PLUSTRACE rolünü oluşturması gerekiyor.
sqlplus /nolog
connect / as sysdba
@$ORACLE_HOME\sqlplus\admin\plustrce.sql
İlk hatayı ihmal edebilirsin zira olmaya rolü düşürmeye çalıştığından dolayı veriliyor.
Daha sonra örneğin HR kullanıcısına bu rolü vermek için:
grant plustrace to HR;
HR kullanıcısının ilk olarak kendi hesabına girerek
@$ORACLE_HOME\RDBMS\ADMIN\utlxplan.sql
komutunu çalıştırması gerekiyor.
Bundan sonra hem sonucu hem de komutların yürütülmesini izlemek için örneğin
set autotrace on explain
select score(1),id, name from doc_table -
where contains(text,'{corrosion}',1)>0;
Benim örneğimde sonuç şu şekilde:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=0 Card=1 Bytes=227 4)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DOC_TABLE' (TABLE) (Cost =0 Card=1 Bytes=2274)
2 1 DOMAIN INDEX OF 'TEXT_IDX' (INDEX (DOMAIN)) (Cost=0)
sqlplus /nolog
connect / as sysdba
@$ORACLE_HOME\sqlplus\admin\plustrce.sql
İlk hatayı ihmal edebilirsin zira olmaya rolü düşürmeye çalıştığından dolayı veriliyor.
Daha sonra örneğin HR kullanıcısına bu rolü vermek için:
grant plustrace to HR;
HR kullanıcısının ilk olarak kendi hesabına girerek
@$ORACLE_HOME\RDBMS\ADMIN\utlxplan.sql
komutunu çalıştırması gerekiyor.
Bundan sonra hem sonucu hem de komutların yürütülmesini izlemek için örneğin
set autotrace on explain
select score(1),id, name from doc_table -
where contains(text,'{corrosion}',1)>0;
Benim örneğimde sonuç şu şekilde:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=0 Card=1 Bytes=227 4)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DOC_TABLE' (TABLE) (Cost =0 Card=1 Bytes=2274)
2 1 DOMAIN INDEX OF 'TEXT_IDX' (INDEX (DOMAIN)) (Cost=0)
Değişken kullanımı
Aşağıdaki komutları prompt adında bir dosyaya kaydet. SqlPlus'ta START prompt diyere çalıştır.
PROMPT The screen will be cleaned
PAUSE Press RETURN to continue
clear screen
PROMPT Example of a bind variable
VARIABLE ret_val NUMBER
exec :ret_val := 4;
PRINT ret_val
PROMPT The screen will be cleaned
PAUSE Press RETURN to continue
clear screen
PROMPT Example of a bind variable
VARIABLE ret_val NUMBER
exec :ret_val := 4;
PRINT ret_val
SqlPlus'ın güzellikleri
select name from doc_table where contains(text,'{&keyword}')>0;
save contains
get contains
start contains
keyword bir parametre olduğundan bir uyarı gelecek ve istediğiniz kelimeyi aratabileceksiniz. Komutu contains.sql adlı dosyaya kaydetmiş durumdasın. Tekrar düzenlemek için :
edit contains
Sistemde DEFINE keyword=seawater diyerek bir daha dene ve gör.
İşlem yaptırmak için:
select 200-100 from dual;
Dikkat et eğer - satır sonunda kalırsa SqlPlus onu komutun devam ettiği gösteren işaret olarak algılar.
save contains
get contains
start contains
keyword bir parametre olduğundan bir uyarı gelecek ve istediğiniz kelimeyi aratabileceksiniz. Komutu contains.sql adlı dosyaya kaydetmiş durumdasın. Tekrar düzenlemek için :
edit contains
Sistemde DEFINE keyword=seawater diyerek bir daha dene ve gör.
İşlem yaptırmak için:
select 200-100 from dual;
Dikkat et eğer - satır sonunda kalırsa SqlPlus onu komutun devam ettiği gösteren işaret olarak algılar.
Perşembe, Şubat 24, 2005
Text komut çözücü hatası
Aşağıdaki komutun sonucu maalesef hata veriyor.
SQL> select name from doc_table where contains(text,'tr') > 0;
select name from doc_table where contains(text,'tr') > 0*
ERROR at line 1:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50901: text query parser syntax error on line 1, column 3
Çözüm olarak şunu kullan:
SQL> select name from doc_table where contains(text,'{tr}') > 0;
SQL> select name from doc_table where contains(text,'tr') > 0;
select name from doc_table where contains(text,'tr') > 0*
ERROR at line 1:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50901: text query parser syntax error on line 1, column 3
Çözüm olarak şunu kullan:
SQL> select name from doc_table where contains(text,'{tr}') > 0;
İndeksi açıklat
SQL*Plus'ta ctx_report aracını kullanarak indeksi açıklatabilirsin. İndeksin tüm parametrelerini açıkca görebilirsin.
set long 64000
set pages 0
set heading off
set feedback off
spool outputfile
select ctx_report.describe_index('text_idx') from dual;
spool off
set long 64000
set pages 0
set heading off
set feedback off
spool outputfile
select ctx_report.describe_index('text_idx') from dual;
spool off
ctx_thes'a örnek
set serveroutput on
declare terms varchar2(2000);
begin
terms:=ctx_thes.bt('future',2,'default');
dbms_output.put_line('The broader' terms);
end;
/
declare terms varchar2(2000);
begin
terms:=ctx_thes.bt('future',2,'default');
dbms_output.put_line('The broader' terms);
end;
/
ctxhx'in yeri
RedHat üzerinde yüklenmiş Oracle9i'deki ctxhx bazı pdfleri ne yazıkki çeviremiyor. Bu nedenle yaptığımız filtrelemede her nekadar ilgili dökümanlar olsa da indekslenemediği için contains ile yapılan aramalarda listelenmiyor. WindowsXP üzerine Oracle10g'yi kurdum. Onunla oynuyorum biraz. ctxhx'in yeri $ORACLE_HOME/BIN in altında.
Salı, Şubat 15, 2005
Yeni bir dergi tabi benim için :)
Data-mining algorithms in Oracle9i and Microsoft SQL Server
Margo Hanna. Campus - Wide Information Systems. Bradford: 2004. Vol. 21, Iss. 3; p. 132
Margo Hanna. Campus - Wide Information Systems. Bradford: 2004. Vol. 21, Iss. 3; p. 132
Web verisinin analizi ve ahlakî sorunlar...
Ethical issues in web data mining
Lita van Wel, Lambèr Royakkers. Ethics and Information Technology. Dordrecht: 2004. Vol. 6, Iss. 2; p. 129
Lita van Wel, Lambèr Royakkers. Ethics and Information Technology. Dordrecht: 2004. Vol. 6, Iss. 2; p. 129
Yönetim ağırlıklı dergide bir bilgisayar konusu
Jacek Blazewicz, Erwin Pesch and Malgorzata Sterna, A novel representation of graph structures in web mining and data analysis, Omega, Volume 33, Issue 1, February 2005, Pages 65-71.(http://www.sciencedirect.com/science/article/B6VC4-4CG0P3G-1/2/a2bcab17def59295cbd3b85d7bd73b51)
Cuma, Şubat 11, 2005
Index yarat..
Yarattığın "stoplist"i kullanarak index oluştur.
CREATE INDEX BACKLINKURL_IDX ON LINK_TABLE(NAME)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('STOPLIST WEBSTOP');
ALTER INDEX BACKLINKURL_IDX REBUILD;
CREATE INDEX BACKLINKURL_IDX ON LINK_TABLE(NAME)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('STOPLIST WEBSTOP');
ALTER INDEX BACKLINKURL_IDX REBUILD;
Stoplist/Stopclass ekle
exec ctx_ddl.create_stoplist('webstop','BASIC_STOPLIST');
exec ctx_ddl.add_stopword('webstop','index');
exec ctx_ddl.add_stopword('webstop','http');
exec ctx_ddl.add_stopword('webstop','asp');
exec ctx_ddl.add_stopword('webstop','aspx');
exec ctx_ddl.add_stopword('webstop','cgi');
exec ctx_ddl.add_stopword('webstop','php');
exec ctx_ddl.add_stopword('webstop','shtml');
exec ctx_ddl.add_stopword('webstop','html');
exec ctx_ddl.add_stopword('webstop','htm');
exec ctx_ddl.add_stopword('webstop','dtl');
exec ctx_ddl.add_stopword('webstop','www');
exec ctx_ddl.add_stopword('webstop','w3c');
exec ctx_ddl.add_stopword('webstop','webmaster');
exec ctx_ddl.add_stopword('webstop','jsp');
exec ctx_ddl.add_stopword('webstop','id');
exec ctx_ddl.add_stopword('webstop','ind');
exec ctx_ddl.add_stopword('webstop','sid');
--exec ctx_ddl.add_stopword('webstop','au');
exec ctx_ddl.add_stopclass('webstop','NUMBERS');
exec ctx_ddl.add_stopword('webstop','index');
exec ctx_ddl.add_stopword('webstop','http');
exec ctx_ddl.add_stopword('webstop','asp');
exec ctx_ddl.add_stopword('webstop','aspx');
exec ctx_ddl.add_stopword('webstop','cgi');
exec ctx_ddl.add_stopword('webstop','php');
exec ctx_ddl.add_stopword('webstop','shtml');
exec ctx_ddl.add_stopword('webstop','html');
exec ctx_ddl.add_stopword('webstop','htm');
exec ctx_ddl.add_stopword('webstop','dtl');
exec ctx_ddl.add_stopword('webstop','www');
exec ctx_ddl.add_stopword('webstop','w3c');
exec ctx_ddl.add_stopword('webstop','webmaster');
exec ctx_ddl.add_stopword('webstop','jsp');
exec ctx_ddl.add_stopword('webstop','id');
exec ctx_ddl.add_stopword('webstop','ind');
exec ctx_ddl.add_stopword('webstop','sid');
--exec ctx_ddl.add_stopword('webstop','au');
exec ctx_ddl.add_stopclass('webstop','NUMBERS');
Kısıt ekle..
Gelen bağlantı tablosuna "id" ve "name" alanları için belirleyici alan "primary key" kısıtı koy. Bknz.
ALTER TABLE LINK_TABLE
ADD CONSTRAINT PK
PRIMARY KEY (ID, NAME)
ALTER TABLE LINK_TABLE
ADD CONSTRAINT PK
PRIMARY KEY (ID, NAME)
Link tablosunu yedekle.
Bağlantı tablosunu şu şekilde yedekleyebilirsin:
CREATE TABLE LINK AS
SELECT * FROM LINK_TABLE;
CREATE TABLE LINK AS
SELECT * FROM LINK_TABLE;
Kaydol:
Kayıtlar (Atom)