Oracle Textは、ドキュメントで単語を検索するとき逆向きの索引を使用し、そのドキュメントからスニペットを計算して結果を表示します。スニペットを計算するために、検索結果の一部として戻される各ドキュメントは再索引付けされます。ドキュメントのサイズが非常に大きい場合には、検索処理が大幅に遅くなります。
正引き索引は、ドキュメントが非常に大きい場合のパフォーマンスの問題を解消します。正引き索引は、逆向きの索引表$Iのトークン・オフセットを参照するマッピング表$Oを使用します。各トークン・オフセットは、元のドキュメントで文字オフセットに変換され、文字オフセット周辺のテキストを使用してテキスト・スニペットが生成されます。
正引き索引はスニペットを計算するときドキュメントのインメモリー索引付けを使用しないため、非常にサイズの大きいドキュメントで単語を検索するとき、逆向きの索引に比べてパフォーマンスが大幅に向上します。
正引き索引では、Oracle TextのCTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。
CTX_DOC.SNIPPET
CTX_DOC.HIGHLIGHT
CTX_DOC.MARKUP
exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
exec ctx_ddl.set_attribute('mystore','forward_index','TRUE');
スニペットを使用して正引き索引を使用
forward_indexオプションを使用して生成されたスニペットが、forward_indexオプションを使用しないで生成されたスニペットとわずかに異なる場合があります。そのような違いは一般的には最小限で、スニペットの品質には影響しません。このような違いは、forward_indexの使用時の、スニペットの一部としての「少数の余分な空白」や「改行」といった種類のものです。
コピー保存を使用して正引き索引を使用
正引き索引を効果的に使用するには、すべてのドキュメントのコピーを$D表に格納します。格納する形式は、使用するCTX_DOCパッケージのプロシージャに応じてプレーン・テキスト形式またはフィルタ済形式です。たとえば、SNIPPETプロシージャを使用するときにはプレーン・テキスト形式で、MARKUPまたはHIGHLIGHTプロシージャを使用するときにはフィルタ済形式でドキュメントを格納します。
ドキュメントのコピーを$D表に格納するには、Oracle Textのコピー保存機能を使用します。save_copy基本記憶域属性を使用するか、save_copy列索引パラメータを使用するは、Oracle Textでコピー保存機能を実装できます。
save_copy基本記憶域属性を使用する場合:
次の例では、BASIC_STORAGE記憶域タイプのsave_copy属性値をPLAINTEXTに設定します。これで、ドキュメントで単語を検索するとき、テキスト・ドキュメントのコピーを$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 table docs(
id number,
txt varchar2(64),
save varchar2(3)
);
insert into docs values(1, 'hello world', 'PLAINTEXT');
create index idx on docs(txt) indextype is ctxsys.context
parameters('save_copy column save');
create index文で$D表を作成し、「hello world」というドキュメント1を$D表にコピーしています。
注意:
save_copy属性/列に指定できる値は、PLAINTEXT、FILTERED、NONEのいずれかです。
PLAINTEXTを指定すると、ドキュメントのコピーはプレーン・テキスト形式で$D索引表に保存されます。プレーン・テキスト形式は、セクショナの出力形式として定義されています。SNIPPETプロシージャを使用するときに、この値を指定します。
FILTEREDを指定すると、ドキュメントのコピーはフィルタ済形式で$D索引表に保存されます。フィルタ済形式は、フィルタの出力形式として定義されています。MARKUPプロシージャまたはHIGHLIGHTプロシージャを使用するときに、この値を指定します。
NONEを指定すると、ドキュメントのコピーが$D索引表に保存されません。次の場合には、この値を指定します。
SNIPPET、MARKUPまたはHIGHLIGHTプロシージャを使用しない場合
索引付けされた列がVARCHAR2またはCLOBの場合
コピー保存を使用せずに正引き索引を使用
すべてのドキュメントのコピーを$D表に保存しなくても、つまりコピー保存の機能を使用しなくても、正引き索引の機能強化を活用できる場合があります。それは次のような場合です。
一連のドキュメントにHTMLとプレーン・テキストが含まれている場合: すべてのドキュメントは、DIRECT_DATASTOREまたはMULTI_COLUMN_DATASTOREデータストア・タイプを使用して元表に格納する必要があります。
一連のドキュメントにHTML、プレーン・テキストおよびバイナリが含まれている場合: すべてのドキュメントはDIRECT_DATASTOREデータストア・タイプを使用して元表に格納する必要があり、バイナリ・ドキュメントのみはフィルタ済形式で$D表に格納する必要があります。
正引き索引を使用せずにコピー保存を使用
コピー保存機能を使用すると、正引き索引の機能を有効にしていない場合でも、CTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。