導讀: 
  已有幾個項目組開始使用oracle的全文索引。Oracle的詞法分析器針對ZHS16GBK字元集的詞法分析尚不夠智能,只能機械地以字為單元進行匹配。對於utf8字元集的資料庫有一個新的漢語分析器chinese_lexer,效率有了很大改善。現將驗證並整理過的如何進行oracle全文索引設定的文檔發給大家,適用於8i、9i各平台版本。 
  對於DB2,有一個叫做TIE(Text Information Extend)的外掛程式可以實現全文索引,不過據說它的文法分析也很原始。據介紹使用CM(Content Manager)能做到比較好的全文檢索索引,不過需要裝一大堆的軟體,不適於簡單的應用。 
  一.建立資料庫 
  1、使用dbassist建立資料庫時要選擇jserver和intermedia兩個選項。 
  2、檢查你的資料庫是否安裝了intermedia,可以通過檢查是否有ctxsys使用者和ctxapp角色(role). 
  3、如果沒有這個使用者和角色,意味著資料庫建立時未安裝intermedia功能。必須修改資料庫以安裝這項功能。修改過程: 
  運行$ORACLE_HOME/bin/dbassist, 選擇'modify database', 然後在選擇資料庫功能時將jserver 和 intermedia 都選上(安裝intermedia必須同時安裝jserver). 
  二.設定extproc 
  Oracle 通過 ‘外部調用功能’(external procedure)來實現intermedia的,因此正確地設定extproc是關鍵一步。 一般資料庫安裝完jserver和intermedia後在listener.ora 和tnsnames.ora中已經設定了extproc。 
  
1
、測試
extproc
是否正常 
  重新啟動listener,然後,使用tnsping 來測試一下是否配置正確, 
  命令列下運行 
  tnsping extproc_connection_data 或者 
  tnsping extproc_connection_data.world 
  如果配置正確,會顯示: 
  Attempting to contact (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)) OK(140毫秒) 
  如果正確,可以跳過2、3步驟。否則請按照步驟2、3設定listener.ora 和tnsnames.ora檔案,修改後一定要重新啟動listener,但並不需要重新啟動資料庫。 
  
2、設定listerner.ora 
  如果tnsping失敗,需要配置listener 使它能監聽intermedia 調用的請求。可以通過運行$ORACLE_HOME/bin/netassit 來進行配置,也可以手工修改設定檔:$ORACLE_HOME/network/admin/listener.ora ,然後重新啟動listener。 
  下面以一個例子來講述如何手工修改設定檔: 
  開啟listener.ora檔案,在修改前,通常有如下內容(假定使用預設listener): 
  LISTENER = 
  (DESCRIPTION = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = 1521)) 
  ) 
  SID_LIST_LISTENER = 
  (SID_DESC = 
  (GLOBAL_DBNAME = mydatabase.world) 
  (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
  (SID_NAME = mydatabase) 
  ) 
  這個listener還沒有配置extproc, 因此,需要為它增加對extproc的監聽,辦法就是分別增加description 和 sid_desc. 修改後的listner.ora 如下: 
  LISTENER = 
  (DESCRIPTION_LIST = 
  (DESCRIPTION = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = MYDATABASE)(PORT = 1521)) 
  ) 
  (DESCRIPTION = 
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) 
  ) 
  ) 
  SID_LIST_LISTENER = 
  (SID_LIST = 
  (SID_DESC = 
  (GLOBAL_DBNAME = mydatabase.world) 
  (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
  (SID_NAME = mydatabase) 
  ) 
  (SID_DESC = 
  (PROGRAM = extproc) 
  (SID_NAME = PLSExtProc) 
  (ORACLE_HOME = /u01/app/oracle/product/8.1.6) 
  ) 
  ) 
  注意上面的host, global_dbname,sid_name,oracle_home應填寫你的資料庫的實際值,但program一項必須填寫extproc. 
  
3、設定tnsnames.ora 
  其次,要設定管理員端的tnsnames.ora檔案。該檔案的位置在$ORACLE_HOME/network/admin下面。同樣可以通過運行netasst來進行配置。 
  在tnsnames.ora檔案中需要增加如下一項: 
  EXTPROC_CONNECTION_DATA,EXTPROC_CONNECTION_DATA.WORLD = 
  (DESCRIPTION = 
  (ADDRESS_LIST = 
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) 
  ) 
  (CONNECT_DATA = 
  (SID = PLSExtProc) 
  ) 
  ) 
  注意其中,KEY 和SID必須與listener.ora中的key 和sid_name對應相同。 
  三.設定詞法分析器(lexer) 
  Oracle 預設使用basic_lexer這個分析器。basic_lexer針對英語。要指定使用中文分析器, 操作步驟: 
  1.用ctxsys使用者登陸intermedia text manager,口令ctxsys: 
  2.選擇喜好設定——〉語言指標——〉建立,輸入指標的名字如chinese_lexer,選擇lexer下的chinese_vgrnm_lexer。 
  3.建立intermedia索引,指定索引名,選擇方案和表下的欄位,例如system方案下的DOM_1_DOCLIB中的CURRENTTEXT欄位,喜好設定中選擇chinese_lexer。 
  這樣建立的全文檢索索引索引,就會使用chinese_vgram_lexer作為分析器。 
  4.在索引建好後,在該使用者下查到Oracle自動產生了以下幾個表,可以使用dba studio查看:(假設索引名為myindex): 
  DR$myindex$I,DR$myindex$K,DR$myindex$R,DR$myindex$N 
  其中以I表最重要,查詢該表: 
  select token_text, token_count from DR$I_RSK1$I where rownum<=20; 
  可以看到該表中儲存的是Oracle分析你的文檔後,產生的term記錄,包括term出現的位置、次數、hash值等。 
  四.使用job定時同步和最佳化 
  在intermedia索引建好後,如果表中的資料發生變化,增加或修改了記錄,由於對錶所發生的任何dml語句,都不會自動修改索引,因此,必須定時同步(sync)和最佳化(optimize)索引,以正確反映資料的變化。 
  同步(sync):將新的term 儲存到I表; 
  最佳化(optimize):清除I表的垃圾,主要是將已經被刪除的term從I表刪除。 
  Oracle提供了一個ctx server來做這個同步和最佳化的工作,只需要在後台運行這個進程,它會監視資料的變化,及時進行同步。但存在許多問題。可以用下的兩個job來完成(該job要建在和表同一個使用者下): 
  -- sync: 
  VARIABLE jobno number; 
  BEGIN 
  DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index('myindex');', 
  SYSDATE, 'SYSDATE + (1/24/4)'); 
  commit; 
  END; 
  -- optimizer 
  VARIABLE jobno number; 
  BEGIN 
  DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index('myindex','FULL');', 
  SYSDATE, 'SYSDATE + 1'); 
  commit; 
  END; 
  其中,第一個job的SYSDATE + (1/24/4)是指每隔15分鐘同步一次,第二個job的SYSDATE + 1是每隔1天做一次全最佳化。具體的時間間隔,你可以根據自己的應用的需要而定。至此,你的全文檢索索引功能已設定完成。 
本文轉自 
http://oracle.itpub.net/post/20957/224820