2 Oracle Textの使用の開始

Oracle Text開発者ユーザー・アカウントを作成し、単純なテキスト問合せおよびカタログ・アプリケーションを構築できます。

この章のトピックは、次のとおりです:

2.1 Oracle Textの使用の開始の概要

この章では、Oracle Textの構成方法、Oracle Text開発者ユーザー・アカウントの作成方法、および単純なテキスト問合せアプリケーションとカタログ・アプリケーションの作成方法の基本情報を提供します。また、各アプリケーション・タイプで表のロード、索引付けおよび問合せに使用する基本的なSQL文の情報も提供します。

詳細なアプリケーションの例は、付録に記載されています。

ノート:

この章では、読みやすさと、テキストの切取りおよび貼付けの便宜のために、SQL>プロンプトを省略しています。

関連項目:

ドキュメント分類アプリケーションの作成方法の詳細は、Oracle Textでのドキュメントの分類を参照してください。

2.2 Oracle Textユーザーの作成

Oracle Text索引を作成して、Oracle Text PL/SQLパッケージを使用する前に、CTXAPPロールを持つユーザーを作成する必要があります。このロールを使用すると、次の操作を実行できます。

  • Oracle Textの索引プリファレンスの作成および削除

  • Oracle TextのPL/SQLパッケージの使用

Oracle Textアプリケーション開発者ユーザーを作成するには、システム管理者ユーザーとして次のステップを実行します。

  1. ユーザーの作成

    次のSQL文で、パスワードpasswordを持つ、MYUSERというユーザーを作成します。

    CREATE USER myuser IDENTIFIED BY password;
    
  2. ユーザーへのロールの付与

    次のSQL文で、必要なロールRESOURCECONNECTおよびCTXAPPMYUSERに付与します。

    GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;
    
  3. CTX PL/SQLパッケージのEXECUTE権限の付与

    Oracle Textには、Oracle Text索引の同期化からドキュメントのハイライト表示までを実行できる複数のパッケージが組み込まれています。たとえば、CTX_DDLパッケージには、索引を同期化できるSYNC_INDEXプロシージャがあります。これらのパッケージについては、『Oracle Textリファレンス』を参照してください。

    これらのプロシージャをストアド・プロシージャからコールする場合、アプリケーションではパッケージの実行権限が必要です。たとえば、MYUSERにすべてのOracle Textパッケージのexecute権限を付与するには、次のSQL文を入力します。

    GRANT EXECUTE ON CTXSYS.CTX_CLS TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DDL TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DOC TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_QUERY TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_REPORT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_THES TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO myuser;

    ノート:

    これらの権限はCTXAPPロールに付与されます。ただし、ロール権限がPL/SQLプロシージャで常に有効ではないため、これらの権限をCTXAPPロールを持つユーザーに明示的に付与すると最も安全です。

2.3 問合せアプリケーションのクイック・ツアー

基本的なテキスト問合せアプリケーションでは、ユーザーが問合せワードまたは句を入力すると、アプリケーションは、問合せに最も一致するドキュメントのリストを戻します。このようなアプリケーションでは、CONTEXT索引が作成され、CONTAINSを使用してこの索引の問合せが行われます。

通常は、問合せアプリケーションにはユーザー・インタフェースが必要です。CONTEXT索引タイプを使用してこのような問合せアプリケーションを作成する方法の例は、「CONTEXT問合せアプリケーション」を参照してください。

ここに示された例では、テキスト表へのロード、ドキュメントの索引付けおよび索引の問合せのための基本SQL文を提供します。

2.3.1 テキスト表の作成

表を作成して表にドキュメントをロードするには、次のステップを実行します。

  1. 新規ユーザーとして接続

    表を作成する前に、ユーザーのIDが作成されていることを前提とします。

    CONNECT myuser;
    
  2. テキスト表の作成

    次の例では、CREATE TABLE文を使用して、id列およびtext列を持つdocsという表を作成します。この例では、id列を主キーとしています。text列は、VARCHAR2です。

    CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));

    ノート:

    サポートされる主キーの型は、NUMBER、VARCHAR2、DATE、CHAR、VARCHARおよびRAWです

  3. ドキュメントの表へのロード

    SQLのINSERT文を使用して、テキストを表にロードします。

    docs表への移入には、INSERT文を使用します。

    INSERT INTO docs VALUES(1, '<HTML>California is a state in the US.</HTML>');
    INSERT INTO docs VALUES(2, '<HTML>Paris is a city in France.</HTML>');
    INSERT INTO docs VALUES(3, '<HTML>France is in Europe.</HTML>');

