天天看點

Oracle自帶全文索引

使用場景:

當需要在大量文章中通過關鍵字搜尋文章時,Oracle自帶的全文索引對于提高搜尋性能非常有幫助,并且使用也很友善。

使用前的準備工作:

1、先檢視oracle是否自帶有ctxsys使用者,如果沒有該使用者則不能使用全文索引功能,必須先手動安裝,安裝方式很簡單,參考下一步;

2、如果自帶有ctxsys使用者,請忽略該步驟;

(1)dba賬号登入SQLPLUS,建立全文索引使用的表空間;

create tablespace textidx datafile '/oradata/textidx/ctxsys.dbf size 10240M autoextend on next 32M maxsize 20480M;

(2)執行oracle自帶的腳本:$ORACLE_HOME/ctx/admin/catctx.sql

@?/ctx/admin/catctx.sql ctxsystextidx temp nolock

第一個參數ctxsys為ctxsys使用者的密碼;

第二個參數textidx 為ctxsys使用者要使用的表空間;

第三個參數temp為ctxsys使用者使用的臨時表空間;

第四個參數nolock為ctxsys使用者處于解鎖狀态。

(3)用ctxsys賬号登入并執行腳本

             connect ctxsys/ctxsys

    執行以下腳本:@?/ctx/admin/defaults/drdefus.sql

正式開始使用全文索引:

1、先授予使用者權限,例如:user使用者需要執行全文索引;

grant execute on ctxsys.ctx_ddl to user with grant option;

2、設定詞法分析器

exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');

第一個參數:詞法分析器的名稱,可自行命名;

第二個參數:詞法分析器的類型,主要有如下幾種類型:

basic_lexer:主要針對英文;

chinese_vgram_lexer:專門用于漢語,支援所有的漢語編碼,缺點是機械拆分,

例如:我是程式猿,會被拆分為:我、我是、程式、序猿、是程;

chinese_lexer:新版的漢語分析器,隻能用UTF-8的編碼,比上面一種更智能,效率更高;

例如:我是程式猿,會被拆分為:我、程式猿;

3、給相應字段建立全文索引,和普通索引一樣;

CREATE INDEX content_textidx ON tableName(columnName) indextype is ctxsys.context parameters('lexer my_lexer sync(on commit)'); 

參數lexer: 指定自己使用的詞法分析器;

參數sync(on commit): 表示在索引所在的表更新資料的時候就自動更新全文索引庫;

4、如果需要給一張表的多個字段一起增加全文索引,例如:搜尋一篇文章和标題字段包含‘shadon’字元的所有資訊,如果給文章增加了多字段的全文索引,可以直接坐到這一點;

在有ctx_ddl執行權限的使用者下執行如下腳本:

exec ctx_ddl.create_preference('content_textidx_pref','MULTI_COLUMN_DATASTORE');

exec ctx_ddl.set_attribute(' content_textidx_pref','columns','content,title'); // content和title為表的字段名稱,表示為哪些字段建立多字段全文索引;

建立索引:

CREATE INDEX content_textidx ON tableName(columnName) 

INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('DATASTORE ctxsys.content_textidx_pref lexer my_lexer sync(on commit)')

注意:多字段全文索引有一個非常大的弊端,就是當title字段更新時,無法同步更新全文索引;但是content字段更新時,會自動更新全文索引。

目前我的做法是通過增加一僞列,這一列包含title和content字段的内容,如果更新title和content的内容,同時更新僞列的内容,并且‘多字段的全文索引’增加到這個僞列上;

全文索引的優化:

同步: 将資料的更新立即同步到全文索引的資訊資料表中(如果有時候根據關鍵字查詢不到資料,可以先同步一下。);

腳本:exec  ctx_ddl.sync_index ('indexName');

優化: 由于表中的資料會經常更新、删除,而全文索引的資訊表不會立即删除,這就需要我們定時的去執行如下腳本。

腳本:exec  ctx_ddl.optimize_index('indexName','FULL');

注意事項:

(1)如果前面建立全文索引的時候帶上了參數“sync(on commit)”,則同步不需要手工去執行,當資料變動時,會自動進行同步操作;

(2)優化操作一定要放在Job中定時來執行,可以根據資料變動的頻率自行決定優化腳本的更新頻率;