全文檢索初步學習筆記

2021-08-30 23:13:06 字數 4842 閱讀 9208

本文主要是學習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...

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...

什麼叫全文檢索 全文檢索概念

全文檢索是指計算機索引程式通過掃瞄文章中的每乙個詞,對每乙個詞建立乙個索引,指明該詞在文章中出現的次數和位置,當使用者查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢...