5 查詢
建立了索引,就可以使用 SELECT 語句中的 CONTAINS 運算符發出文本查詢。使用 CONTAINS 可以進行兩種查詢:單詞查詢和ABOUT查詢。
5.1 詞查詢示例
詞查詢是對輸入到 CONTAINS 運算符中單引號間的精確單詞或短語的查詢。在以下示例中,我們將查找文本列中包含 oracle 一詞的所有文檔。每行的分值由使用標簽 1 的 SCORE 運算符選定:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
在查詢表達式中,可以使用 AND 和 OR 等文本運算符來獲取不同結果。還可以將結構性謂詞添加到 WHERE 子句中?梢允褂 count(*)、CTX_QUERY.COUNT_HITS 或 CTX_QUERY.EXPLAIN 來計算查詢的命中 (匹配) 數目。
5.2 ABOUT查詢示例
在所有語言中,ABOUT查詢增加了某查詢所返回的相關文檔的數目。在英語中,ABOUT 查詢可以使用索引的主題詞組件,該組件在默認情況下創建。這樣,運算符將根據查詢的概念返回文檔,而不是僅依據所指定的精確單詞或短語。例如,以下查詢將查找文本列中關于主題 politics 的所有文檔,而不是僅包含 politics 一詞的文檔:
SELECT SCORE(1) title from news WHERE CONTAINS(text, 'about(politics)', 1) > 0;
6 顯示滿足查詢條件的文檔
通常,通過使用Oracle Text查詢應用程序,用戶可查看查詢所返回的文檔。用戶從命中列表中選擇一個文檔,然后應用程序以某種形式顯示該文檔。通過Oracle Text,可以用不同的方式再現文檔。例如,可以通過突出顯示查詢詞來顯示文檔。突出顯示的查詢詞可以是相關詞查詢中的詞,也可以是英文 ABOUT 查詢中的主題詞。
以下是關于輸出效果和用于每個輸出效果的過程的信息:
突出顯示的文檔,純文本格式版本(CTX_DOC.MARKUP)
突出顯示的文檔,HTML版本(CTX_DOC.MARKUP)
突出顯示純文本格式版本的偏移量信息(CTX_DOC.HIGHLIGHT)
突出顯示HTML 版本的偏移量信息(CTX_DOC.HIGHLIGHT)
純文本格式版本,無突出顯示(CTX_DOC.FILTER)
HTML版本文檔,無突出顯示(CTX_DOC.FILTER)
7 索引維護
索引建好后,如果表中的數據發生變化,比如增加或修改了記錄,怎么辦?由于對表所發生的任何DML語句,都不會自動修改索引,因此,必須定時同步(sync)和優化(optimize)索引,以正確反映數據的變化。
在索引建好后,可以在該用戶下查到Oracle自動產生了以下幾個表:(假設索引名為myindex):
DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N
其中以I表最重要,可以查詢一下該表:
select token_text, token_count from DR$ myindex $I where rownum<=20;
查詢結果在此省略?梢钥吹,該表中保存的其實就是Oracle 分析你的文檔后,生成的term記錄在這里,包括term出現的位置、次數、hash值等。當文檔的內容改變后,可以想見這個I表的內容也應該相應改變,才能保證Oracle在做全文檢索時正確檢索到內容(因為所謂全文檢索,其實核心就是查詢這個表)。那么如何維護該表的內容,不能每次數據改變都重新建立索引,這就要用到sync 和 optimize了。
同步(sync):將新的term 保存到I表;
優化(optimize):清除I表的垃圾,主要是將已經被刪除的term從I表刪除。
Oracle提供了一個所謂的ctx server來做這個同步和優化的工作,只需要在后臺運行這個進程,它會監視數據的變化,及時進行同步。另外,也可以用以下的job來完成(該job要建在和表同一個用戶下):
create or replace procedure sync
is
begin
execute immediate
'alter index myindex rebuild online' ||
' parameters ( ''sync'' )' ;
execute immediate
'alter index myindex rebuild online' ||
' parameters ( ''optimize full maxtime unlimited'' )' ;
end sync;
/
Set ServerOutput on
declare
v_job number;
begin
Dbms_Job.Submit
(
job => v_job,
what => 'sync;',
next_date => sysdate, /* default */
interval => 'sysdate + 1/720' /* = 1 day / ( 24 hrs * 30 min) = 2 mins */
);
Dbms_Job.Run ( v_job );
Dbms_Output.Put_Line ( 'Submitted as job # ' || to_char ( v_job ) );
end;
/
job的SYSDATE + (1/720)是指每隔2分鐘同步一次。具體的時間間隔,可以根據自己的應用的需要而定。
8 小結
文本對于各種規模的公司、機構組織來說,都是包含眾多豐富信息的最有效載體,Oracle Text的推出,標志著Oracle提供了一套嶄新的技術,可以便捷安全的用于管理企業的文本信息。Oracle Text使應用程序開發者可以透明地將全文檢索能力加入到基于SQL的應用程序中,Oracle Text也是其他Oracle產品的核心組件,比如Oracle9iAS Portal,Oracle eBusiness Suite,Oracle Ultra Search和Oracle Internet File System等。靈活運用Oracle Text提供的全文檢索技術,就可以使自己的應用具備強大的全文檢索能力。
文章來源于領測軟件測試網 http://www.kjueaiud.com/