<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 如何更好的利用Oracle全文檢索

如何更好的利用Oracle全文檢索

作者: 時(shí)間:2017-06-12 來(lái)源:網(wǎng)絡(luò ) 收藏
不使用 text功能,也有很多方法可以在數據庫中搜索文本.可以使用標準的INSTR函數和LIKE操作符實(shí)現。

SELECT *FROM mytext WHERE INSTR (thetext, '') > 0;

SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';


有很多時(shí)候,使用instr和like是很理想的, 特別是搜索僅跨越很小的表的時(shí)候.然而通過(guò)這些文本定位的方法將導致全表掃描,對資源來(lái)說(shuō)消耗比較昂貴,而且實(shí)現的搜索功能也非常有限,因此對海量的文本數據進(jìn)行搜索時(shí),建議使用oralce提供的全文檢索|0">功能 建立的步驟步驟一 檢查和設置數據庫角色首先檢查數據庫中是否有CTXSYS用戶(hù)和CTXAPP腳色。如果沒(méi)有這個(gè)用戶(hù)和角色,意味著(zhù)你的數據庫創(chuàng )建時(shí)未安裝intermedia功能。你必須修改數據庫以安裝這項功能?!∧J安裝情況下,ctxsys用戶(hù)是被鎖定的,因此要先啟用ctxsys的用戶(hù)。 步驟二 賦權 在ctxsys用戶(hù)下把ctx_ddl的執行權限賦于要使用全文索引的用戶(hù),例:


步驟三 設置詞法分析器(lexer)

Oracle實(shí)現,其機制其實(shí)很簡(jiǎn)單。即通過(guò)Oracle專(zhuān)利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱(chēng)為 term)找出來(lái),記錄在一組 以dr$開(kāi)頭的表中,同時(shí)記下該term出現的位置、次數、hash 值等信息。檢索時(shí),Oracle 從這組表中查找相應的term,并計算其出現頻率,根據某個(gè)算法來(lái)計算每個(gè)文檔的得分(score),即所謂的‘匹配率’。而lexer則是該機制的核心,它決定了全文檢索的效率。Oracle 針對不同的語(yǔ)言提供了不同的 lexer, 而我們通常能用到其中的三個(gè):

n basic_lexer: 針對英語(yǔ)。它能根據空格和標點(diǎn)來(lái)將英語(yǔ)單詞從句子中分離,還能自動(dòng)將一些出現頻率過(guò)高已經(jīng)失去檢索意義的單詞作為‘垃圾’處理,如if , is 等,具有較高的處理效率。但該lexer應用于漢語(yǔ)則有很多問(wèn)題,由于它只認空格和標點(diǎn),而漢語(yǔ)的一句話(huà)中通常不會(huì )有空格,因此,它會(huì )把整句話(huà)作為一個(gè)term,事實(shí)上失去檢索能力。以‘中國人民站起來(lái)了’這句話(huà)為例,basic_lexer 分析的結果只有一個(gè)term ,就是‘中國人民站起來(lái)了’。此時(shí)若檢索‘中國’,將檢索不到內容。

n chinese_vgram_lexer: 專(zhuān)門(mén)的漢語(yǔ)分析器,支持所有漢字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。該分析器按字為單元來(lái)分析漢語(yǔ)句子。‘中國人民站起來(lái)了’這句話(huà),會(huì )被它分析成如下幾個(gè)term: ‘中’,‘中國’,‘國人’,‘人民’,‘民站’,‘站起’,起來(lái)’,‘來(lái)了’,‘了’??梢钥闯?,這種分析方法,實(shí)現算法很簡(jiǎn)單,并且能實(shí)現‘一網(wǎng)打盡’,但效率則是差強人意。

n chinese_lexer: 這是一個(gè)新的漢語(yǔ)分析器,只支持utf8字符集。上面已經(jīng)看到,chinese vgram lexer這個(gè)分析器由于不認識常用的漢語(yǔ)詞匯,因此分析的單元非常機械,像上面的‘民站’,‘站起’在漢語(yǔ)中根本不會(huì )單獨出現,因此這種term是沒(méi)有意義的,反而影響效率。chinese_lexer的最大改進(jìn)就是該分析器 能認識大部分常用漢語(yǔ)詞匯,因此能更有效率地分析句子,像以上兩個(gè)愚蠢的單元將不會(huì )再出現,極大 提高了效率。但是它只支持 utf8, 如果你的數據庫是zhs16gbk字符集,則只能使用笨笨的那個(gè)Chinese vgram lexer.

如果不做任何設置,Oracle 缺省使用basic_lexer這個(gè)分析器。要指定使用哪一個(gè)lexer, 可以這樣操作:

