hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

Viewを使用してのOracle Textでの全文検索

Namazuなどを使わずに、全文検索的なことをしなくてはならないことがあり、
Oracleでマテビューを使ってOracleTextでの全文検索を試してみました。
そのときの、検索を行うまでの手順をまとめてみました。

Oracle Textが使用できるかを確認

SQL> SELECT COMP_NAME,STATUS,substr(VERSION,1,10) AS VER FROM DBA_REGISTRY WHERE COMP_ID = 'CONTEXT';

COMP_NAME STATUS VER
 ------------ ------ -----------
Oracle Text VALID 10.2.0.2.0

検索対象のViewの作成

全文検索検索用としてダミーの項目を作成する。
インデックスを作成する必要があるので、「MATERIALIZED VIEW」で作成する。

CREATE MATERIALIZED VIEW TEST_VIEW AS
SELECT 
  ID,
  NAME,
  TEXT,
  DETAIL,
  ' ' AS DUMMY_TEXT -- -> 全文検索検索用ダミー項目
FROM
  TEST_TABLE
WHERE
  STATUS='0';

プリファレンスの作成

プリファレンス名「test_lexer」日本語での検索「JAPANESE_LEXER」の場合。

複数項目を検索対象とする場合は、MULTI_COLUMN_DATASTOREを指定する必要がある。
このMULTI_COLUMN_DATASTORE型のプリファレンスを作成できるのは、「CTXSYS」ユーザーだけ。

 --ctxsysで接続
SQL> conn ctxsys/ctxsys_password

 --MULTI_COLUMN_DATASTOREの指定
SQL> execute CTX_DDL.CREATE_PREFERENCE('multi_item', 'MULTI_COLUMN_DATASTORE');

 --NAME、TEXT,DETAILを検索項目として指定。
SQL> execute CTX_DDL.SET_ATTRIBUTE('multi_item', 'columns', 'NAME、TEXT,DETAIL');

 --test_lexerの作成。JAPANESE_LEXERを指定。
SQL> execute ctx_ddl.create_preference('test_lexer', 'JAPANESE_LEXER'); 

全文検索用インデックスの作成

「create index」で検索用のインデックスを作成する。

 --インデックスの作成
CREATE INDEX TEST_VIEW_IDX on TEST_VIEW(DUMMY_TEXT)
    INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS('datastore multi_item lexer test_lexer');

実際に検索してみる。

単一のキーワードの場合

SELECT * FROM TEST_VIEW WHERE CONTAINS(DUMMY_TEXT,'ほげほげ') > 0;

複数のキーワードでの絞り込み(AND)の場合

SELECT * FROM TEST_VIEW WHERE CONTAINS(DUMMY_TEXT,'ほげほげ') > 0 AND CONTAINS(DUMMY_TEXT,'Foo') > 0;

複数のキーワードでの検索(OR)の場合

SELECT * FROM TEST_VIEW WHERE CONTAINS(DUMMY_TEXT,'ほげほげ') > 0 OR CONTAINS(DUMMY_TEXT,'Foo') > 0;


検索速度も速いので、良い感じです。
インデックスの再作成とかは、まだやっていないのであとで調べてみます。

参考にしたページ

今回、以下のサイトを参考にさせていただきました。

rough justice - Oracle Textで全文検索
http://www.esco-sb.jp/blog/roughjustice/archives/2008/04/oracle_text.php

bnote - Oracle全文検索[Oracle Text]
http://www.bnote.net/oracle/oracletext.shtml