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はコミットを行わないため、両方をコールするとアプリケーションでデッドロックが発生する可能性があります。デッドロックを回避するのはアプリケーションの役割です。