4.5 CONTEXT索引の作成

CONTEXT索引タイプは、Microsoft Word、HTMLまたはプレーン・テキストのような形式の大量のまとまったドキュメントを索引付けする場合に最適です。

CONTEXT索引では、様々な方法で索引をカスタマイズすることもできます。ドキュメントはテキスト表にロードする必要があります。

4.5.1 CONTEXT索引およびDML

CONTEXT索引は、トランザクション・ベースでは更新されません。レコードを削除すると、索引は即時に変更されます。つまり、変更を行った瞬間からセッションはレコードを検索しなくなり、コミット後には他のユーザーはレコードを検索できなくなります。挿入と更新の場合、索引の同期化が行われるまで、新しい情報はテキスト検索には表示されません。したがって、元表で挿入または更新を行う場合、CTX_DDL.SYNC_INDEX.を使用して明示的に索引を同期化する必要があります

関連項目:

索引の同期化

4.5.2 「デフォルトのCONTEXT索引例」

次の文は、docs表内のtext列にmyindexというデフォルトのCONTEXT索引を作成します。

CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;

パラメータを明示的に指定せずにCREATE INDEX文を使用すると、すべての言語に対してシステムのデフォルト動作が次のようになります。

  • 索引付けされるテキストは、テキスト列に直接格納されるとみなします。テキスト列の型は、CLOBBLOBBFILEVARCHAR2またはCHARになります。

  • 列型を検出し、バイナリの列型(BLOBおよびBFILE)に対してフィルタ処理を使用します。ほとんどのドキュメント形式がフィルタ処理でサポートされています。列がプレーン・テキストの場合、システムはフィルタ処理を使用しません。

    ノート:

    システムで正しくドキュメントをフィルタ処理するために、使用している環境がAUTO_FILTERフィルタをサポートするように正しく設定されていることを確認してください。

  • 索引付けするテキストの言語は、データベース設定で指定された言語であるとみなします。

  • データベース設定で指定した言語に対するデフォルトのストップリストを使用します。ストップリストは、索引付け時にシステムが無視するワードを識別します。

  • 使用言語でのファジーおよびステミング問合せを有効にします(その言語に対してこの機能が使用可能な場合)。

デフォルトの索引付け動作は、プリファレンスをカスタマイズし、そのプリファレンスをCREATE INDEXのパラメータ文字列に指定することによって、いつでも変更できます。

関連項目:

AUTO_FILTERフィルタを使用するための環境の構成についてさらに学習するには、『Oracle Text リファレンス』を参照してください

4.5.3 CONTEXT索引の追加的な作成

ALTER INDEX文およびCREATE INDEX文は、CONTEXT索引の追加的な作成をサポートします。

Oracle Text索引は追加的に作成できます。つまり、索引構造は即時に作成されますが、索引の作成または再構築プロセスではデータが移入されません。索引は後で適切なタイミングで移入します。この手順は、索引付け処理を連続的に実行するのが困難な大規模なインストールで索引を作成する場合に便利です。索引の作成をより細かく制御できるため、1回の操作で索引を作成する必要がなくなります。

索引の追加的な作成のステップは、次のとおりです:

  1. 空の索引の作成:

    索引の作成時または再構築時にNOPOPULATEを指定すると、索引表のメタデータが作成されるのみで、移入は実行されません。

    • グローバル索引:

      グローバル索引の場合、CREATE INDEXを使用してREBUILD句のREPLACEパラメータでNOPOPULATEキーワードをサポートします。

    • ローカル索引パーティション:

      ローカル索引パーティションについて、ALTER INDEX ... REBUILD partition ... parameters ('REPLACE ...')パラメータ文字列を、NOPOPULATEキーワードをサポートするように修正します。

      ローカル索引パーティションについては、CREATE INDEX ... LOCAL ... (partition ... parameters ('NOPOPULATE'))がサポートされています。パーティション・レベルのPOPULATEキーワードまたはNOPOPULATEキーワードは、索引レベルで指定されたPOPULATEまたはNOPOPULATEを上書きします。

  2. すべてのROWIDを保留キューに配置:

    CTX_DDL.POPULATE_PENDINGプロシージャを使用して、保留キューに実表または表パーティション内のすべてのROWIDを移入します。

  3. 索引の移入:

    CTX_DDL.SYNC_INDEXプロシージャを使用して、キューに入っているデータを索引に移入します。

    SYNC_INDEXプロシージャには、操作に対し分単位の提示された時間制限を指定するmaxtime引数が含まれます。索引付けプロセスは、完了まで実行するのではなく、指定したmaxtimeの概算で実行されます。索引が完全に同期されるまで、複数のSYNC_INDEXコールの実行が必要になる場合があります。

    POPULATE_PENDINGコールとSYNC_INDEXコールの両方を個別に実行して、保留キューの移入と索引の移入が異なるタイミングで実行されるように選択することで、システム・パフォーマンスを最適化できます。

