ORACLE TEXT全文検索


ORACLEバージョン10.0.2
データベース関連情報の表示select*from nls_database_parameters
1、簡単な応用
1.1全文検索を使用する場合、現在のORACLEユーザーはCTXAPPの役割を持つ必要がある

--      
--create user textsearch identified by textsearch;
/**
        ,      CTXAPP  ,
                 PROCEDURE
*/
grant connect,resource,ctxapp to textsearch;
/

作成したユーザーを使用してログイン
SQL> conn textsearch
パスワード入力:******
接続されています.
1.2全文検索を行うデータテーブルを作成し、データを準備する

    --drop table textdemo;
    create table textdemo(
        id number not null primary key,
        book_author varchar2(20),--  
        publish_time date,--    
        title varchar2(400),--  
        book_abstract varchar2(2000),--  
        path varchar2(200)--  
    );
    commit;

    insert into textdemo values(1,'   ',to_date('2008-10-07','yyyy-mm-dd'),'    ','     19      ,                 , 18      90    ,                  ,                  ,                ,              ,                      ,        、                ','E:\textsearch\moveingcastle.doc');

    insert into textdemo values(2,' ·      ',to_date('2008-10-07','yyyy-mm-dd'),'    ','          ·            6         ,          3        。             、           。                        ,                       ,                。','E:\textsearch\catch.pdf');

    insert into textdemo values(3,'  ',to_date('2008-10-07','yyyy-mm-dd'),'          ','  《  》        ,          。       ,          fans   ,              ,          ,                ,      。','E:\textsearch\dream.txt');

    commit;

1.3要約フィールドに索引を作成する

/*
*    ,       
*/
   --drop index demo_abstract;
    create index demo_abstract on textdemo(book_abstract)
    indextype is ctxsys.context
    --parameters('datastore ctxsys.default_datastore filter ctxsys.auto_filter ')
    ;
    commit;
;
関連する4つのテーブルが作成されます
DR$DEMO_ABSTRACT$I(分詞後のTOKEN表)DR$DEMO_ABSTRACT$K\DR$DEMO_ABSTRACT$N\DR$DEMO_ABSTRACT$R
インデックス作成中にエラーが発生したかどうかを確認

SELECT * FROM ctx_USER_index_errors 

1.4クエリーのテスト

select score(20),t.* from textdemo t where contains(book_abstract,'     or    ',20)>0;

select score(20),t.* from textdemo t where contains(book_abstract,'     or    ',20)>0 and t.title like '  %';

1.5インデックス・スクリプトの表示
select ctx_report.create_index_script('file_index') from dual;
2.外部ファイルの全文検索
ORACLE TEXTはファイルシステムの中のファイルを検索することができて、大部分のファイルフォーマット(例えば:OFFICE、PDFなど)をサポートして、異なるフォーマットORACLE TEXTは異なるを選択します
FILTERは、単一のテキスト型COLUMNにインデックスを作成するように、バイナリファイルの純粋なテキストを抽出し、仮想DOCUMENTを生成します.これらはすべてORACLE TEXT自身が完成した.
上の表textdemoのデータを使用してpathにインデックスを作成します

begin
  --ctx_ddl.drop_preference('my_filter');
  ctx_ddl.create_preference('my_filter','auto_filter');
end;
/
begin
  --ctx_ddl.drop_preference('my_store');
  ctx_ddl.create_preference('my_store','file_datastore');
  /*
  --       ,               
          ,               ,
         ,           ,     
      WINDOWS  ";"  ,UNIX ":",
    :                ,       
          .
  ctx_ddl.set_attribute('mystore','path','E:\demo;E:\textsearch');
  */
  --ctx_ddl.set_attribute('mystore','path','E:\demo');
end;
/
begin
  --ctx_ddl.drop_preference('my_lexer');
  ctx_ddl.create_preference('my_lexer','chinese_lexer');
end;

/

--drop index demo_path;
create index demo_path on textdemo(path)
indextype is ctxsys.context
parameters('
          datastore my_store
          filter my_filter
          lexer my_lexer
');

commit;


2.1クエリー

select score(20),t.* from textdemo t where contains(path,'   and   ',20)>0

--      book_abstract        
select score(5),score(20),t.* from textdemo t where contains(book_abstract,'  ',5)>0 AND contains(path,'    and     ',20)>0

2.2インデックスのサイズ情報の表示
select ctx_report.index_size('demo_path') from dual
2.3同期インデックス
インデックス異常はCTX_からUSER_INDEX_ERRORSビュートレース.
データベースは、インデックス列の変更に基づいてドキュメントの変更を追跡し、ORACLE TEXTに特定のドキュメントのインデックスの再作成を強制する場合は、対応する行のインデックスフィールドを更新します.
update textdemo set path=path where id = 4;
インデックスの同期時にID=4ファイルのキーワードが更新されます.

--update textdemo set path='E:\textsearch\dream.txt' where id=3;
update textdemo set path='E:\textsearch\catch.pdf' where id=2;
--update textdemo set path='E:\textsearch\movingcastle.doc' where id=1;
commit;
begin
/*
      ,     
*/
ctx_ddl.sync_index('demo_path','20M') ;
end;

3カスタムストレージ・プロシージャの使用
USER_DATASTORE:インデックスを合成するときにユーザーが指定したストレージ・プロシージャを使用する
ATTRIBTES:
Procedure:インデックステキストを合成するストレージ・プロシージャを示します.最初のパラメータはROWIDでなければなりません.ストレージ・プロシージャが変更された後、インデックスを再構築する必要があります.
インデックスは、指定されたフィールドでのみ変更または追加され、同期インデックスが機能します.
output_type:ストアド・プロシージャの2番目のパラメータを指定するデータ型(CLOB,CLOB_LOC,BLOB_LOC,VARCHR 2)のデフォルトはCLOB,
CLOB_として指定した場合LOC,BLOB_LOCでは、PROCEDUREが2番目のIN/OUTパラメータにlocatorをコピーするため、一時的なCLOBまたはBLOBが明るくなる必要はないことを示します.
/*
カスタムストレージ・プロシージャの作成
*/
create or replace procedure myproc(rid in rowid,tlob in out clob nocopy)
is
begin
for c1 in (select author,title,text from articles where rowid = rid)
loop
dbms_lob.writeappend(tlob,length(c1.title),c1.title);
dbms_lob.writeappend(tlob,length(c1.author),c1.author);
dbms_lob.writeappend(tlob,length(c1.text),c1.text);
end loop;
end;
/*
データの保存形式を特定し、カスタムストレージ・プロシージャを使用する
*/
begin
ctx_ddl.create_preference('myud','user_datastore');
ctx_ddl.set_attribute('myud','procedure','myproc');
ctx_ddl.set_attribute('myud','output_type','clob');
end;
インデックスを作成する場合、PARAMETERS('DATASTORE MYUD')を変更する以外は変更する必要はありません.