?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和記娛樂和記怡情AG:如何更好的利用Oracle全文檢索

?

不應用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功能。你必須改動數據庫以安裝這項功能?!∧J安裝環境下,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, 而我們平日能用到此中的三個:

nbasic_lexer: 針對英語。它能根據空格和標點來將英語單詞從句子平分離,還能自動將一些呈現頻率過高已經掉去檢索意義的單詞作為‘垃圾’處置懲罰,如if , is 等,具有較高的處置懲罰效率。但該lexer利用于漢語則有很多問題,因為它只認空格和標點,而漢語的一句話中平日不會有空格,是以,它會把整句話作為一個term,事實上掉去檢索能力。以‘中國人夷易近站起來了’這句話為例,basic_lexer 闡發的結果只有一個term ,便是‘中國人夷易近站起來了’。此時若檢索‘中國’,將檢索不到內容。

nchinese_vgram_lexer: 專門的漢語闡發器,支持所有漢字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。該闡發器按字為單元來闡發漢語句子?!袊艘囊捉酒饋砹恕@句話,會被它闡發成如下幾個term: ‘中’,‘中國’,‘國人’,‘人夷易近’,‘夷易近站’,‘站起’,起來’,‘來了和記娛樂和記怡情AG’,‘了’??梢钥闯?,這種闡發措施,實現算法很簡單,并且能實現‘一掃而空’,但效率則是差強人意。

nchinese_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 [schem和記娛樂和記怡情AGa.]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')

步驟五 應用索引

應用全文索引很簡單,可以經由過程:

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登錄,并履行:

EXEC ctx_ddl.create_preference(' ctx_idx_subject_pref',

'MULTI_COLUMN_DATASTORE');

Ø建立preference對應的字段值(以ctxsys登錄)

EXEC ctx_ddl.set_attribute(' ctx_idx_subject_pref ','columns','subjectname,briefintro');

Ø建立全文索引

CREATE INDEX ctx_idx_subject ON pmhsubjects(subjectname)

INDEXTYPE ISctxsys.CONTEXT PARAMETERS('DATASTORE ctxsys.ctx_idx_subject_pref lexer my_lexer')

Ø應用索引

select * from pmhsubjects where contains(subjectname,'李宇春')>0

全文索引的掩護

對付CTXSYS.CONTEXT索引,當利用法度榜樣對基表進行DML操作后,對基表的索引掩護是必須的。索引掩護包括索引同步和索引優化。

在索引建好后,我們可以在該用戶下查到Oracle自動孕育發生了以下幾個表:(假設索引名為myindex):

DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N此中以I表最緊張,可以查詢一下該表,看看有什么內容:

SELECT token_text, token_count FROM dr$i_rsk1$I WHERE ROWNUM

這里就不列出查詢接過了??梢钥吹?,該表中保存的著實便是Oracle 闡發你的文檔后,天生的term記錄在這里,包括term呈現的位置、次數、hash值等。當文檔的內容改變后,可以想見這個I表的內容也應該響應改變,才能包管Oracle在做全文檢索時精確檢索到內容(由于所謂全文檢索,著實核心便是查詢這個表)。這就用到sync(同步) 和 optimiz和記娛樂和記怡情AGe(優化)了。

同步(sync): 將新的term 保存到I表;

優化(optimize): 清除I表的垃圾,主如果將已經被刪除的term從I表刪除。

當基表中的被索引文檔發生insert、update、delete操作的時刻,基表的改變并不能頓時影響到索引上直到同步索引??梢圆樵円晥DCTX_USER_PENDING查看響應的篡改。例如:

SELECT pnd_index_name, pnd_rowid,

TO_CHAR (pnd_timestamp, 'dd-mon-yyy和記娛樂和記怡情AGy hh24:mi:ss') timestamp

FROM ctx_user_pending;

該語句的輸出類似如下:

PND_INDEX_NAMEPND_ROWIDTIMESTAMP

------------------------------ ------------------ --------------------

MYINDEXAAADXnAABAAAS3SAAC 06-oct-1999 15:56:50

同步和優化措施: 可以應用Oracle供給的ctx_ddl包同步和優化索引

一.對付CTXCAT類型的索引來說, 當對基表進行DML操作的時刻,Oracle自動掩護索引。對文檔的改變頓時反應到索引中。CTXCAT是事務形的索引。

索引的同步

在對基表插入,改動,刪除之后同步索引。保舉應用sync同步索引。語法:

ctx_ddl.sync_index(

idx_name IN VARCHAR2 DEFAULT NULL

memory IN VARCHAR2 DEFAULT NULL,

part_name IN VARCHAR2 DEFAULT NULL

parallel_degree IN NUMBER DEFAULT 1);

idx_name索引名稱

memory指定同步索引必要的內存。默認是系統參數DEFAULT和記娛樂和記怡情AG_INDEX_MEMORY 。

指定一個大年夜的內存時刻可以加快索引效率和查詢速率,且索引有較少的碎片

part_name 同步哪個分區索引。

parallel_degree 并行同步索引。設置并行度。

例如:

同步索引myindex:Execctx_ddl.sync_index ('myindex');

實施建議:建議經由過程oracle的job對索引進行同步

索引的優化

常常的索引同步將會導致你的CONTEXT索引孕育發生碎片。索引碎片嚴重的影響了查詢的反映速率。你可以按期優化索引來削減碎片,削減索引大年夜小,前進查詢效率。

當文本從表中刪除的時刻,Oracle Text標記刪除的文檔,然則并不頓時改動索引。是以,就的文檔信息盤踞了不需要的空間,導致了查詢額外的開銷。你必須以FULL模式優化索引,從索引中刪除無效的舊的信息。這個歷程叫做垃圾處置懲罰。當你常常的對表文本數據進行更新,刪除操作的時刻,垃圾處置懲罰是很需要的。

execctx_ddl.optimize_index ('myidx', 'full');

實施建議:天天在系統余暇的時刻對全文索引進行響應的優化,以前進檢索的效率

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户