全文索引
背景介紹:很多時候需要根據key words關鍵字去匹配對應的值,對於大量的資料而已,如果使用like,或者instr函式,速度則會很慢,這個時候,全文檢索對比其他的模糊查詢,有著明顯的速度優勢。但是因為分詞,所以會占用的一定的空間。如果空間足夠以及對速度有一樣的需求,可以考慮全文檢索。根據自身的需求而定。
oracle的全文檢索實現邏輯,通過
lexer
詞法分析器,講把值的
term
找出來。記錄在一組的
dr$開頭的表
裡面(主要是dr$***i表),主要記錄
term
的位置,
frequency
頻率,hash
等資訊,
oracle
根據謂詞,找到對應的
term。
主要介紹三種自然語言的分析器
basic_lexer
(預設的分析器)
:主要針對英語。有較高的處理效率
,因為它只認空格和標點,所以對於漢語沒有空格的情況不會分詞
chinese_vgram_lexer
: 專用漢語分析器,支援所有漢字字符集(
zhs16cgb231280 zhs16gbk zht32euc zht16big5 zht32tris zht16mswin950 zht16hkscs utf8
)因為採用了分詞的方法,可以查到所有的分詞
,效率差
chinese_lexer
: 新漢語分析器,只支援
utf8,
支援識別大部分的分詞,但是會過濾掉很多無法識別的分詞,因為這個原因也導致效率很高
,如果資料庫是
zhs16gbk
字符集,則只能使用
chinese vgram lexer.
note:追求效率那麼使用
chinese_lexer,
如果追求準確度那麼使用
chinese_vgram_lexer
(推薦使用
chinese_vgram_lexer)
建立步驟
全文檢索的大部分都在ctx包裡面
檢視使用者
select * from dba_users where username='ctxsys'
檢視角色 解鎖
alter user ctxsys account unlock;
角色授權:
根據需求選擇lexer制定文字解析器
建立文字解析器
begin
ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
end;
/刪除文字解析器
begin
ctx_ddl.drop_preference ('my_lexer');
end;
建立全文索引
create index ind_lot on lot(lot_id) indextype is ctxsys.context parameters('lexer my_lexer');
刪除全文索引
drop index index_name force
索引同步維護
begin
ctx_ddl.sync_index('ind_lot');
ctx_ddl.optimize_index('ind_lot','full');
end;用法
ctx_ddl.sync_index(
ctx_web_acion_basic in varchar2 default null
memory in varchar2 default null,
p2014_1010_1020 in varchar2 default null
parallel_degree in number default 1)
ctx_ddl.sync_index('ind_lot','500m','p1')
也可以定時run job
sync同步
jobvariable jobno number;
begin
dbms_job.submit(:jobno,'ctx_ddl.sync_index(''ind_lot'');',
sysdate, 'sysdate + (1/24/6)');
commit;
end;
optimize索引
variable jobno number;
begin
dbms_job.submit(:jobno,'ctx_ddl.optimize_index(''ind_lot'',''full'');',
sysdate, 'sysdate + 1');
commit;
測試檢視資料
select * from lot where contains(lot_id,'北京
')>0
補充:有時候需要指定過掉一些詞(不會為這些詞建立全文索引)
指定過濾詞
exec ctx_ddl.create_stoplist('北京')
ORACLE 全文索引
6 全文索引查詢語句contains select count from tablename t where contains t.name,農業銀行 公司 0 select from tablename t where contains t.name,農業 安徽 中 部 0 select from...
Oracle全文索引
zt 步驟三 設定詞法分析器 lexer oracle實現全文檢索,其機制其實很簡單。即通過oracle專利的詞法分析器 lexer 將文章中所有的表意單元 oracle 稱為 term 找出來,記錄在一組 以dr 開頭的表中,同時記下該term出現的位置 次數 hash 值等資訊。檢索時,orac...
mysql全文索引的坑 MySQL全文索引問題
我有乙個包含以下資料的 文章 mysql select from articles id title body 1 mysql tutorial dbms stands for database 2 how to use mysql well after you went through a 3 o...