CTXSYS 使用者與 CTXAPP 角色是否存在Oracle Text 仰賴 extproc 執行外部斷詞器。驗證方式:
tnsping extproc_connection_data -- 成功顯示:OK (xxx msec)
失敗時需修正 listener.ora 與 tnsnames.ora:
-- listener.ora 新增
(DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)))
(SID_DESC = (PROGRAM = extproc)(SID_NAME = PLSExtProc)(ORACLE_HOME = ...))
-- tnsnames.ora 新增
EXTPROC_CONNECTION_DATA =
(DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
(CONNECT_DATA = (SID = PLSExtProc)))
修改後 lsnrctl reload 即可,無需重啟資料庫。
BASIC_LEXER:預設,針對英文,中文僅以單字元匹配CHINESE_VGRAM_LEXER:支援 UTF8 字元集,採 N-gram 斷詞,效能與準確度較佳建立 Preference:
-- 以 CTXSYS 登入
BEGIN
CTX_DDL.CREATE_PREFERENCE('chinese_lexer', 'CHINESE_VGRAM_LEXER');
END;
/
CREATE INDEX idx_doc_content ON doc_lib(content)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('LEXER chinese_lexer');
索引建立後系統自動產生 DR$idx_doc_content$I/K/R/N 四張表,其中 $I 存放 Token 與位置資訊。
DML 不會即時更新全文索引,需定期 SYNC(寫入新 Token)與 OPTIMIZE(清除已刪 Token)。建議使用 DBMS_JOB 排程:
-- 每 15 分鐘同步一次
VARIABLE j NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:j, 'CTX_DDL.SYNC_INDEX(''idx_doc_content'');',
SYSDATE, 'SYSDATE + 1/24/4');
COMMIT;
END;
/
-- 每天完整優化一次
BEGIN
DBMS_JOB.SUBMIT(:j, 'CTX_DDL.OPTIMIZE_INDEX(''idx_doc_content'',''FULL'');',
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
間隔視資料變動頻率調整。