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