3.6 正引き索引を使用したドキュメント・サービスのパフォーマンスの改善

Oracle Textは、ドキュメントで単語を検索するときに逆向きの索引を使用し、そのドキュメントからスニペットを計算して結果を表示します。スニペットを計算するために、検索結果の一部として戻される各ドキュメントは再索引付けされます。ドキュメントのサイズが非常に大きい場合には、検索処理が大幅に遅くなります。

正引き索引は、ドキュメントが非常に大きい場合のパフォーマンスの問題を解消します。逆向きの索引表$Iのトークン・オフセットを参照する$Oマッピング表を使用します。各トークン・オフセットは、元のドキュメントで文字オフセットに変換され、文字オフセット周辺のテキストを使用してテキスト・スニペットが生成されます。

正引き索引はスニペットを計算するときドキュメントのインメモリー索引付けを使用しないため、非常に大きいドキュメントで単語を検索するとき、逆向きの索引に比べてパフォーマンスが大幅に向上します。

正引き索引では、Oracle TextのCTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。

  • CTX_DOC.SNIPPET

  • CTX_DOC.HIGHLIGHT

  • CTX_DOC.MARKUP

関連項目:

BASIC_STORAGE索引付けタイプのforward_indexパラメータ句の詳細は、『Oracle Textリファレンス』を参照してください

3.6.1 正引き索引の有効化

次の例は、正引き索引の機能を有効にするために、BASIC_STORAGE記憶域タイプのforward_index属性値をTRUEに設定します。

exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
exec ctx_ddl.set_attribute('mystore','forward_index','TRUE');

3.6.2 スニペットによる正引き索引

場合によっては、forward_indexオプションを使用すると、生成されたスニペットがforward_indexオプションを使用しない場合に生成されたスニペットと比べてわずかに異なる場合があります。一般的には違いは最小限でスニペットの品質には影響せず、通常はごくわずかな余分な空白や改行が入る程度です。

3.6.3 コピー保存による正引き索引

コピー保存を使用して正引き索引を使用

正引き索引を効果的に使用するには、ドキュメントのコピーを$D表に格納します。格納する形式は、使用するCTX_DOCパッケージのプロシージャに応じてプレーン・テキスト形式またはフィルタ済形式です。たとえば、SNIPPETプロシージャを使用するときにはプレーン・テキスト形式で、MARKUPまたはHIGHLIGHTプロシージャを使用するときにはフィルタ済形式でドキュメントを格納します。

ドキュメントのコピーを$D表に格納するには、Oracle Textのコピー保存機能を使用します。save_copy属性またはsave_copy列パラメータを使用してこの機能を実装します。

  • save_copy基本記憶域属性:

    次の例では、BASIC_STORAGE記憶域タイプのsave_copy属性値をPLAINTEXTに設定します。この例では、Oracle Textは、ドキュメントで単語を検索するときに、$D表にテキスト・ドキュメントのコピーを保存できます。

    exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
    exec ctx_ddl.set_attribute('mystore','save_copy','PLAINTEXT');
    
  • save_copy column索引パラメータ:

    次の例では、save_copy column索引パラメータを使用してテキスト・ドキュメントのコピーを$D表に保存します。create index文で$D表を作成し、ドキュメント1 ("hello world")を$D表にコピーしています。

    create table docs(
      id       number,
      txt      varchar2(64),
      save     varchar2(10)
    );
    
    insert into docs values(1, 'hello world', 'PLAINTEXT');
    
    create index idx on docs(txt) indextype is ctxsys.context
        parameters('save_copy column save');
    

save_copy属性または列パラメータには、次のいずれかの値を指定できます。

  • PLAINTEXTは、ドキュメントのコピーをプレーン・テキスト形式で$D索引表に保存します。プレーン・テキスト形式は、セクショナの出力形式として定義されています。SNIPPETプロシージャを使用するには、この値を指定する必要があります。

  • FILTEREDは、ドキュメントのコピーをフィルタ済形式で$D索引表に保存します。フィルタ済形式は、フィルタの出力形式として定義されています。MARKUPまたはHIGHLIGHTプロシージャを使用するときは、この値を指定します。

  • NONEの場合、ドキュメントのコピーは$D索引表に保存されません。SNIPPET、MARKUPまたはHIGHLIGHTプロシージャを使用しない場合でかつ索引付き列がVARCHAR2またはCLOBである場合、この値を指定します。

3.6.4 コピー保存を使用しない正引き索引

次の場合、すべてのドキュメントのコピーを$D表に保存しなくても(つまりコピー保存の機能を使用しなくても)、正引き索引の機能強化を活用できます。

  • ドキュメント・セットにHTMLとプレーン・テキストが含まれている場合: DIRECT_DATASTOREまたはMULTI_COLUMN_DATASTOREデータストア・タイプを使用して、実表内のすべてのドキュメントを格納します。

  • ドキュメント・セットにHTML、プレーン・テキストおよびバイナリが含まれている場合: DIRECT_DATASTOREデータストア・タイプを使用して、実表内のすべてのドキュメントを格納します。バイナリ・ドキュメントのみをフィルタ形式で$D表に格納します。

3.6.5 正引き索引なしのコピー保存

正引き索引の機能を有効にしていない場合でも、コピー保存機能を使用すると、CTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。

  • CTX_DOC.FILTER

  • CTX_DOC.GIST

  • CTX_DOC.THEMES

  • CTX_DOC.TOKENS