2.3.2 SQL*Loaderを使用した表へのロード

SQL*Loaderを使用して、バッチで表をロードできます。

次のステップを実行して、SQL*Loaderで表へのロードをバッチで実行します。

  1. CONTEXT索引の作成

    HTMLファイルを索引付けするには、次のようにCONTEXT索引をテキスト列に作成します。HTMLの索引付けであるため、この例では、フィルタ処理が不要なNULL_FILTERプリファレンス型とHTML_SECTION_GROUP型を使用します。PDF、Microsoft Wordまたはその他の書式設定されたドキュメントを索引付けする場合は、FILTERプリファレンスとしてCTXSYS.AUTO_FILTER(デフォルト)を使用します。

    CREATE INDEX idx_docs ON docs(text)
         INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
         ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');
    

    この例では、HTMLドキュメントの索引付けに推奨されているHTML_SECTION_GROUPセクション・グループも使用します。HTML_SECTION_GROUPを使用すると、特定のHTMLタグ内を検索して、フォント情報などの不要なマークアップを索引から削除できます。

  2. CONTAINSの使用による表の問い合せ

    まず、読みやすいように、SELECT文の出力書式を設定します。text列の幅を40文字にします。

    COLUMN text FORMAT a40;
    

    次に、SELECT文をCONTAINSとともに使用して表を問い合せます。この問合せでは、問合せを満たすドキュメントIDが取得されます。次の問合せは、ワードFranceを含むドキュメントをすべて検索します。

    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;
    
      SCORE(1)         ID TEXT
    ---------- ---------- ----------------------------------------
             4          3 <HTML>France is in Europe.</HTML>
             4          2 <HTML>Paris is a city in France.</HTML>
  3. ドキュメントの表示

    実際のアプリケーションでは、選択したドキュメントを、問合せの語句がハイライト表示された状態で表示する場合があります。Oracle Textを使用すると、CTX_DOCパッケージによってドキュメントをマークアップできます。

    SQL*Plusの無名PL/SQLブロックを使用して、HTMLドキュメントのマークアップを表示できます。ただし、実際のアプリケーションでは、ドキュメントをブラウザで表示する場合があります。

    このPL/SQLの例では、CTX_DOC.MARKUPのインメモリー・バージョンを使用して、ドキュメント3のワードFranceをハイライト表示します。マークアップ・テキストを格納するために一時CLOB (キャラクタ・ラージ・オブジェクト・データ型)が割り当てられ、標準出力に戻されます。終了前に、CLOBの割当てが解除されます。

    SET SERVEROUTPUT ON;
    DECLARE
      2  mklob CLOB;
      3  amt NUMBER := 40;
      4  line VARCHAR2(80);
      5  BEGIN
      6    CTX_DOC.MARKUP('idx_docs','3','France', mklob);
      7    DBMS_LOB.READ(mklob, amt, 1, line);
      8    DBMS_OUTPUT.PUT_LINE('FIRST 40 CHARS ARE:'||line);
      9    DBMS_LOB.FREETEMPORARY(mklob);
     10    END;
     11  /
    FIRST 40 CHARS ARE:<HTML><<<France>>> is in Europe.</HTML>
    
    PL/SQL procedure successfully completed.
  4. データ操作後の索引の同期化

    CONTEXT索引を作成する場合、索引を明示的に同期化して、テキスト表に対する挿入、更新または削除にあわせて索引を更新します。

    Oracle Textでは、CTX_DDL.SYNC_INDEXプロシージャを使用して索引を同期化できます。

    docs表に行を追加します。

    INSERT INTO docs VALUES(4, '<HTML>Los Angeles is a city in California.</HTML>');
    INSERT INTO docs VALUES(5, '<HTML>Mexico City is big.</HTML>');
    

    索引は同期化されていないため、これらの新しい行は、cityを問い合せても戻りません。

    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;
    
      SCORE(1)         ID TEXT
    ---------- ---------- --------------------------------------------------
             4          2 <HTML>Paris is a city in France.</HTML>
    

    したがって、2MBのメモリーを使用して索引を同期化し、問合せを再実行します。

    EXEC CTX_DDL.SYNC_INDEX('idx_docs', '2M');
    
    PL/SQL procedure successfully completed.
    
    COLUMN text FORMAT a50;
    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;
    
      SCORE(1)         ID TEXT
    ---------- ---------- --------------------------------------------------
             4          5 <HTML>Mexico City is big.</HTML>
             4          4 <HTML>Los Angeles is a city in California.</HTML>
             4          2 <HTML>Paris is a city in France.</HTML>

    関連項目:

    SQL*Loaderを使用したデータ・ファイルからテキスト表へのロード方法の例は、PSP Webアプリケーションの作成を参照してください

