本文主要是學習oracle text 對伺服器本地檔案進行檢索的學習筆記,主要參考oracle全文檢索這個電子書和網上的一些例子。
首先將dba許可權賦予你的登入賬號
begin
ctx_ddl.create_preference ('my_datastore_prefs', 'file_datastore');
ctx_ddl.set_attribute ('my_datastore_prefs', 'path', 'd:\file');
end;
--將伺服器(windows)d盤資料夾file設定成oracle讀取檔案的根目錄
begin
ctx_ddl.create_preference('url_pref','url_datastore');
ctx_ddl.set_attribute('url_pref','timeout','300');
end;
--設定url儲存型別(順便記錄下)
begin
ctx_ddl.create_preference('cs_filter', 'charset_filter');
ctx_ddl.set_attribute('cs_filter', 'charset', 'utf8');
end;
--設定字符集為utf-8,oracle預設為utf-8,txt檔案要改儲存型別為utf-8
begin
ctx_ddl.create_preference ('my_lexer', 'chinese_lexer');
end;
--中文分析器,據說比chinese_vgram_lexer 效能好,但是它是按片語查詢 單字不一定能匹--配出來
begin
ctx_ddl.create_preference ('my_chinese_lexer', 'chinese_vgram_lexer');
end;
--同樣是中文分析器,單字可以查詢
create table mydocs( id number primary key, title varchar2(255), thefile
varchar2(255) );
--建立測試表
insert into mydocs( id, title, thefile ) values( 1, 'document1', 'test1.txt');
insert into mydocs( id, title, thefile ) values( 2, 'document2', 'test2.txt');
--插入測試資料,檔案不用帶路徑名,放在d:/file目錄下
insert into mydocs( id, title, thefile ) values( 5, '163', '');
insert into mydocs( id, title, thefile ) values( 6, 'qq', '');
--url的測試資料
commit;
create index mydocs_text_index on mydocs(thefile) indextype is ctxsys.context
parameters('datastore my_datastore_prefs filter cs_filter lexer my_lexer');
--對儲存檔案路徑的字段建立索引
--這時資料庫自動建立索引表 其中$i為讀取檔案內容分析片語後建立的索引
--強制刪除索引(有時刪不掉)
drop index mydocs_text_index force
select id,title,m.thefile
from mydocs m
where contains( thefile, '查詢條件' ) > 0;
--查詢條件為 txt檔案中出現的字元
--模擬真實環境測試時,對大資料量的考慮將測試表建立成分割槽表,每個表空間對應乙個物--理硬碟
--建立oracle text索引需要消耗ctxsys使用者預設的臨時表空間空間。如果空間不夠的話將導--致 ora-01652 錯誤。你可以擴充套件ctxsys的臨時表空間,而不是發出命令的使用者預設的臨時--表空間。
--更改全文索引建立的表空間
begin
ctx_ddl.create_preference('mystore', 'basic_storage'); --建立storage
ctx_ddl.set_attribute('mystore', --設定引數
'i_table_clause',
'tablespace test_space03 storage (initial 1k)');
ctx_ddl.set_attribute('mystore',
'k_table_clause',
'tablespace test_space03 storage (initial 1k)');
ctx_ddl.set_attribute('mystore',
'r_table_clause',
'tablespace users storage (initial 1k) lob
(data) store as (disable storage in row cache)');
ctx_ddl.set_attribute('mystore',
'n_table_clause',
'tablespace test_space03 storage (initial 1k)');
ctx_ddl.set_attribute('mystore',
'i_index_clause',
'tablespace test_space03 storage (initial 1k) compress 2');
ctx_ddl.set_attribute('mystore',
'p_table_clause',
'tablespace test_space03 storage (initial 1k)');
end;
--查詢 更改系統預設語言
select * from v$nls_parameters where parameter = 'nls_language';
alter session set nls_language = 'american';
--對多語言的支援
begin
ctx_ddl.create_preference('test_file_english', 'basic_lexer');
ctx_ddl.set_attribute('test_file_english', 'mixed_case', 'yes');
ctx_ddl.create_preference ('test_file_chinese', 'chinese_vgram_lexer');
ctx_ddl.create_preference('test_file_multi_lexer', 'multi_lexer');
ctx_ddl.add_sub_lexer('test_file_multi_lexer', 'default', 'test_english');
ctx_ddl.add_sub_lexer('test_file_multi_lexer', 'simplified chinese', 'test_file_chinese', 'chinese');
end;
--最終建立在分割槽表支援多語言的檔案儲存型別的全文索引
create index test_text_index on test(thefile) indextype is ctxsys.context
parameters ('datastore my_datastore_prefs filter cs_filter lexer test2_file_multi_lexer language column thefile');
--更新索引,當檔案改變時,需要執行該命令更新索引
begin
ctx_ddl.sync_index('mydocs_text_index ', '2m');
end;
--建立job 自動更新索引(job這裡沒有測試)
variable job1 number;
begin
dbms_job.submit(:job1,'ctx_ddl.sync_index(''mydocs_text_index'', ''2m'');', sysdate, 'sysdate + (1/24/4)');
commit;
end;
--檢視系統索引狀態
select * from ctxsys.ctx_indexes --(idx_status 索引狀態)
-----以下是其他常用索引方式-------
create index mydocs_text_index on mydocs(title) indextype is ctxsys.context
parameters('filter cs_filter lexer my_lexer');
--對title欄位內容建立索引
create index mydocs_text_index on mydocs(thefile) indextype is ctxsys.context parameters
( 'datastore url_pref' );
--url索引的建立方式
oracle text 學起來確實挺麻煩,網上例子不多,所以記錄下來。
最終由於我們的系統資料量太大,避免加重資料庫負擔,改用lucene了。
頭一次寫筆記 寫的比較亂,只是把以前測試時的sql**粘上去簡單的說明
oracle全文檢索.pdf 有興趣的可以看下
MySQL全文檢索學習!
需要在my.cnf裡面設定乙個引數 full text param init ft min word len 1 use test drop table if exists tnew create table tnew id int not null primary key content long...
什麼叫全文檢索 全文檢索概念
全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...
什麼叫全文檢索 全文檢索概念
全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...