首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 全文索引建立與中文斷詞器設定完整指南

     編輯:Oracle 資料庫基礎

前置需求:Intermedia / Oracle Text 元件

  • 建庫時勾選 JServer 與 Intermedia 選項
  • 驗證 CTXSYS 使用者與 CTXAPP 角色是否存在
  • 若缺漏,以 DBCA 修改資料庫加入上述元件

Extproc 外部程序設定

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;
/

建立 Context 索引

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;
/

間隔視資料變動頻率調整。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved