SELECT * FROM my text WHERE INSTR(the text,‘Oracle‘)& gt;0;
SELECT * FROM mytext,其中文本類似“% Oracle %”;
在許多情況下,使用instr和like是理想的選擇,尤其是當搜索只跨越壹個小表時。然而,這些文本定位方法將導致全表掃描,這對於資源來說是昂貴的,並且搜索功能非常有限。因此,在搜索海量文本數據時,建議使用oralce提供的全文搜索功能來建立全文搜索。步驟1:檢查並設置數據庫角色。首先,檢查數據庫中是否有CTXSYS用戶和CTXAPP基石。如果沒有這個用戶和角色,這意味著在創建數據庫時沒有安裝intermedia函數。您必須修改數據庫才能安裝此功能。默認情況下,ctxsys的用戶是鎖定的,因此應該首先啟用ctxsys的用戶。步驟2:將ctx_ddl的執行權限授予希望使用全文索引的用戶,例如:
將ctx_ddl上的execute授予pomoho
步驟3:設置詞法分析器(lexer)
Oracle實現全文檢索,其機制其實很簡單。也就是說,文章中的所有表意單位(在甲骨文中稱為$ term)都是通過甲骨文申請專利的詞法分析器(lexer)找到的,並記錄在壹組以dr$開頭的表格中,同時記錄了$ term的位置、頻率和哈希值等信息。搜索時,Oracle從這組表中查找相應的$ term,計算其出現頻率,並根據壹種算法計算每個文檔的得分,這就是所謂的“匹配率”。Lexer是這壹機制的核心,它決定了全文檢索的效率。Oracle為不同的語言提供了不同的lexer,我們通常可以使用其中的三種語言:
對於英語。它可以根據空格和標點符號將英語單詞從句子中分離出來,還可以自動將壹些出現頻率過高且已失去檢索意義的單詞視為“垃圾”,例如if、is等。,處理效率高。然而,這個詞用於漢語時存在許多問題。因為它只識別空格和標點符號,而中文句子中通常沒有空格,所以它會將整個句子視為壹個$ term,事實上它將失去檢索能力。以“中國人民站起來了”這句話為例。basic_lexer分析的結果只有壹個$ term,那就是“中國人民站起來了”。如果此時搜索“中國”,您將無法檢索到相關內容。
N chinese_vgram_lexer:壹個特殊的中文分析器,支持所有中文字符集(ZHS 16gb 231280 zhs 16 gbkzht 32 euchzht 16 big 5 zht 32 triszht 16 mswin 950 zht 16 hkk)。分析器以詞為單位分析漢語句子。“中國人民站起來了”這句話將由它分析如下:“中國”、“中國”、“中國人”、“人民”、“人民站”、“站起來”、“起來”、“來”和“來”。可以看出,這種分析方法,實現算法非常簡單,並且可以實現‘壹網打盡’,但效率不盡如人意。
這是壹個新的中文分析器,只支持utf8字符集。正如我們在上面看到的,分析器中文vgram lexer非常機械,因為它不知道常用的中文單詞。例如,上面的“人民站”和“站起來”在中文中永遠不會單獨出現,因此這種$ term毫無意義,會影響效率。chinese_lexer最大的改進是分析器可以理解大多數常用的中文單詞,因此它可以更高效地分析句子。以上兩個笨單位不會再出現了,大大提高了效率。但它只支持utf8。如果妳的數據庫是zhs16gbk字符集,妳只能使用愚蠢的中文vgram lexer。
如果不做任何設置,Oracle默認使用解析器basic_lexer。要指定使用哪個lexer,您可以這樣做:
首先,在當前用戶下創建壹個首選項(例如,在pomoho用戶下執行以下語句)。
exec CTX _ DDL . create _ preference(‘my _ lexer‘,‘Chinese _ vgram _ lexer‘);
其次,在建立全文索引時,指定所使用的lexer:
在my table(my column)上創建索引myindex索引類型為ctxsys.context
參數(‘lexer my _ lexer‘);
這樣建立的全文索引將使用chinese_vgram_lexer作為解析器。
第四步:建立索引。
使用以下語法建立全文索引
創建索引【架構。】架構上的索引。】表(列)索引類型為CTX sys . context【ONLINE】
LOCAL【(PARTITION【PARTITION】【PARAMETERS(‘paramstring‘)】
【,PARTITION【PARTITION】【PARAMETERS(‘paramstring‘)】】】】
【PARAMETERS(paramstring)】【PARALLEL n】【不可用】;
示例:
在pubmenu上創建索引CTX _ idx _ menuname(menuname)
indextype是ctxsys.context參數(lexer my _ lexer)
使用索引
使用全文索引很簡單,可以通過以下方式實現:
從包含(菜單,“上傳圖片”)》0的pub菜單中選擇*
全文索引的類型
已建立的Oracle文本索引稱為域索引,它包括四種索引類型:
l背景
2 CTXCAT
3 CTXRULE
4 CTXXPATH
根據您的應用程序和文本數據類型,您可以選擇任何壹種。
為多個字段建立全文索引
很多時候,需要從多個文本字段中查詢符合要求的記錄。此時,有必要為多個字段建立全文索引。例如,如果需要從pmhsubjects的subjectname和briefintro進行全文檢索,則需要執行以下步驟:
建議首選多字段索引
以ctxsys身份登錄並執行以下操作:
EXEC CTX _ DDL . create _ preference(‘CTX _ idx _ subject _ pref’,
MULTI _ COLUMN _ DATASTORE‘);
建立與首選項對應的字段值(以ctxsys身份登錄)
EXEC CTX _ DDL . set _ attribute(‘CTX _ idx _ subject _ pref‘,columns,subjectname,brief intro‘);
建立全文索引
在pmhsubjects(subject name)上創建索引ctx_idx_subject
INDEXTYPE ISctxsys。上下文參數(‘數據存儲CTX sys . CTX _ idx _ subject _ pref lexer my _ lexer‘)
使用索引
從包含(主題名稱,‘李宇春’)》0的pmh主題中選擇*
全文索引的維護
為了CTXSYS。上下文索引,在應用程序對基表執行DML操作後,有必要維護基表的索引。索引維護包括索引同步和索引優化。
構建索引後,我們可以發現Oracle在該用戶下自動生成了以下表:(假設索引名為myindex):
$myindex$I博士,$myindex$K博士,$myindex$R博士,$myindex$N博士,其中表I是最重要的。您可以查看該表以了解其中包含的內容:
SELECT token_text,token _ count FROM dr $ I _ rsk 1 $ I其中ROWNUM & lt= 20;
我不會在這裏列出查詢。我拿了。如您所見,該表中保存的實際上是Oracle在分析文檔後生成的$ term記錄,包括$ term的位置、頻率和哈希值。當文檔的內容發生變化時,可以想象這個I表的內容也應該發生相應的變化,以確保Oracle在進行全文檢索時可以正確檢索內容(因為所謂的全文檢索實際上是查詢該表的核心)。這使用sync(同步)和optimize(優化)。
Sync:將新的$ term保存到I表中;
優化:清除I表的垃圾,主要是刪除I表中已刪除的$ term。
當基表中的索引文檔被插入、更新或刪除時,基表的更改不會立即影響索引,直到索引被同步。您可以查詢視圖CTX _用戶_待定來查看相應的更改。例如:
SELECT pnd_index_name,pnd_rowid
TO _ CHAR(PND _ timestamp,‘DD-mon-yyyy hh24:mi:ss’)時間戳
FROM ctx _ user _ pending
該語句的輸出類似於以下內容:
PND _索引_名稱PND_ROWID時間戳
- - -
MYINDEX AAADXnAABAAAS3SAAC
同步和優化方法:可以使用Oracle提供的ctx_ddl包來同步和優化索引。
1.對於CTXCAT類型的索引,當對基表執行DML操作時,Oracle會自動維護索引。對文檔的更改會立即反映在索引中。CTXCAT是交易形式的索引。
索引同步
插入、修改和刪除基表後同步索引。建議使用sync來同步索引。語法:
ctx _ ddl.sync _索引(
VARCHAR2中的idx_name默認為空
VARCHAR2中的內存默認為空,
VARCHAR2中的part_name默認為空
parallel_degree IN NUMBER默認為1);
Idx_name索引名稱
內存指定同步索引所需的內存。默認值是系統參數DEFAULT_INDEX_MEMORY。
指定大內存可以加快索引效率和查詢速度,並且索引碎片較少。
Part_name同步哪個分區索引。
並行度並行同步索引。設置平行度。
例如:
同步索引myindex:exectx _ DDL . sync _ index(‘myindex‘);
實施建議:建議通過oracle的作業同步索引。
索引優化
頻繁的索引同步會導致上下文索引碎片化。索引碎片嚴重影響查詢的響應速度。您可以定期優化索引以減少碎片、減小索引大小並提高查詢效率。
從表中刪除文本後,Oracle Text會標記刪除的文檔,但不會立即修改索引。因此,現有的文檔信息占用了不必要的空間,從而導致查詢的額外成本。您必須在完全模式下優化索引,並從索引中刪除無效的舊信息。這個過程被稱為垃圾處理。當您經常更新和刪除表格文本數據時,垃圾處理是必要的。
exec CTX _ DDL . optimize _ index(‘myidx’,‘full’);
建議:每天在系統空閑時優化全文索引,以提高檢索效率。
P.s .定時優化指數
3.定時優化同步域索引。
創建計劃任務,定期優化和同步域索引。
SQL & gt創建或替換過程hsp_sync_index為
2開始
3 CTX _ DDL . sync _ index(‘id _ cont _ msg‘);
4結束;
5 /
程序已創建。
耗時:00:00:00.08
SQL & gt可變工單編號;
SQL & gt開始
2 DBMS_JOB。提交(:作業號,‘HSP _ sync _ index();‘,
3 SYSDATE,‘SYSDATE+(1/24/4)‘);
4提交;
5結束;
6 /
PL/SQL過程已成功完成。
耗時:00:00:00.27
SQL & gt創建或替換過程hsp_optimize_index為
2開始
3 CTX _ DDL . optimize _ index(‘id _ cont _ msg‘,‘FULL‘);
4結束;
5 /
SQL & gt可變工單編號;
SQL & gt開始
2 DBMS_JOB。提交(:作業號,‘HSP _ optimize _ index();‘,
3 SYSDATE,‘SYSDATE+1’);
4提交;
5結束;
6 /
程序已創建。
耗時:00:00:00.03
PL/SQL過程已成功完成。
耗時:00:00:00.02
SQL & gt