2.4 カタログ・アプリケーションのクイック・ツアー

ここに示された例では、カメラやCDプレーヤなどの電子機器を販売するオークション・サイトのカタログ索引を作成するための基本SQL文を提供します。毎日新しい在庫が追加され、品目の説明、入札日および価格をまとめて格納する必要があります。

アプリケーションは、複合問合せに対して適切な時間で応答する必要があります。適切なCTXCAT索引を作成するには、ユーザーが頻繁に検索する列を決定することが重要です。このタイプの索引の問合せは、CATSEARCH演算子を使用します。

ノート:

通常は、問合せアプリケーションにはユーザー・インタフェースが必要です。CATSEARCH索引タイプを使用してこのような問合せアプリケーションを作成する方法の例は、「CATSEARCH問合せアプリケーション」を参照してください。

2.4.1 表の作成

表を作成およびロードするには、次のステップを実行します。

  1. 適切なユーザーとして接続

    CTXAPPロールを持つmyuserとして接続します。

    CONNECT myuser;
    
  2. 表の作成

    在庫を格納するAuction表を設定します。

    CREATE TABLE auction(
    item_id NUMBER,
    title VARCHAR2(100),
    category_id NUMBER,
    price NUMBER,
    bid_close DATE);
    
  3. 表への移入

    id、title、priceおよびbid_dateの各項目を表に移入します。

    INSERT INTO AUCTION VALUES(1, 'NIKON CAMERA', 1, 400, '24-OCT-2002');
    INSERT INTO AUCTION VALUES(2, 'OLYMPUS CAMERA', 1, 300, '25-OCT-2002');
    INSERT INTO AUCTION VALUES(3, 'PENTAX CAMERA', 1, 200, '26-OCT-2002');
    INSERT INTO AUCTION VALUES(4, 'CANON CAMERA', 1, 250, '27-OCT-2002'); 

2.4.2 SQL*Loaderを使用した表へのロード

SQL*Loaderを使用して、バッチで表をロードできます。

次のステップを実行して、SQL*Loaderで表へのロードをバッチで実行します。

  1. 問合せの判断

    検索される可能性のある基準を判断します。この例では、すべての問合せが品目の説明のタイトル列を検索し、ほとんどの問合せが価格順になっているかどうかを判断します。その後、CATSEARCH演算子を使用するときに、テキスト列の語句および構造化句の基準を指定します。

  2. 価格順に並べ替えるサブ索引の作成

    Oracle Textでこれらの問合せを効率的に満たし、価格順に並べ替えるために、価格列にサブ索引を設定する必要があります。

    したがって、auction_setという名前の索引セットを作成し、price列にサブ索引を追加します。

    EXEC CTX_DDL.CREATE_INDEX_SET('auction_iset');
    EXEC CTX_DDL.ADD_INDEX('auction_iset','price'); /* subindex A*/
  3. CTXCAT索引を作成します。

    AUCTION表の結合されたカタログ索引を、CREATE INDEX文を使用して作成します。

    CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset');
    

    次の図に、CTXCAT索引およびサブ索引と列の関係を示します。

    図2-1 Auction表のスキーマとCTXCAT索引

    図2-1の説明が続きます
    「図2-1 Auction表のスキーマとCTXCAT索引」の説明
  4. CATSEARCHの使用による表の問い合せ

    AUCTION表にCTXCAT索引を作成したら、CATSEARCH演算子を使用してこの索引を問い合せることができます。

    出力を読取り可能にするために、まず出力書式を設定します。

    COLUMN title FORMAT a40;
    

    次に、問合せを実行します。

    SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;
    
    TITLE                PRICE
    --------------- ----------
    PENTAX CAMERA          200
    CANON CAMERA           250
    OLYMPUS CAMERA         300
    NIKON CAMERA           400
    
    SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 
         'price <= 300')>0;
    
    TITLE                PRICE
    --------------- ----------
    PENTAX CAMERA          200
    CANON CAMERA           250
    OLYMPUS CAMERA         300
  5. 表の更新

    新しい行を追加することで、カタログ表を更新します。カタログ表を更新すると、変更を反映するために、CTXCAT索引が自動的に同期化されます。

    たとえば、表に次の新しい行を追加して、問合せを再実行します。

    INSERT INTO AUCTION VALUES(5, 'FUJI CAMERA', 1, 350, '28-OCT-2002');
    INSERT INTO AUCTION VALUES(6, 'SONY CAMERA', 1, 310, '28-OCT-2002');
    
    SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;
    
    TITLE                                    PRICE
    ----------------------------------- ----------
    PENTAX CAMERA                              200
    CANON CAMERA                               250
    OLYMPUS CAMERA                             300
    SONY CAMERA                                310
    FUJI CAMERA                                350
    NIKON CAMERA                               400
    
    6 rows selected.
    

    追加された行が、問合せにただちに表示されます。

    関連項目:

    SQL*Loaderを使用したデータ・ファイルからテキスト表へのロード方法の例は、PSP Webアプリケーションの作成を参照してください

