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
パッケージで次のプロシージャのパフォーマンスが向上します。