不使用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的執行權限賦於要使用全文索引的用戶,例:
grant execute on ctx_ddl to pomoho;
步驟三 設置詞法分析器(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用戶下執行以下語句)
exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
第二.在建立全文索引索引時,指明所用的 lexer:
CREATE INDEX myindex ON mytable(mycolumn) indextype is ctxsys.context
parameters('lexer my_lexer');
這樣建立的全 文檢索索引,就會使用chinese_vgram_lexer作為分析器。
步驟四 建立索引
通過以下語 法建立全文索引
CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.context [ONLINE]
LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
[, PARTITION [partition] [PARAMETERS ('paramstring')]])]
[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];
例:
CREATE INDEX ctx_idx_menuname ON pubmenu (menuname)
indextype is ctxsys.context parameters('lexer my_lexer')