Oracle全文索引

2022-04-04 20:53:48 字數 3209 閱讀 4309

zt

步驟三 設定詞法分析器(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: 

這樣建立的全文檢索索引,就會使用chinese_vgram_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登入,並執行:

全文索引的維護

對於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檢視相應的改動。例如:

同步和優化方法: 可以使用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');

實施建議:每天在系統空閒的時候對全文索引進行相應的優化,以提高檢索的效率

ORACLE 全文索引

6 全文索引查詢語句contains select count from tablename t where contains t.name,農業銀行 公司 0 select from tablename t where contains t.name,農業 安徽 中 部 0 select from...

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...

建立全文索引

建立全文索引 在進行全文檢索之前,必須先建立和填充資料庫全文索引。為了支援全文索引操作,sql server 7.0新增了一些儲存過程和transact sql語句。使用這些儲存過程建立全文索引的具體步驟如下 括號內為呼叫的儲存過程名稱 1.啟動資料庫的全文處理功能 sp fulltext data...