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

Oracle Text 全文索引建立與維護完整指南

     編輯:Oracle 資料庫基礎

前言

Oracle Text (舊稱 interMedia Text / ConText) 提供全文檢索功能。注意:針對 ZHS16GBK 字符集的內建詞法分析器 (BASIC_LEXER) 僅能以單字為單位機械匹配;UTF8 字符集資料庫可使用 CHINESE_VGRAM_LEXER (Oracle 9i+) 或 CHINESE_LEXER (10g+) 獲得更佳中文分詞效果。

一、 資料庫前置需求

  1. 建庫時選擇 JServer 與 InterMedia 兩項選項
  2. 驗證:查詢是否存在 CTXSYS 用戶與 CTXAPP 角色
  3. 若缺少,執行 $ORACLE_HOME/bin/dbassist 選擇 Modify Database,勾選 JServer 與 InterMedia (InterMedia 依賴 JServer)

二、 配置 External Procedure (extproc) - 關鍵步驟

Oracle Text 透過 External Procedure 機制調用外部詞法分析程式,必須正確配置 Listener 與 TNSNAMES。

1. 測試現有配置

# 重啟 Listener 後
tnsping extproc_connection_data
# 或
tnsping extproc_connection_data.world

成功顯示:OK (XXX msec) 即可跳過手動配置。

2. 手動配置 listener.ora

位置:$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。

3. 手動配置 tnsnames.ora

位置:$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,無需重啟資料庫。

三、 設定中文詞法分析器

  1. 以 CTXSYS/CTXSYS 登入 InterMedia Text Manager (或使用 PL/SQL)
  2. 建立 Preference:Preferences → Lexer → Create
    • 名稱:chinese_lexer
    • 類型:CHINESE_VGRAM_LEXER (9i) 或 CHINESE_LEXER (10g+)
  3. 建立索引時指定該 Preference

PL/SQL 等效指令

-- 建立 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 (清除已刪除詞彙垃圾)。

使用 DBMS_JOB 排程 (建立於表擁有者 Schema 下)

-- 每 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 環境強烈建議使用新版中文詞法分析器以獲得語意級搜尋體驗。

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