第一. 當前用戶(hù)下下建立一個(gè)preference(例:在pomoho用戶(hù)下執行以下語(yǔ)句)



第二. 在建立全文索引索引時(shí),指明所用的lexer:



這樣建立的全文檢索索引,就會(huì )使用chinese_vgram_lexer作為分析器。

步驟四 建立索引

通過(guò)以下語(yǔ)法建立全文索引



步驟五 使用索引

使用全文索引很簡(jiǎn)單,可以通過(guò):

select * from pubmenu where contains(menuname,'上傳圖片')>0

全文索引的種類(lèi)

建立的Oracle Text索引被稱(chēng)為域索引(domain index),包括4種索引類(lèi)型:

l CONTEXT

2 CTXCAT

3 CTXRULE

4 CTXXPATH

依據你的應用程序和文本數據類(lèi)型你可以任意選擇一種。

對多字段建立全文索引

很多時(shí)候需要從多個(gè)文本字段中查詢(xún)滿(mǎn)足條件的記錄,這時(shí)就需要建立針對多個(gè)字段的全文索引,例如需要從pmhsubjects(專(zhuān)題表)的subjectname(專(zhuān)題名稱(chēng))和briefintro(簡(jiǎn)介)上進(jìn)行全文檢索,則需要按以下步驟進(jìn)行操作:

Ø 建議多字段索引的preference

以ctxsys登錄,并執行:



全文索引的維護

對于CTXSYS.CONTEXT索引,當應用程序對基表進(jìn)行DML操作后,對基表的索引維護是必須的。索引維護包括索引同步和索引優(yōu)化。

在索引建好后,我們可以在該用戶(hù)下查到Oracle自動(dòng)產(chǎn)生了以下幾個(gè)表:(假設索引名為myindex):

DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查詢(xún)一下該表,看看有什么內容:



這里就不列出查詢(xún)接過(guò)了??梢钥吹?,該表中保存的其實(shí)就是Oracle 分析你的文檔后,生成的term記錄在這里,包括term出現的位置、次數、hash值等。當文檔的內容改變后,可以想見(jiàn)這個(gè)I表的內容也應該相應改變,才能保證Oracle在做全文檢索時(shí)正確檢索到內容(因為所謂全文檢索,其實(shí)核心就是查詢(xún)這個(gè)表)。這就用到sync(同步) 和 optimize(優(yōu)化)了。

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

優(yōu)化(optimize): 清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。

當基表中的被索引文檔發(fā)生insert、update、delete操作的時(shí)候,基表的改變并不能馬上影響到索引上直到同步索引??梢圆樵?xún)視圖CTX_USER_PENDING查看相應的改動(dòng)。例如:



同步和優(yōu)化方法: 可以使用Oracle提供的ctx_ddl包同步和優(yōu)化索引

一. 對于CTXCAT類(lèi)型的索引來(lái)說(shuō), 當對基表進(jìn)行DML操作的時(shí)候,Oracle自動(dòng)維護索引。對文檔的改變馬上反映到索引中。CTXCAT是事務(wù)形的索引。

索引的同步

在對基表插入,修改,刪除之后同步索引。推薦使用sync同步索引。語(yǔ)法:



指定一個(gè)大的內存時(shí)候可以加快索引效率和查詢(xún)速度,且索引有較少的碎片
part_name 同步哪個(gè)分區索引。
parallel_degree 并行同步索引。設置并行度。

例如:

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

實(shí)施建議:建議通過(guò)oracle的job對索引進(jìn)行同步

索引的優(yōu)化

經(jīng)常的索引同步將會(huì )導致你的CONTEXT索引產(chǎn)生碎片。索引碎片嚴重的影響了查詢(xún)的反應速度。你可以定期優(yōu)化索引來(lái)減少碎片,減少索引大小,提高查詢(xún)效率。
當文本從表中刪除的時(shí)候,Oracle Text標記刪除的文檔,但是并不馬上修改索引。因此,就的文檔信息占據了不必要的空間,導致了查詢(xún)額外的開(kāi)銷(xiāo)。你必須以FULL模式優(yōu)化索引,從索引中刪除無(wú)效的舊的信息。這個(gè)過(guò)程叫做垃圾處理。當你經(jīng)常的對表文本數據進(jìn)行更新,刪除操作的時(shí)候,垃圾處理是很必要的。

exec ctx_ddl.optimize_index ('myidx', 'full');

實(shí)施建議:每天在系統空閑的時(shí)候對全文索引進(jìn)行相應的優(yōu)化,以提高檢索的效率





關(guān)鍵詞: 全文檢索 文本定位 Oracle

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>