程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫全文索引設置步驟簡介

Oracle數據庫全文索引設置步驟簡介

編輯:Oracle數據庫基礎
已有幾個項目組開始使用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天做一次全優化。具體的時間間隔,你可以根據自己的應用的需要而定。至此,你的全文檢索功能已設置完成。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved