Oracle Text 提供強大的全文檢索能力,支援多語言、模糊比對、評分排序等進階功能。本文提供完整的 C# 範例,涵蓋授權、建表、建索引、查詢、同步與優化全流程。
-- 1. 授予 CTXAPP 角色
GRANT CTXAPP TO scott;
-- 2. 授予 CTX_DDL 套件執行權限
GRANT EXECUTE ON CTX_DDL TO scott;
執行全文檢索的使用者必須具備上述權限,否則會遇到 ORA-20000: Oracle Text error: DRG-10599。
DROP TABLE docs;
CREATE TABLE docs (
id NUMBER PRIMARY KEY,
text VARCHAR2(80)
);
INSERT INTO docs VALUES (1, 'the first doc');
INSERT INTO docs VALUES (2, 'the second doc');
COMMIT;
-- 建立 CONTEXT 索引(預設詞彙分析器)
CREATE INDEX doc_index ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;
索引建立後,Oracle 自動產生四張內部表:DR$DOC_INDEX$I(倒排索引)、$K、$N、$R。
using System;
using System.Data;
using Oracle.DataAccess.Client; // ODP.NET
namespace OracleTextDemo
{
class Program
{
static void Main()
{
string connStr = "Data Source=ora9;User Id=scott;Password=tiger;Unicode=True";
string sqlStr = "SELECT id FROM docs WHERE CONTAINS(text, '%FIRST%') > 0";
using (var conn = new OracleConnection(connStr))
using (var cmd = new OracleCommand(sqlStr, conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
Console.WriteLine("找到文件 ID: " + reader.GetInt32(0));
}
}
}
}
}
關鍵點: CONTAINS 回傳分數,必須用 > 0 判斷是否命中(Oracle 不支援布林回傳)。
資料異動(INSERT/UPDATE/DELETE)後,索引不會即時更新,需手動或排程同步。
CREATE OR REPLACE PROCEDURE sync_idx IS
BEGIN
-- 同步:將新詞彙寫入 $I 表
CTX_DDL.SYNC_INDEX('doc_index', '2M'); -- 2MB 記憶體上限
END;
/
CREATE OR REPLACE PROCEDURE optimize_idx IS
BEGIN
-- 完整優化:合併片段、移除已刪除詞彙
CTX_DDL.OPTIMIZE_INDEX('doc_index', 'FULL', NULL, TRUE);
END;
/
DECLARE
v_job NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
job => v_job,
what => 'BEGIN sync_idx; optimize_idx; END;',
next_date => SYSDATE,
interval => 'SYSDATE + 1/720' -- 1天/720 = 2分鐘
);
COMMIT;
END;
/
| 特性 | 9i/10g | 11g+ |
|---|---|---|
萬用字元 % | 需明確加上(%FIRST%) | 可省略,預設模糊比對 |
| 多條件 AND | CONTAINS(text, '%A% AND %B%') > 0 | 需拆分:CONTAINS(text, '%A%')>0 AND CONTAINS(text, '%B%')>0 |
| 評分函數 | SCORE(1) | 同,但支援更多排序選項 |
升級 11g 時務必重測所有全文查詢邏輯。
Oracle Text 為企業級全文檢索提供零成本、高整合度方案。掌握 CTX_DDL.SYNC_INDEX / OPTIMIZE_INDEX 維護機制,並注意版本差異,即可穩定支援百萬級文件檢索需求。