zt http://blog.163.com/try_boy/blog/static/17868656220121121752184/php
不使用Oracle text功能,也有不少方法能夠在Oracle數據庫中搜索文本.可使用標準的INSTR函數和LIKE操做符實現。
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;
SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
有不少時候,使用instr和like是很理想的, 特別是搜索僅跨越很小的表的時候.然而經過這些文本定位的方法將致使全表掃描,對資源來講消耗比較昂貴,並且實現的搜索功能也很是有限,所以對海量的文本數據進行搜索時,建議使用oralce提供的全文檢索功能 創建全文檢索的步驟步驟一 檢查和設置數據庫角色首先檢查數據庫中是否有CTXSYS用戶和CTXAPP腳色。若是沒有這個用戶和角色,意味着你的數據庫建立時未安裝intermedia功能。你必須修改數據庫以安裝這項功能。 默認安裝狀況下,ctxsys用戶是被鎖定的,所以要先啓用ctxsys的用戶。 步驟二 賦權 在ctxsys用戶下把ctx_ddl的執行權限賦於要使用全文索引的用戶,例: 算法
步驟三 設置詞法分析器(lexer)
Oracle實現全文檢索,其機制其實很簡單。即經過Oracle專利的詞法分析器(lexer),將文章中全部的表意單元(Oracle 稱爲 term)找出來,記錄在一組 以dr$開頭的表中,同時記下該term出現的位置、次數、hash 值等信息。檢索時,Oracle 從這組表中查找相應的term,並計算其出現頻率,根據某個算法來計算每一個文檔的得分(score),即所謂的‘匹配率’。而lexer則是該機制的核心,它決定了全文檢索的效率。Oracle 針對不一樣的語言提供了不一樣的 lexer, 而咱們一般能用到其中的三個:
n basic_lexer: 針對英語。它能根據空格和標點來將英語單詞從句子中分離,還能自動將一些出現頻率太高已經失去檢索意義的單詞做爲‘垃圾’處理,如if , is 等,具備較高的處理效率。但該lexer應用於漢語則有不少問題,因爲它只認空格和標點,而漢語的一句話中一般不會有空格,所以,它會把整句話做爲一個term,事實上失去檢索能力。以‘中國人民站起來了’這句話爲例,basic_lexer 分析的結果只有一個term ,就是‘中國人民站起來了’。此時若檢索‘中國’,將檢索不到內容。
n chinese_vgram_lexer: 專門的漢語分析器,支持全部漢字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。該分析器按字爲單元來分析漢語句子。‘中國人民站起來了’這句話,會被它分析成以下幾個term: ‘中’,‘中國’,‘國人’,‘人民’,‘民站’,‘站起’,起來’,‘來了’,‘了’。能夠看出,這種分析方法,實現算法很簡單,而且能實現‘一網打盡’,但效率則是差強人意。
n chinese_lexer: 這是一個新的漢語分析器,只支持utf8字符集。上面已經看到,chinese vgram lexer這個分析器因爲不認識經常使用的漢語詞彙,所以分析的單元很是機械,像上面的‘民站’,‘站起’在漢語中根本不會單獨出現,所以這種term是沒有意義的,反而影響效率。chinese_lexer的最大改進就是該分析器 能認識大部分經常使用漢語詞彙,所以能更有效率地分析句子,像以上兩個愚蠢的單元將不會再出現,極大 提升了效率。可是它只支持 utf8, 若是你的數據庫是zhs16gbk字符集,則只能使用笨笨的那個Chinese vgram lexer.
若是不作任何設置,Oracle 缺省使用basic_lexer這個分析器。要指定使用哪個lexer, 能夠這樣操做:
第一. 當前用戶下下創建一個preference(例:在pomoho用戶下執行如下語句) 數據庫
第二. 在創建全文索引索引時,指明所用的lexer: oracle
這樣創建的全文檢索索引,就會使用chinese_vgram_lexer做爲分析器。
步驟四 創建索引
經過如下語法創建全文索引 dom
步驟五 使用索引
使用全文索引很簡單,能夠經過:
select * from pubmenu where contains(menuname,'上傳圖片')>0
全文索引的種類
創建的Oracle Text索引被稱爲域索引(domain index),包括4種索引類型:
l CONTEXT
2 CTXCAT
3 CTXRULE
4 CTXXPATH
依據你的應用程序和文本數據類型你能夠任意選擇一種。
對多字段創建全文索引
不少時候須要從多個文本字段中查詢知足條件的記錄,這時就須要創建針對多個字段的全文索引,例如須要從pmhsubjects(專題表)的subjectname(專題名稱)和briefintro(簡介)上進行全文檢索,則須要按如下步驟進行操做:
? 建議多字段索引的preference
以ctxsys登陸,並執行: 函數
全文索引的維護
對於CTXSYS.CONTEXT索引,當應用程序對基表進行DML操做後,對基表的索引維護是必須的。索引維護包括索引同步和索引優化。
在索引建好後,咱們能夠在該用戶下查到Oracle自動產生了如下幾個表:(假設索引名爲myindex):
DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,能夠查詢一下該表,看看有什麼內容: 優化
這裏就不列出查詢接過了。能夠看到,該表中保存的其實就是Oracle 分析你的文檔後,生成的term記錄在這裏,包括term出現的位置、次數、hash值等。當文檔的內容改變後,能夠想見這個I表的內容也應該相應改變,才能保證Oracle在作全文檢索時正確檢索到內容(由於所謂全文檢索,其實核心就是查詢這個表)。這就用到sync(同步) 和 optimize(優化)了。
同步(sync): 將新的term 保存到I表;
優化(optimize): 清除I表的垃圾,主要是將已經被刪除的term從I表刪除。
當基表中的被索引文檔發生insert、update、delete操做的時候,基表的改變並不能立刻影響到索引上直到同步索引。能夠查詢視圖CTX_USER_PENDING查看相應的改動。例如: blog
同步和優化方法: 可使用Oracle提供的ctx_ddl包同步和優化索引
一. 對於CTXCAT類型的索引來講, 當對基表進行DML操做的時候,Oracle自動維護索引。對文檔的改變立刻反映到索引中。CTXCAT是事務形的索引。
索引的同步
在對基表插入,修改,刪除以後同步索引。推薦使用sync同步索引。語法: 索引
指定一個大的內存時候能夠加快索引效率和查詢速度,且索引有較少的碎片
part_name 同步哪一個分區索引。
parallel_degree 並行同步索引。設置並行度。
例如:
同步索引myindex:Exec ctx_ddl.sync_index ('myindex');
實施建議:建議經過oracle的job對索引進行同步
索引的優化
常常的索引同步將會致使你的CONTEXT索引產生碎片。索引碎片嚴重的影響了查詢的反應速度。你能夠按期優化索引來減小碎片,減小索引大小,提升查詢效率。
當文本從表中刪除的時候,Oracle Text標記刪除的文檔,可是並不立刻修改索引。所以,就的文檔信息佔據了沒必要要的空間,致使了查詢額外的開銷。你必須以FULL模式優化索引,從索引中刪除無效的舊的信息。這個過程叫作垃圾處理。當你常常的對錶文本數據進行更新,刪除操做的時候,垃圾處理是很必要的。
exec ctx_ddl.optimize_index ('myidx', 'full');
實施建議:天天在系統空閒的時候對全文索引進行相應的優化,以提升檢索的效率圖片