Oracle Textには、対象フィールド値をテキスト文章と見なす以外にファイル実体パスとして扱う(FILE_DATASTORE)など幾つかのデータストア型が存在する。
その中からフィールド値をURLとして対象ページをテキスト文章として見なすURL_DATASTOREについて。
プリファレンスの設定
前準備として、プリファレンスの設定を行う。
(そもそも標準で準備してほしいのだけど)
データストア。
begin
ctx_ddl.create_preference('url_pref','URL_DATASTORE');
end;
/
日本語用レクサー(解析エンジン)。
begin
ctx_ddl.create_preference('jvl','JAPANESE_VGRAM_LEXER');
end;
/
文字コード。
Begin
ctx_ddl.create_preference('cs_filter_utf8','CHARSET_FILTER');
ctx_ddl.set_attribute('cs_filter_utf8','charset','UTF8');
end;
/
インデックスの表領域設定
表領域が "ZENBUN_TS" の場合。
sql
begin
ctx_ddl.create_preference('zenbun_storage','BASIC_STORAGE');
ctx_ddl.set_attribute('zenbun_storage','I_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','K_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','R_TABLE_CLAUSE','tablespace ZENBUN_TS LOB(DATA) STORE AS (CACHE)');
ctx_ddl.set_attribute('zenbun_storage','N_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','I_INDEX_CLAUSE','tablespace ZENBUN_TS COMPRESS 2');
end;
/
インデックス作成(空インデックス)
HOGE_TABLE.URL_HOGE に空インデックスを張る。
- 空のインデックスを張るので、"nopopulate" を設定。未設定時はインデックス実体作成が同時に行われる。
- 対象データコミット時、インデックス作成を行いたいので、"SYNC (ON COMMIT)" を設定。
create index url_hoge_index on HOGE_TABLE ( URL_HOGE )
indextype is ctxsys.context parameters ( 'STORAGE zenbun_storage Datastore url_pref filter cs_filter_utf8 lexer jvl nopopulate SYNC (ON COMMIT)' );
インデックス作成を手動にしたい場合は以下を発行。
ALTER INDEX url_hoge_index REBUILD PARAMETERS ('REPLACE METADATA SYNC (MANUAL)');
インデックス作成(非同期)
"SYNC (ON COMMIT)" によるリアルタイムのインデックス作成は負荷が大きいので、場合によっては以下SQLを非同期実行する。
CALL CTX_DDL.SYNC_INDEX('url_hoge_index')
インデックス最適化
以下SQL結果を目安に単語テーブルの最適化度合いを測る。
-- 単語テーブル総数
SELECT COUNT(*) CNT FROM DR$URL_HOGE_INDEX$I;
-- 最適化度合い(単語の重複度合い。10未満が目安)
SELECT TO_CHAR(AVG(COUNT(*))) CNT FROM DR$URL_HOGE_INDEX$I GROUP BY TOKEN_TEXT HAVING COUNT(*) > 1;
最適化処理は以下SQL。
定期的にインデックス作成をしているのならば、都度行ったほうがよさげ。
CALL CTX_DDL.OPTIMIZE_INDEX('url_hoge_index','FULL',MAXTIME=> [最大実行時間(分)])