例4-1 空のグローバル索引の追加的な構築

-- Create an empty index

CREATE INDEX ctx_ind ON ctx_tab(doc) INDEXTYPE IS CTXSYS.CONTEXT
   PARAMETERS ('NOPOPULATE');
declare
 n_pending number;

 function get_pending return number is
   n_pending number;

 begin
   n_pending := 0;
   begin
     execute immediate 'SELECT COUNT(*) FROM DR$CTX_IND$C' into n_pending;
   exception when others then
     if (sqlcode != -942) then
       raise;
     end if;
   end;

   if (n_pending = 0) then
     execute immediate 'SELECT COUNT(*) FROM CTX_USER_PENDING WHERE PND_INDEX_NAME = :1'
         into n_pending using 'CTX_IND';
   end if;
   return n_pending;
 end get_pending;

begin
 -- Fill in the pending queue
 CTX_DDL.POPULATE_PENDING('CTX_IND');
 n_pending := get_pending;
 while (n_pending > 0) loop
  -- Populate the index through sync_index
   CTX_DDL.SYNC_INDEX('CTX_IND', maxtime => 1);
   n_pending := get_pending;
 end loop;
end;
/

4.5.4 カスタムのCONTEXT索引例: HTMLドキュメントの索引付け

URLで指定されたHTMLドキュメント・セットを索引付けする場合は、CREATE INDEX文でシステム定義プリファレンスであるNULL_FILTERを指定します。

HTML_SECTION_GROUPを使用するhtmgroupセクション・グループおよびNETWORK_DATASTOREを使用するNETWORK_PREFデータストアを指定できます。

begin
 ctx_ddl.create_preference('NETWORK_PREF','NETWORK_DATASTORE');
 ctx_ddl.set_attribute('NETWORK_PREF','HTTP_PROXY','www-proxy.us.example.com');
 ctx_ddl.set_attribute('NETWORK_PREF','NO_PROXY','us.example.com');
 ctx_ddl.set_attribute('NETWORK_PREF','TIMEOUT','300');
end;

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;

それから、ドキュメントを索引付けできます。

CREATE INDEX myindex on docs(htmlfile) indextype is ctxsys.context 
parameters(
'datastore NETWORK_PREF filter ctxsys.null_filter section group htmgroup'
);

ノート:

Oracle Database 19c以降、Oracle TextのURL_DATASTORE型は非推奨になりました。かわりに、NETWORK_DATASTOREを使用してください。

関連トピック

4.5.5 CONTEXT索引例: FILTER BYおよびORDER BYによる問合せ処理

複合問合せで問合せ処理を効率化し応答時間を短縮するため、次の例に示すようにFILTER BY句およびORDER BY句を使用します。

CREATE INDEX myindex on docs(text) INDEXTYPE is CTXSYS.CONTEXT
FILTER BY category, publisher, pub_date
ORDER BY pub_date desc;

問合せ時にFILTER BY category, publisher, pub_date句を指定したため、Oracle Textではこれらの列上の関連の述語をOracle Text索引の行ソースに入れることも考慮します。

また、問合せに一致するORDER BY条件がある場合、応答時間を短縮するために、ORDER BY pub_date descを指定することで、Oracle Textにより、SORTをOracle Text索引の行ソースに入れるかどうかが決定されます。