MDATA
セクションは、ドキュメントに対するユーザー定義済メタデータの参照で使用されます。MDATA
セクションを使用すると、複合問合せを高速化できます。問合せで戻すことができるMDATA
セクションの数に制限はありません。
テキストの内容およびドキュメント・タイプ(雑誌、新聞、小説など)の両方に応じた問合せをする場合を考えます。テキストの列およびドキュメント・タイプの列を使用して索引を作成し、次にこの形式の複合問合せを実行します。この場合は、Adam Thorpe(小説Ulvertonの作者)というフレーズを含むすべての小説を検索します。
SELECT id FROM documents WHERE doctype = 'novel' AND CONTAINS(text, 'Adam Thorpe')>0;
ただし、通常は、別々の列を使用するよりも、属性(この場合はドキュメント・タイプ)を1つのフィールド・セクションに組み込ませた方が速いです。次に、1つのCONTAINS
問合せを使用します。
SELECT id FROM documents WHERE CONTAINS(text, 'Adam Thorpe AND novel WITHIN doctype')>0;
この方法には、2つの短所があります。
属性が更新されるたびに、テキスト・ドキュメント全体を再索引付けする必要があります。その結果、索引の断片化が進み、DMLの処理レートが遅くなります。
フィールド・セクションにより、セクション値がトークン化します。これは、次のように影響を及ぼします。小数点または通貨記号などの、メタデータ内の特殊文字は簡単に検索できない、値の検索が困難(「Thurston Howell」は検索できるが、「Thurston Howell, Jr.」は検索できないなど)、マルチ・ワードの値が句で問い合されるため、単一のトークン検索よりも遅くなる、マルチ・ワードの値がブラウズ・ワードで表示されないため、作成者のブラウズや主題のブラウズが不可能になる、などです。
そのため、フィールド・セクションではなくMDATA
セクションを使用した方が有効です。MDATA
セクションは、フィールド・セクションのように索引付けされますが、メタデータ値が追加され、ドキュメント・テキストを再索引付けせずにドキュメントから削除できます。フィールド・セクションとは異なり、MDATA
値はトークン化されません。また、MDATA
セクションの索引付けは、通常、フィールド・セクションの索引付けよりも使用するディスク・スペースが小さくてすみます。
MDATA
セクションをセクション・グループに追加するには、CTX_DDL.ADD_MDATA_SECTION
を使用します。この例では、AUTHOR
というMDATA
セクションを追加し、これに「Soseki Natsume」(小説「Kokoro」の作者)という値を指定します。
ctx_ddl.create.section.group('htmgroup', 'HTML_SECTION_GROUP'); ctx_ddl.add_mdata_section('htmgroup', 'author', 'Soseki Natsume');
MDATA
値は、CTX_DDL.ADD_MDATA
を使用して変更したり、CTX_DDL.REMOVE_MDATA
を使用して削除できます。また、MDATA
セクションには複数の値を含めることができます。索引の所有者のみがCTX_DDL.ADD_MDATA
およびCTX_DDL.REMOVE_MDATA
をコールできます。
CTX_DDL.ADD_MDATA
およびCTX_DDL.REMOVE_MDATA
は、両方ともCTXCAT
索引およびCTXRULE
索引に対してサポートされていません。
MDATA
値はレクサーを介して渡されません。かわりに、すべての値が次のように簡易正規化されます。
値に隣接する空白は削除されます。
値は64バイトに切り捨てられます。
値は単一の値として索引付けされます。値が複数のワードから構成されていても、分割されません。
大/小文字の区別は保持されます。ドキュメントが動的に生成される場合は、MDATA
値を大文字化し、大文字のみが検索されることを確認することで、大/小文字区別を実装できます。
ドキュメントにMDATA
メタデータが追加された後、MDATA
CONTAINS
問合せ演算子を使用して、メタデータを問い合せることができます。
SELECT id FROM documents WHERE CONTAINS(text, 'Tokyo and MDATA(author, Soseki Natsume)')>0;
AUTHOR
タグに正確な値「Soseki Natsume」がある場合(単純なトークン化後)のみ、この問合せは正常に行われます。「Soseki」または「Natsume Soseki」では機能しません。
MDATA
に関して、他に注意する点は次のとおりです。
MDATA
値はハイライト表示されません。CTX_DOC.TOKENS
の出力では表示されず、FILTER PLAINTEXT
が有効なときも表示されません。
MDATA
セクションは、セクション・グループ内で一意にする必要があります。同じセクション・グループ内に、FOO
というMDATA
セクション、および同じ名前のゾーン・セクションまたはフィールド・セクションを含めることはできません。
フィールド・セクションと同様に、MDATA
セクションはオーバーラップまたはネストできません。MDATA
セクションは、最初に発生したタグにより、暗黙的にクローズされます。たとえば、次の例のようになります。
<AUTHOR>Dickens <B>Shelley</B> Keats</AUTHOR>
<B>
タグにより、AUTHOR
MDATA
セクションがクローズされます。その結果、このドキュメントには「Shelley」や「Keats」ではなく、「Dickens」というAUTHOR
が含まれます。
競合状態を未然に防ぐため、ADD_MDATA
およびREMOVE_MDATA
をそれぞれコールして、すべての値とセクションの索引のROWIDに対する他のコールをロックします。ただし、ADD_MDATA
およびREMOVE_MDATA
はコミットを行わないため、両方をコールするとアプリケーションでデッドロックが発生する可能性があります。デッドロックを回避するのはアプリケーションの役割です。