2.5 分類アプリケーションのクイック・ツアー

分類アプリケーションでは、ドキュメントの内容に基づいてアクションが実行されます。アクションには、ドキュメントへのカテゴリIDの割当てや、ユーザーへのドキュメントの送信などがあります。その結果、ドキュメントが分類されます。

この項では、次の項について説明します。

2.5.1 ドキュメントの分類について

ドキュメントは、事前に定義されたルールに従って分類されます。これらのルールは、カテゴリに対してドキュメントを選択します。たとえば、'presidential elections'という問合せルールは、政治に関するカテゴリに対してドキュメントを選択します。

Oracle Textでは、複数のタイプの分類を提供しています。ここで説明する単純な分類、つまりルールベースの分類では、ドキュメント・カテゴリおよびドキュメントを分類するためのルールを作成します。教師なし分類では、提供されたトレーニング・ドキュメントのセットからルールが導出されます。クラスタ化では、Oracle Textによりルールおよびカテゴリが導出され、すべての処理が自動的に実行されます。

Oracle Textを使用してドキュメントの内容を簡単に分類するには、ルール.を作成します ルールとは基本的に、ドキュメントの内容をカテゴリ化する問合せの表です。CTXRULE索引でこれらのルールを索引付けします。テキストの着信ストリームを分類するには、SELECT文のWHERE句でMATCHES演算子を使用します。分類アプリケーションの一般的なフローは、次のイメージを参照してください。

図2-2 ドキュメント分類アプリケーションの概要

図2-2の説明が続きます
「図2-2 ドキュメント分類アプリケーションの概要」の説明

関連項目:

ドキュメント分類の概要

2.5.2 分類アプリケーションの作成

次の例では、CTXAPPロールを持つmyuserを使用してドキュメントを分類する方法を示します。簡単なカテゴリを定義し、CTXRULE索引を作成して、MATCHESを使用します。

  1. 適切なユーザーとして接続

    CTXAPPロールを持つmyuserとして接続します。

    CONNECT myuser;
    
  2. ルール表の作成

    この例では、queriesという名前の表を作成します。各行には、カテゴリがIDおよび問合せ文字列であるルールとともに定義されています。

    CREATE TABLE queries (
          query_id      NUMBER,
          query_string  VARCHAR2(80)
        );
    
        INSERT INTO queries VALUES (1, 'oracle');
        INSERT INTO queries VALUES (2, 'larry or ellison');
        INSERT INTO queries VALUES (3, 'oracle and text');
        INSERT INTO queries VALUES (4, 'market share');
    
  3. CTXRULE索引の作成
    CREATE INDEX queryx ON queries(query_string) INDEXTYPE IS CTXSYS.CTXRULE;
    
  4. MATCHESによる分類

    SELECT文のWHERE句でMATCHES演算子を使用して、ドキュメントを問合せと照合し、ドキュメントを分類します。

        COLUMN query_string FORMAT a35;
        SELECT query_id,query_string FROM queries
         WHERE MATCHES(query_string, 
                       'Oracle announced that its market share in databases 
                        increased over the last year.')>0;
    
      QUERY_ID QUERY_STRING                                                         
    ---------- -----------------------------------                                  
             1 oracle                                                               
             4 market share                                                         
    

    前述のように、ドキュメント文字列はカテゴリ1および4と一致します。この分類では、特定の表へのドキュメントの書込みや、ユーザーへの電子メール送信などのアクションを実行できます。

    関連項目:

    拡張された分類の例は、「Oracle Textでのドキュメントの分類」を参照してください