2 Oracle Textの使用の開始

この章の内容は次のとおりです。

2.1 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を使用したデータ・ファイルからテキスト表へのロード方法の例は、PSP Webアプリケーションの作成を参照してください

2.3.2.1 手順1 CONTEXT索引の作成

HTMLファイルを索引付けするには、次のようにCONTEXT索引をテキスト列に作成します。HTMLの索引付けであるため、この例では、フィルタ処理が不要なNULL_FILTERプリファレンス型とHTML_SECTION_GROUP型を使用します。

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

索引付け時にHTMLドキュメントをフィルタ処理する必要がないため、NULL_FILTERを使用します。ただし、PDF、Microsoft Wordまたはその他の書式設定されたドキュメントを索引付けする場合は、FILTERプリファレンスとしてCTXSYS.AUTO_FILTER(デフォルト)を使用します。

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

2.3.2.2 手順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>
2.3.2.3 手順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.
2.3.2.4 手順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>

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);
    

    図2-1に、この表を示します。

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

2.4.2.1 手順1 問合せの判断

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

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

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

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

EXEC CTX_DDL.CREATE_INDEX_SET('auction_iset');
EXEC CTX_DDL.ADD_INDEX('auction_iset','price'); /* sub-index A*/
2.4.2.3 手順3 CTXCAT索引の作成

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

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

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

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

図2-1の説明が続きます
「図2-1 Auction表のスキーマとCTXCAT索引」の説明
2.4.2.4 手順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
2.4.2.5 手順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.

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

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-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索引の作成

    次のように、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でのドキュメントの分類」を参照してください