Oracle一直致力於全文檢索技術的研究
當Oracle
i Rlease
發布之時
Oracle數據庫的全文檢索技術已經非常完美
Oracle Text使Oracle
i具備了強大的文本檢索能力和智能化的文本管理能力
Oracle Text是Oracle
i采用的新名稱
在Oracle
/
i中它被稱作Oracle interMedia Text
在Oracle
以前它的名稱是Oracle ConText Cartridge
使用Oracle
i和Oracle Text
可以方便而有效地利用標准的SQL工具來構建基於文本的新的開發工具或對現有應用程序進行擴展
應用程序開發人員可以在任何使用文本的Oracle數據庫應用程序中充分利用Oracle Text搜索
應用范圍可以是現有應用程序中可搜索的注釋字段
也可是實現涉及多種文檔格式和復雜搜索標准的大型文檔管理系統
Oracle Text支持Oracle數據庫所支持的大多數語言的基本全文搜索功能
本文將介紹如何使用Oracle
i的全文檢索技術來為自己的應用提供一個優秀的解決方案
Oracle Text的體系架構 下圖是Oracle Text的體系架構
圖 Oracle Text的體系架構 以上面的體系架構圖為基礎
Oracle Text 索引文檔時所使用的主要邏輯步驟如下
(
)數據存儲邏輯搜索表的所有行
並讀取列中的數據
通常
這只是列數據
但有些數據存儲使用列數據作為文檔數據的指針
例如
URL_DATASTORE 將列數據作為 URL 使用
(
)過濾器提取文檔數據並將其轉換為文本表示方式
存儲二進制文檔 (如 Word 或 Acrobat 文件) 時需要這樣做
過濾器的輸出不必是純文本格式
它可以是 XML 或 HTML 之類的文本格式
(
)分段器提取過濾器的輸出信息
並將其轉換為純文本
包括 XML 和 HTML 在內的不同文本格式有不同的分段器
轉換為純文本涉及檢測重要文檔段標記
移去不可見的信息和文本重新格式化
(
)詞法分析器提取分段器中的純文本
並將其拆分為不連續的標記
既存在空白字符分隔語言使用的詞法分析器
也存在分段復雜的亞洲語言使用的專門詞法分析器
(
)索引引擎提取詞法分析器中的所有標記
文檔段在分段器中的偏移量以及被稱為非索引字的低信息含量字列表
並構建反向索引
倒排索引存儲標記和含有這些標記的文檔
簡單的示例 這裡先給出一個簡單示例說利用Oracle Text實現全文檢索的方法與步驟
在後面在進行具體的說明
Orcale
i提供了Oracle Text Manager可以簡化許多工作
所有在Oracle Text Manager中完成的工作
都可以在通過PL/SQL來實現
要使用Oracle Text
必須具有CTXAPP角色或者是CTXSYS用戶
Oracle Text為系統管理員提供CTXSYS用戶
為應用程序開發人員提供CTXAPP角色
CTXSYS用戶可執行以下任務
啟動Oracle Text服務器
執行CTXAPP角色的所有任務
具有CTXAPP角色的用戶可執行以下任務
創建索引
管理 Oracle Text 數據字典
包括創建和刪除首選項
進行Oracle Text 查詢
使用 Oracle Text PL/SQL程序包
使用Oracle Text的步驟
(
)創建表來保存某些文檔
該示例使用一個主關鍵字列來標識每個文檔
使用一個小的VARCHAR
列來保存每個文檔
CREATE TABLE docs (id NUMBER PRIMARY KEY
text VACHAR
(
));
(
)將兩個示例文檔置入該表
INSERT INTO docs VALUES (
the first doc
)
INSERT INTO docs VALUES (
the second doc
)
COMMIT
(
)使用Oracle Text Manager來創建和修改首選項
首選項將與索引相關聯
(
)使用Oracle Text Manager創建文本索引
另外
可以輸入以下使用默認首選項的 SQL 語句
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS
CONTEXT;
(
)使用 CONTAINS 函數
發出基於內容的文檔查詢
例如
SELECT id FROM docs WHERE CONTAINS (text
first
) >
;
這將在文本列包含單詞 first (即文檔
) 的 docs 中查找所有行
語句中的>
部分是有效的Oracle SQL所必需的
Oracle SQL不支持函數的布爾返回值
以上只是一個簡單的示例
旨在給出使用Oracle Text建立全文索引的完整步驟
歸納起來如下
(
)建表並裝載文本(包含帶有需要檢索的文本字段)
(
)配置索引
(
)建立索引
(
)發出查詢
(
)索引維護
同步與優化(將在後面介紹)
文本裝載 要實現文本的全文檢索首先必須把正確的文本加載到數據庫表中
默認的建立索引行為要求將文檔裝載在文本列中
盡管可以用其它方式 (包括文件系統和 URL 形式)存儲文檔 (在
數據存儲
選項進行設置)
默認情況下
系統應該將文檔裝載在文本列中
文本列可以是VARCHAR
CLOB
BLOB
CHAR或BFILE
注意
只有在將Oracle
系統移植到Oracle
的情況下才支持用LONG和LONG RAW 這兩個相反的列類型存儲文本
不能為列類型NCLOB
DATE和NUMBER建立索引
關於文檔格式
因為系統能為包括HTML
PDF
Microsoft Word和純文本在內的大多數文檔格式建立索引
可以將其中的任何文檔類型裝載到文本列中(在
過濾器
選項中設置)
有關所支持的文檔格式的詳細信息
可以參閱Oracle Text User
s Guide and Reference 中的附錄
Supported Filter Formats
裝載方法主要有以下幾種
(
)SQL INSERT 語句
(
)ctxload 可執行文件
(
)SQL*Loader
(
)從 BFILE 中裝載 LOB 的 DBMS_LOB
LOADFROMFILE() PL/SQL 過程
(
)Oracle Call Interface
為文本建立索引 文本裝入文本列後
就可以創建Oracle Text索引
文檔以許多不同方案
格式和語言存儲
因此
每個 Oracle Text 索引有許多需要設置的選項
以針對特定情況配置索引
創建索引時
Oracle Text可使用若干個默認值
但在大多數情況下要求用戶通過指定首選項來配置索引
每個索引的許多選項組成功能組
稱為
類
每個類集中體現配置的某一方面
可以認為這些類就是與文檔數據庫有關的一些問題
例如
數據存儲
過濾器
詞法分析器
相關詞表
存儲等
每個類具有許多預定義的行為
稱之為對象
每個對象是類問題可能具有的答案
並且大多數對象都包含有屬性
通過屬性來定制對象
從而使對索引的配置更加多變以適應於不同的應用
(
)存儲(Storage)類
存儲類指定構成Oracle Text索引的數據庫表和索引的表空間參數和創建參數
它僅有一個基本對象
BASIC_STORAGE
其屬性包括
I_Index_Clause
I_Table_Clause
K_Table_Clause
N_Table_Clause
P_Table_Clause
R_Table_Clause
(
)數據存儲(Datastore)類
數據存儲
關於列中存儲文本的位置和其他信息
默認情況下
文本直接存儲到列中
表中的每行都表示一個單獨的完整文檔
其他數據存儲位置包括存儲在單獨文件中或以其 URL 標識的 Web 頁上
七個基本對象包括
Default_Datastore
Detail_Datastore
Direct_Datastore
File_Datastore
Multi_Column_Datastore
URL_Datastore
User_Datastore
(
)文檔段組(Section Group)類
文檔段組是用於指定一組文檔段的對象
必須先定義文檔段
然後才能使用索引通過 WITHIN 運算符在文檔段內進行查詢
文檔段定義為文檔段組的一部分
包含七個基本對象
AUTO_SECTION_GROUP
BASIC_SECTION_GROUP
HTML_SECTION_GROUP
NEWS_SECTION_GROUP
NULL_SECTION_GROUP
XML_SECTION_GROUP
PATH_SECTION_GROUP
(
)相關詞表(Wordlist)類
相關詞表標識用於索引的詞干和模糊匹配查詢選項的語言
只有一個基本對象BASIC_WORDLIST
其屬性有
Fuzzy_Match
Fuzzy_Numresults
Fuzzy_Score
Stemmer
Substring_Index
Wildcard_Maxterms
Prefix_Index
Prefix_Max_Length
Prefix_Min_Length
(
)索引集(Index Set)
索引集是一個或多個Oracle 索引 (不是Oracle Text索引) 的集合
用於創建 CTXCAT類型的Oracle Text索引
只有一個基本對象BASIC_INDEX_SET
(
)詞法分析器(Lexer)類
詞法分析器類標識文本使用的語言
還確定在文本中如何標識標記
默認的詞法分析器是英語或其他西歐語言
用空格
標准標點和非字母數字字符標識標記
同時禁用大小寫
包含
個基本對象
BASIC_LEXER
CHINESE_LEXER
CHINESE_VGRAM_LEXER
JAPANESE_LEXER
JAPANESE_VGRAM_LEXER
KOREAN_LEXER
KOREAN__MORPH_ LEXER
MULTI_LEXER
(
)過濾器(Filter)類
過濾器確定如何過濾文本以建立索引
可以使用過濾器對文字處理器處理的文檔
格式化的文檔
純文本和 HTML 文檔建立索引
包括
個基本對象
CHARSET_FILTER
INSO_FILTER INSO
NULL_FILTER
PROCEDURE_FILTER
USER_FILTER
(
)非索引字表(Stoplist)類
非索引字表類是用以指定一組不編入索引的單詞 (稱為非索引字)
有兩個基本對象
BASIC_STOPLIST (一種語言中的所有非索引字)
MULTI_STOPLIST (包含多種語言中的非索引字的多語言非索引字表)
查詢 建立了索引
就可以使用 SELECT 語句中的 CONTAINS 運算符發出文本查詢
使用 CONTAINS 可以進
From:http://tw.wingwit.com/Article/program/Oracle/201311/18440.html