Oracleで全文検索[Oracle Text]

メモ:

Oracle9iで全文検索が行えるよう環境を構築します。ここでは、主にOracle Textの使い方を確認していきます。

環境:Oracle9i[Release 9.2.0.1.0]

Oracleで全文検索に必要だった設定等

  1. Oracle Text
  2. データベースのキャラクタセットをJA16SJIS、JA16EUC、UTF8のいずれかで作成する。
  3. 対象となるテーブルにダミー項目を追加する。(微妙)

Oracle全文検索環境構築

日本語のテキストからトークンを抽出するには、レクサーにJAPANESE_VGRAM_LEXERまたは、APANESE_LEXERを指定します。この場合、Oracle9iでは、キャラクタセットがJA16SJIS、JA16EUC、UTF8のいずれかである必要があるので、DataBaseをUTF8で再構築しました。

今回は、puccaというユーザーを作り次のようなテーブルを作成します。

CREATE TABLE ITS
(
    ID                         NUMBER(10,0) NOT NULL,
    PLAN_START_DATE                VARCHAR2(8),
    PLAN_COMP_DATE                 VARCHAR2(8),
    PRIORITY                       VARCHAR2(12),
    TASK                           VARCHAR2(1000) NOT NULL,
    MEASURE                        VARCHAR2(1000),
    REMARKS                        VARCHAR2(128),
    REFERENCE                      VARCHAR2(128),
    DMY                            CHAR(1),
	CONSTRAINT PK_ITS PRIMARY KEY (ID) USING INDEX
)

複数項目を対象とするには、テキストの格納方法にMULTI_COLUMN_DATASTOREを指定する必要があります。このMULTI_COLUMN_DATASTORE型のプリファレンスを作成できるのは、CTXSYSユーザのみのためCTXSYSユーザで接続し、全文検索に関わる属性を設定します。

BEGIN
    CTX_DDL.CREATE_PREFERENCE('multi_item', 'MULTI_COLUMN_DATASTORE');
    CTX_DDL.SET_ATTRIBUTE('multi_item', 'columns', 'TASK,MEASURE,REMARKS');
    CTX_DDL.CREATE_PREFERENCE('japan_lexer', 'JAPANESE_LEXER');
END;

上記例では、TASK,MEASURE,REMARKSの3つの項目を対象としています。

次に索引を作成します。

CREATE INDEX
pucca.ITS_IDX on pucca.ITS(DMY)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS('datastore multi_item lexer japan_lexer');

以上で設定が完了します。

索引の同期化と最適化

Oracle Textでは、索引として何らかのトークンに分けて格納されます。しかし、テーブルにINSERTしただけでは、索引が作成されないようです。

索引を作成するには、索引の同期化を行います。

BEGIN
    -- 引数にINDEX名を指定
    CTX_DDL.SYNC_INDEX('ITS_IDX');
END;

索引が作成されたかは、次のSELECT文で確認することができます。テーブル名は、DR$インデックス名$Iになっています。

select token_text from DR$ITS_IDX$I;


TOKEN_TEXT
-----------
システム
点
の
作成
管理
資料

INSERTと同様にUPDATEやDELETEを行っても上記トークン表は更新されません。そこで、変更を反映させるために索引の最適化を行います。

BEGIN
    CTX_DDL.OPTIMIZE_INDEX('ITS_IDX','FULL');
END;

索引の最適化には、3つの方法があり第二引数に次のいずれかを指定します。 - 完全(FULL) - 高速(FAST) - トークン(TOKEN)

更新と検索

更新を行う場合、ダミー項目(DMY)を更新しないと索引の同期処理を行っても索引が更新されません。

テーブルから検索を行う場合、WHERE句でCONTAINS演算子を使用します。

SELECT * FROM ITS WHERE CONTAINS(DMY,'資料') > 0

以上で全文検索が使えるようになりました。