Oracle Text (舊稱 interMedia Text / ConText) 提供全文檢索功能。注意:針對 ZHS16GBK 字符集的內建詞法分析器 (BASIC_LEXER) 僅能以單字為單位機械匹配;UTF8 字符集資料庫可使用 CHINESE_VGRAM_LEXER (Oracle 9i+) 或 CHINESE_LEXER (10g+) 獲得更佳中文分詞效果。
CTXSYS 用戶與 CTXAPP 角色$ORACLE_HOME/bin/dbassist 選擇 Modify Database,勾選 JServer 與 InterMedia (InterMedia 依賴 JServer)Oracle Text 透過 External Procedure 機制調用外部詞法分析程式,必須正確配置 Listener 與 TNSNAMES。
# 重啟 Listener 後
tnsping extproc_connection_data
# 或
tnsping extproc_connection_data.world
成功顯示:OK (XXX msec) 即可跳過手動配置。
位置:$ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydb)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = mydb.world)
(ORACLE_HOME = /u01/app/oracle/product/9.2.0)
(SID_NAME = mydb)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/9.2.0)
)
)
重點:第二個 DESCRIPTION 使用 IPC 協定,SID_DESC 的 PROGRAM = extproc 與 SID_NAME = PLSExtProc。
位置:$ORACLE_HOME/network/admin/tnsnames.ora
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
)
)
關鍵:KEY 與 SID 必須與 listener.ora 完全一致。修改後重啟 Listener,無需重啟資料庫。
CTXSYS/CTXSYS 登入 InterMedia Text Manager (或使用 PL/SQL)Preferences → Lexer → Create
chinese_lexerCHINESE_VGRAM_LEXER (9i) 或 CHINESE_LEXER (10g+)-- 建立 Preference
EXEC CTX_DDL.CREATE_PREFERENCE('chinese_lexer', 'CHINESE_VGRAM_LEXER');
-- 建立索引 (假設表 SCOTT.DOCS, 欄位 CONTENT)
CREATE INDEX docs_idx ON scott.docs(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('LEXER chinese_lexer');
資料異動 (DML) 不會即時更新 Text 索引,需定期 SYNC (同步新詞彙) 與 OPTIMIZE (清除已刪除詞彙垃圾)。
-- 每 15 分鐘同步一次
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'CTX_DDL.SYNC_INDEX(''DOCS_IDX'');',
SYSDATE, 'SYSDATE + 1/24/4');
COMMIT;
END;
/
-- 每天凌晨完整最佳化一次
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'CTX_DDL.OPTIMIZE_INDEX(''DOCS_IDX'', ''FULL'');',
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
間隔時間可依資料變動頻率調整。Oracle 10g+ 建議改用 CTX_DDL.AUTO_OPTIMIZE 或 DBMS_SCHEDULER。
索引建立後會自動產生以下 $ 表 (以 DOCS_IDX 為例):
DR$DOCS_IDX$I:Token 索引表 (最重要,含 token_text, token_count, position 等)DR$DOCS_IDX$K:文件 ID 映射表DR$DOCS_IDX$R:Rowid 映射表DR$DOCS_IDX$N:已刪除文件追蹤表查詢 Token 範例:
SELECT token_text, token_count
FROM DR$DOCS_IDX$I
WHERE ROWNUM <= 20;
本文件適用 Oracle 8i、9i 所有平台版本。Oracle 10g/11g/12c/19c 架構相同,但詞法分析器選項更豐富,管理工具整合至 Enterprise Manager。
結語:Oracle Text 全文索引的核心在於 extproc 通訊正確、選擇適合字符集的 Lexer、建立自動化 SYNC/OPTIMIZE 機制。UTF8 環境強烈建議使用新版中文詞法分析器以獲得語意級搜尋體驗。