ヘッダーをスキップ
Oracle Textアプリケーション開発者ガイド
11g リリース1(11.1)
E05788-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

8 Oracle Textでのドキュメント・セクションの検索

この章では、Oracle Textの問合せアプリケーションでドキュメントのセクションを使用する方法を説明します。

次の項目について説明します。

8.1 Oracle Textでのドキュメントのセクション検索について

セクション検索を使用すると、テキスト問合せをドキュメント内のテキストのブロックに絞り込むことができます。 セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に有効です。

また、テキストを文レベルと段落レベルで検索できます。

ここでは、次の項目について説明します。

8.1.1 Oracle Textでのセクション検索の使用可能化

ドキュメント・コレクションのセクション検索を使用可能にする手順は、次のとおりです。

  1. セクション・グループを作成します。

  2. セクションを定義します。

  3. ドキュメントを索引付けします。

  4. WITHININPATHまたはHASPATHの各演算子を使用してセクションを検索します。

8.1.1.1 セクション・グループの作成

セクション検索を使用可能にするには、セクション・グループを定義します。システム定義のセクション・グループのいずれかを使用して、セクション・グループのインスタンスを作成します。ドキュメント・コレクションに適したセクション・グループを選択します。

セクション・グループを使用して、所有しているドキュメント・セットのタイプを指定し、タグ構造を明示的に示します。たとえば、HTMLタグ付きのドキュメントを索引付けするには、HTML_SECTION_GROUPを使用します。同様に、XMLタグ付きのドキュメントを索引付けするには、XML_SECTION_GROUPを使用します。

表8-1は、使用可能な各種のセクション・グループを示しています。

表8-1 セクション・グループのタイプ

セクション・グループ・プリファレンス 説明

NULL_SECTION_GROUP

これはデフォルトです。どのセクションも定義しないか、SENTENCEまたはPARAGRAPHセクションのみを定義します。

BASIC_SECTION_GROUP

開始および終了タグが<A>および</A>という形式のセクションを定義します。

注意: このグループ・タイプでは、片方のみのカッコ、コメント・タグおよび属性などの入力はサポートしません。このような入力にはHTML_SECTION_GROUPを使用します。

HTML_SECTION_GROUP

HTMLドキュメントを索引付けし、HTMLドキュメントにセクションを定義します。

XML_SECTION_GROUP

XMLドキュメントを索引付けし、XMLドキュメントにセクションを定義します。

AUTO_SECTION_GROUP

XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。

属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、tag@attributeという形式でネーミングされます。

停止セクション、空のタグ、処理の指示およびコメントは、索引付けされません。

自動セクション・グループには次の制限事項が適用されます。

  • ゾーン、フィールドまたは特殊セクションは、自動セクション・グループに追加できません。

  • 自動セクション化は、XMLドキュメント・タイプ(ルート要素)を索引付けしません。ただし、ドキュメント・タイプに停止セクションを定義することはできます。

  • 索引付けされたタグの長さは、プリフィックスおよび名前空間を含めて64バイト以下です。これより長いタグは索引付けされません。

PATH_SECTION_GROUP

XMLドキュメントを索引付けします。このタイプは、AUTO_SECTION_GROUPと同じように動作します。

相違点は、このセクション・グループを使用すると、INPATHおよびHASPATH演算子でパス検索を実行できることです。タグまたは属性名の問合せでは、大/小文字が同様に区別されます。

NEWS_SECTION_GROUP

RFC 1036に基づいて、ニュース・グループ形式のドキュメントのセクションを定義します。



注意:


HTMLXMLAUTOおよびPATHセクショナに送られるドキュメントは、¥s*<で始まる必要があります。¥s*は、ゼロ個以上の空白文字を表します。他の文字で始まるドキュメントはプレーン・テキスト・ドキュメントとして扱われ、セクションは認識されません。

CTX_DDLパッケージを使用してセクション・グループを作成し、セクション・グループの構成要素としてセクションを定義します。たとえば、HTMLドキュメントを索引付けするには、HTML_SECTION_GROUPを使用してセクション・グループを作成します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
end;

8.1.1.2 セクションの定義

セクションは、セクション・グループの構成要素として定義します。次の例では、HTML <H1>タグ内の全テキストに対してheadingというゾーン・セクションを定義します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;

注意:


AUTO_SECTION_GROUPまたはPATH_SECTION_GROUPを使用して、XMLドキュメント・コレクションを索引付けする場合は、セクションを明示的に定義する必要はありません。これは、システムが索引付け時にセクションを定義するためです。


関連項目:


8.1.1.3 ドキュメントの索引付け

ドキュメントの索引付け時に、セクション・グループをCREATE INDEXのPARAMETERS句に指定します。

create index myindex on docs(htmlfile) indextype is ctxsys.context
parameters('filter ctxsys.null_filter section group htmgroup');

8.1.1.4 WITHIN演算子によるセクション検索

ドキュメントが索引付けされている場合は、WITHIN演算子を使用して、セクション内を問い合せることができます。たとえば、ドキュメントのヘッダー内にワードOracleを含むすべてのドキュメントを検索するには、次の問合せを入力します。

'Oracle WITHIN heading'

関連項目:


WITHIN演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

8.1.1.5 INPATHおよびHASPATH演算子によるパス検索

PATH_SECTION_GROUPを使用した場合、システムは自動的にXMLセクションを作成します。WITHIN演算子を使用して問合せを入力できる他、INPATH演算子とHASPATH演算子を使用してパス検索を入力できます。


関連項目:


8.1.2 Oracle Textのセクション・タイプ

セクション・タイプはすべて、ドキュメント内のテキストのブロックです。ただし、セクションを区切る方法や索引内での記録方法にそれぞれ相違があります。セクションは、次のタイプのいずれかです。

表8-2に、各種セクション・グループとともに使用されるセクション・タイプを示します。

表8-2 セクション・タイプおよびセクション・グループ

セクション・グループ ZONE FIELD STOP MDATA SDATA ATTRIBUTE SPECIAL

NULL

NO

NO

NO

NO

NO

NO

YES

BASIC

YES

YES

NO

YES

YES

NO

YES

HTML

YES

YES

NO

YES

YES

NO

YES

XML

YES

YES

NO

YES

YES

YES

YES

NEWS

YES

YES

NO

YES

YES

NO

YES

AUTO

NO

NO

YES

NO

NO

NO

NO

PATH

NO

NO

NO

NO

NO

NO

NO


8.1.2.1 ゾーン・セクション

ゾーン・セクションは、ドキュメント内の開始タグと終了タグで区切られたテキストの本体です。開始タグと終了タグの位置は、索引内に記録されています。したがって、タグに挟まれたワードはそのセクション内に存在するとみなされます。ゾーン・セクションのインスタンスすべてに、開始タグと終了タグが付いている必要があります。

たとえば、<TITLE></TITLE>の2つのタグに挟まれたテキストは、ゾーン・セクションとして次のように定義できます。

<TITLE>Tale of Two Cities</TITLE>
It was the best of times...

ゾーン・セクションは、ドキュメント内でネスト、オーバーラップおよび繰返しができます。

ゾーン・セクションの問合せ時に、全セクション内の語句を検索するには、WITHIN演算子を使用します。Oracle Textにより、定義済のセクション内に問合せ語句を含むドキュメントが戻ります。

ゾーン・セクションは、HTMLおよびXMLドキュメントのセクションの定義に最適です。ゾーン・セクションを定義するには、CTX_DDL.ADD_ZONE_SECTIONを使用します。

たとえば、次のようにbooktitleというセクションを定義したとします。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'booktitle', 'TITLE');
end;

索引付けした後で、セクションbooktitle内の語句Citiesを含むすべてのドキュメントを次のように検索できます。

'Cities WITHIN booktitle'

(dog and cat) WITHIN booktitleのような複数の問合せ語句の場合は、Oracle Textにより、booktitleセクションの同じインスタンス内にcatdogを含むドキュメントが検出されます。

8.1.2.1.1 繰返しゾーン・セクション

ゾーン・セクションは繰返しが可能です。各繰返しは別々のセクションとして処理されます。たとえば、<H1>がheadingセクションを示す場合は、次のように、同じドキュメント内で繰り返すことができます。

<H1> The Brown Fox </H1>
<H1> The Gray Wolf </H1>

これらのゾーン・セクションがHeadingという名前の場合、問合せBrown WITHIN Headingはこのドキュメントを戻します。ただし、(Brown and Gray) WITHIN Headingという問合せはこのドキュメントを戻しません。

8.1.2.1.2 ゾーン・セクションのオーバーラップ

ゾーン・セクションは互いにオーバーラップできます。たとえば、<B><I>が2つの異なるゾーン・セクションを示す場合、これらはドキュメント内で次のようにオーバーラップできます。

plain <B> bold <I> bold and italic </B> only italic </I>  plain
8.1.2.1.3 ネストされたゾーン・セクション

ゾーン・セクションは(それ自体も含めて)、次のようにネストできます。

<TD> <TABLE><TD>nested cell</TD></TABLE></TD>

WITHIN演算子を使用して、セクション内のセクションのテキストを検索するための問合せを記述できます。たとえば、BOOK1、BOOK2およびAUTHORのゾーン・セクションが、ドキュメントdoc1およびdoc2で次のように出現するとします。

doc1:

<book1> <author>Scott Tiger</author> This is a cool book to read.</book1>

doc2:

<book2> <author>Scott Tiger</author> This is a great book to read.</book2>

次のようにネストされた問合せを実行します。

'(Scott within author) within book1'

この問合せはdoc1のみを戻します。

8.1.2.2 フィールド・セクション

フィールド・セクションは、ゾーン・セクションと同じように、開始タグと終了タグで区切られたテキストの範囲です。フィールド・セクションがゾーン・セクションと異なる点は、その範囲がドキュメントの残りの部分とは別に索引付けされることです。

フィールド・セクションは異なる方法で索引付けされるため、大量のドキュメントが索引付けされている場合は、ゾーン・セクションに比べて問合せパフォーマンスが向上します。

フィールド・セクションは、ドキュメント内のセクションに1回のみ出現するニュース・ヘッダーのフィールドなどに最適です。また、フィールド・セクションは、ドキュメントの残りの部分で参照できます。

ゾーン・セクションとは異なり、フィールド・セクションには次の制限事項があります。

  • フィールド・セクションはオーバーラップできません。

  • フィールド・セクションは繰返しができません。

  • フィールド・セクションはネストできません。

8.1.2.2.1 参照可能なフィールド・セクションと参照不能なフィールド・セクション

デフォルトでは、フィールド・セクションは、ドキュメントの残りの部分とは別のサブドキュメントとして索引付けされます。フィールド・セクションは、前後のテキストから参照不能です。したがって、WITHIN句でそのセクション名を明示的に指定することによってのみ問い合せることができます。

フィールド・セクション内のテキストをドキュメント全体の一部として索引付けする場合は、フィールド・セクションを参照可能にできます。参照可能なフィールド・セクション内のテキストは、WITHIN演算子を使用するかどうかにかかわらず問い合せることができます。

次の例では、参照不能なフィールド・セクションと参照可能なフィールド・セクションの相違点を示します。

次のコードは、BASIC_SECTION_GROUP型のセクション・グループbasicgroupを定義します。次に、<A>タグに対してAuthorというフィールド・セクションをbasicgroupに作成します。また、参照可能フラグをFALSEに設定して、参照不能なセクションを作成します。

begin
ctx_ddl.create_section_group('basicgroup', 'BASIC_SECTION_GROUP');
ctx_ddl.add_field_section('basicgroup', 'Author', 'A', FALSE);
end;

Authorフィールド・セクションは参照不能であるため、Authorセクション内のテキストを検索するには、次のようにWITHIN演算子を使用する必要があります。

'(Martin Luther King) WITHIN Author'

WITHIN演算子を使用せずにMartin Luther Kingを問い合せても、フィールド・セクション内のこの語句のインスタンスは戻りません。WITHINを指定せずにフィールド・セクション内のテキストを問い合せる場合は、セクション作成時に次のように参照可能フラグをTRUEに設定する必要があります。

begin
ctx_ddl.add_field_section('basicgroup', 'Author', 'A', TRUE);
end;
8.1.2.2.2 ネストされたフィールド・セクション

フィールド・セクションはネストできません。たとえば、あるフィールド・セクションを<TITLE>で始まるように定義し、別のフィールド・セクションを<FOO>で始まるように定義した場合、この2つのセクションを、次のようにネストすることはできません。

<TITLE> dog <FOO> cat </FOO> </TITLE>

ネストされたセクションを使用するには、これらをゾーン・セクションとして定義します。

8.1.2.2.3 繰返しフィールド・セクション

繰返しフィールド・セクションは使用できますが、WITHIN問合せはこれらを1つのセクションとして処理します。次に、ドキュメントの繰返しフィールド・セクションの例を示します。

<TITLE> cat </TITLE>
<TITLE> dog </TITLE>

問合せ(dog and cat)within titleは、これらのワードが別のセクション内に存在している場合でも、ドキュメントを検出します。

WITHIN問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。

8.1.2.3 停止セクション

停止セクションは、自動セクション・グループに追加できます。停止セクションを追加すると、自動セクション索引付け演算子によってXMLドキュメントの特定のセクションが無視されます。


注意:


停止セクションを追加すると、索引にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索できます。

ユーザーのドキュメントに多数の下位レベルの情報タグが含まれているときに、停止セクションを追加すると役立ちます。停止セクションの追加により、自動セクション・グループのパフォーマンスもまた改善されます。

追加できる停止セクションの数は無制限です。

停止セクションにはセクション名がないため、セクション・ビューに記録されません。

8.1.2.4 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セクションの索引付けは、通常、フィールド・セクションの索引付けよりも使用するディスク・スペースが小さくてすみます。

CTX_DDL.ADD_MDATA_SECTIONを使用して、MDATAセクションをセクション・グループに追加します。この例では、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索引、CTXXPTH索引および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はコミットしないため、両方をコールするときにアプリケーションでデッドロックが発生する可能性があります。アプリケーションを使用して、デッドロックを防ぐ必要があります。


関連項目:

  • MDATA演算子の詳細は、『Oracle Textリファレンス』の「Oracle Text CONTAINS問合せ演算子」を参照してください。

  • MDATAセクションの追加および削除の詳細は、『Oracle Textリファレンス』の「CTX_DDLパッケージ」を参照してください。


8.1.2.5 SDATA セクション

SDATAセクションの値は、他のセクションのようにドキュメントのテキストから抽出されますが、構造化データ(SDATAとも呼ばれます)として索引付けされます。SDATAセクションの使用により、投影、範囲検索、順序付けなどの操作がサポートされます。埋込みタグ、詳細な表または関数の起動など、セクション・データのSDATA索引付けも有効になります。これにより、1つのSQL文でテキスト検索と構造化検索の様々な組合せを実行できます。

SDATA演算子は、非SDATAの子も持つAND演算子の子としてのみ使用されます。SDATA演算子は、二次的な確認または非駆動基準として使用されることになっています。たとえば、「評価> 4のドキュメントを検索」するのではなく、「価格> 5でもありDOGを含むドキュメントを検索」します。他の使用方法でも正しく動作しますが、パフォーマンスが最善にはならないことがあります。

CTX_DDL.ADD_SDATA_SECTIONを使用して、SDATAセクションをセクション・グループに追加します。SDATAセクション内で問い合せる場合は、CONTAINS演算子を使用します。次の例では、itemsという表を作成し、my_sec_groupというSDATAセクションを追加して、セクション内のSDATAを問い合せます。

itemsを作成します。

CREATE TABLE items
(id  NUMBER PRIMARY KEY,
 doc VARCHAR2(4000));

INSERT INTO items VALUES (1, '<description> Honda Pilot </description>
                              <category> Cars & Trucks </category>
                              <price> 27000 </price>');
INSERT INTO items VALUES (2, '<description> Toyota Sequoia </description>
                              <category> Cars & Trucks </category>
                              <price> 35000 </price>');
INSERT INTO items VALUES (3, '<description> Toyota Land Cruiser </description>
                              <category> Cars & Trucks </category>
                              <price> 45000 </price>');
INSERT INTO items VALUES (4, '<description> Palm Pilot </description>
                              <category> Electronics </category>
                              <price> 5 </price>');
INSERT INTO items VALUES (5, '<description> Toyota Land Cruiser Grill </description>
                              <category> Parts & Accessories </category>
                              <price> 100 </price>');
COMMIT;

SDATAセクションmy_sec_groupを追加します。

BEGIN
  CTX_DDL.CREATE_SECTION_GROUP('my_sec_group', 'BASIC_SECTION_GROUP');
  CTX_DDL.ADD_SDATA_SECTION('my_sec_group', 'category', 'category', 'VARCHAR2');
  CTX_DDL.ADD_SDATA_SECTION('my_sec_group', 'price', 'price', 'NUMBER');
END;

CONTEXT索引を作成します。

CREATE INDEX items$doc
  ON items(doc)
  INDEXTYPE IS CTXSYS.CONTEXT
  PARAMETERS('SECTION GROUP my_sec_group');

問合せを実行します。

SELECT id, doc
  FROM items
  WHERE contains(doc, 'Toyota
                       AND SDATA(category = ''Cars & Trucks'')
                       AND SDATA(price <= 40000 )') > 0;

結果を返します。

  ID DOC
---- ----------------------------------------------------------------------
   2 <description> Toyota Sequoia </description>
                                   <category> Cars & Trucks </category>
                                   <price> 35000 </price>

関連項目:

  • SDATA演算子の詳細は、『Oracle Textリファレンス』の「Oracle Text CONTAINS問合せ演算子」を参照してください。

  • SDATAセクションの追加および削除の詳細は、『Oracle Textリファレンス』の「CTX_DDLパッケージ」を参照してください。


8.1.2.6 属性セクション

属性セクションを定義すると、XMLの属性テキストを問い合せることができます。また、システムで自動的にXML属性を定義し、索引付けすることもできます。

8.1.2.7 特殊セクション

特殊セクションは、タグで認識されるのではありません。現在サポートされている特殊セクションは、文と段落のみです。特殊セクションを使用すると、文または段落内のワードの組合せを検索できます。

文および段落の境界はレクサーにより決定されます。たとえば、BASIC_LEXERは、文および段落のセクション境界を次のように認識します。

表8-3 BASIC_LEXERの文および段落セクション境界

特殊セクション 境界

SENTENCE

WORD/PUNCT/WHITESPACE


WORD/PUNCT/NEWLINE

PARAGRAPH

WORD/PUNCT/NEWLINE/WHITESPACE


WORD/PUNCT/NEWLINE/NEWLINE


レクサーが境界を認識できない場合、文または段落のセクションには索引が付けられません。

特殊セクションを追加するには、CTX_DDL.ADD_SPECIAL_SECTIONプロシージャを使用します。たとえば、次のコードによって、HTMLドキュメントの文内での検索が使用可能になります。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_special_section('htmgroup', 'SENTENCE');
end;

文検索の他にゾーン検索を使用可能にするために、ゾーン・セクションをグループに追加することもできます。次の例では、ゾーン・セクションHeadlineをセクション・グループhtmgroupに追加します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_special_section('htmgroup', 'SENTENCE');
ctx_ddl.add_zone_section('htmgroup', 'Headline', 'H1');
end;

8.2 Oracle Textを使用したHTMLのセクション検索

HTMLには、セクション検索に使用できるタグ付きテキスト形式の内部構造があります。たとえば、<H1>タグに対してheadingsというセクションを定義できます。これによって、ドキュメント・セット全体のこのタグ内でのみ語句を検索できます。

問合せには、WITHIN演算子を使用します。Oracle Textにより、headingsセクション内に問合せ語句を含むすべてのドキュメントを検出します。したがって、headingsセクション内にワードoracleを含むすべてのドキュメントを検索する場合は、次の問合せを入力します。

'oracle within headings'

ここでは、次の項目について説明します。

8.2.1 HTMLのセクションの作成

次のコードは、HTML_SECTION_GROUP型のhtmgroupというセクション・グループを定義します。次に、htmgroupに、<H1>タグで識別するheadingというゾーン・セクションを作成します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;

ドキュメントを次のように索引付けできます。

create index myindex on docs(htmlfile) indextype is ctxsys.context
parameters('filter ctxsys.null_filter section group htmgroup');

セクション・グループhtmgroupで索引付けした後、次のように問合せを発行してheadingセクション内を問い合せることができます。

'Oracle WITHIN heading'

8.2.2 HTMLのMetaタグの検索

HTMLドキュメントの場合は、<META>タグのNAME/CONTENTのペアにセクションを作成できます。セクションの作成時に、検索をCONTENT内のテキストに制限できます。

8.2.2.1 例: <META>タグに対するセクションの作成

次のようなMETAタグを持つHTMLドキュメントがあるとします。

<META NAME="author" CONTENT="ken">

NAME値がauthorであるMETAタグについて、すべてのCONTENT属性を索引付けるゾーン・セクションを作成します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'author', 'meta@author');
end

セクション・グループhtmgroupで索引付けした後、次のようにドキュメントを問い合せることができます。

'ken WITHIN author'

8.3 Oracle Textを使用したXMLのセクション検索

HTMLドキュメントと同様、XMLドキュメントにもタグ付きテキストがあります。このタグ付きテキストを使用してテキストのブロックを定義すると、セクション検索を実行できます。セクションの内容は、WITHIN演算子またはINPATH演算子を使用して検索できます。

次の各項では、様々なタイプのXML検索について説明します。

8.3.1 自動セクション

セクション・グループAUTO_SECTION_GROUPを使用してXMLドキュメントからセクションを自動的に作成するように索引付け操作を設定できます。システムは、XMLタグに対してゾーン・セクションを作成します。属性セクションは、属性を持つタグに対して作成され、tag@attributeという形式でネーミングされます。

たとえば、次の文は、AUTO_SECTION_GROUPを使用してXMLファイルを含む列に索引myindexを作成します。

CREATE INDEX myindex
ON xmldocs(xmlfile)
 INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
             filter ctxsys.null_filter
             section group ctxsys.auto_section_group'
           );

8.3.2 属性検索

XML属性テキストは、次のいずれかの方法で検索できます。

  • CTX_DDL.ADD_ATTR_SECTIONを使用して属性セクションを作成し、次にXML_SECTION_GROUPを使用して索引付けします。索引付け時にAUTO_SECTION_GROUPを使用すると、属性セクションは自動的に作成されます。属性セクションは、WITHIN演算子で問い合せることができます。

  • PATH_SECTION_GROUPを使用して索引付けし、INPATH演算子で属性テキストを問い合せます。

8.3.2.1 属性セクションの作成

次のように、TITLE属性を持つBOOKタグを定義するXMLファイルがあるとします。

<BOOK TITLE="Tale of Two Cities">
  It was the best of times.
</BOOK>

タイトル属性を属性セクションとして定義するには、次のようにXML_SECTION_GROUPを作成し、属性セクションを定義します。

begin
ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_attr_section('myxmlgroup', 'booktitle', 'book@title');
end;

索引付けは、次のように行います。

CREATE INDEX myindex
ON xmldocs(xmlfile)
INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
             filter ctxsys.null_filter
             section group myxmlgroup'
           );

XML属性セクションbooktitleは、次のように問い合せることができます。

'Cities within booktitle'

8.3.2.2 INPATH演算子による属性の検索

属性テキストは、INPATH演算子を使用して検索できます。そのためには、XMLドキュメント・セットをPATH_SECTION_GROUPで索引付けする必要があります。

8.3.3 ドキュメント・タイプ別のセクションの作成

異なるドキュメント・タイプに対して宣言された<book>タグを持つXMLドキュメント・セットの場合、各ドキュメント・タイプに対して個別のbookセクションを作成する必要がある場合があります。次の例では、各ドキュメント・タイプに対してbookセクションを作成して検索機能を改善する方法を示します。

mydocname1がXMLドキュメント・タイプ(ルート要素)として、次のように宣言されているとします。

<!DOCTYPE mydocname1 ... [...

mydocname1の中で、要素<book>が宣言されています。このタグに対し、タグのドキュメント・タイプを区別するmybooksec1という名前のセクションを次のように作成できます。

begin
ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_zone_section('myxmlgroup', 'mybooksec1', 'mydocname1(book)');
end;

mydocname2が別のXMLドキュメント・タイプ(ルート要素)として、次のように宣言されているとします。

<!DOCTYPE mydocname2 ... [...

mydocname2の中で、要素<book>が宣言されています。このタグに対し、タグのドキュメント・タイプを区別するmybooksec2という名前のセクションを次のように作成できます。

begin
ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_zone_section('myxmlgroup', 'mybooksec2', 'mydocname2(book)');
end;

セクションmybooksec1内で問合せを行うには、WITHINを次のように使用します。

'oracle within mybooksec1'

8.3.4 パス・セクション検索

XMLドキュメントには、次のような親子タグの構造を設定できます。

<A> <B> <C> dog </C> </B> </A>

この例のタグCは、タグAの子であるタグBの子です。

Oracle Textでは、PATH_SECTION_GROUPを使用してパス検索を実行できます。このセクション・グループを使用すると、問合せ内に直接の親子関係を指定できます。たとえば、要素Bの子である要素Cにある語句dogを含むすべてのドキュメントを検索できます。

PATH_SECTION_GROUPを使用すると、属性値検索および属性の等価性のテストも実行できます。

この機能に関連する新しい演算子は、次のとおりです。

  • INPATH

  • HASPATH

8.3.4.1 PATH_SECTION_GROUPによる索引の作成

パス・セクション検索を使用可能にするには、PATH_SECTION_GROUPを使用してXMLドキュメント・セットを索引付けします。たとえば、次の式を使用します。

プリファレンスを作成します。

begin
ctx_ddl.create_section_group('xmlpathgroup', 'PATH_SECTION_GROUP');
end;

索引を作成します。

CREATE INDEX myindex
ON xmldocs(xmlfile)
INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
             filter ctxsys.null_filter
             section group xmlpathgroup'
           );


索引を作成するときに、INPATH演算子とHASPATH演算子を使用できます。

8.3.4.2 トップレベルのタグ検索

トップレベルのタグ<A>に、語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH (/A)

または

dog INPATH(A)

8.3.4.3 任意レベルのタグ検索

任意レベルの<A>タグに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH(//A)

この問合せは、次のドキュメントを検出します。

<A>dog</A>

および

<C><B><A>dog</A></B></C>

8.3.4.4 直接の親子関係の検索

トップレベルの要素Aの直接の子である要素Bに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH(A/B)

この問合せは、次のXMLドキュメントを検出します。

<A><B>My dog is friendly.</B></A>

ただし、次のドキュメントは検出しません。

<C><B>My dog is friendly.</B></C>

8.3.4.5 タグ値のテスト

タグの値をテストできます。たとえば、次の問合せがあるとします。

dog INPATH(A[B="dog"])

この問合せは、次のドキュメントを検出します。

<A><B>dog</B></A>

ただし、次のドキュメントは検出しません。

<A><B>My dog is friendly.</B></A>

8.3.4.6 属性検索

属性の内容を検索できます。たとえば、次の問合せがあるとします。

dog INPATH(//A/@B)

この問合せは、次のドキュメントを検出します。

<C><A  B="snoop dog"> </A> </C>

8.3.4.7 属性値のテスト

属性の値をテストできます。たとえば、次の問合せがあるとします。

California INPATH (//A[@B = "home address"])

この問合せは、次のドキュメントを検出します。

<A B="home address">San Francisco, California, USA</A>

ただし、次のドキュメントは検出しません。

<A B="work address">San Francisco, California, USA</A>

8.3.4.8 パスのテスト

HASPATH演算子を使用して、パスの存在をテストできます。たとえば、次の問合せがあるとします。

HASPATH(A/B/C)

この問合せは、ドキュメントを検出し、スコア100を戻します。

<A><B><C>dog</C></B></A>

この問合せでは、dogは参照されません。

8.3.4.9 HASPATHによるセクションの等価性のテスト

HASPATH演算子を使用すると、セクションの等価性をテストできます。たとえば、次の問合せがあるとします。

dog INPATH A

この問合せは、次のドキュメントを検出します。

<A>dog</A>

さらに、次のドキュメントも検出します。

<A>dog park</A>

問合せを、語句dogのみに制限し、それ以外の語句を検索しないようにする場合は、HASPATH演算子によるセクションの等価性のテストを使用できます。たとえば、次の問合せがあるとします。

HASPATH(A="dog")

この問合せは、最初のドキュメントを検索し、スコア100を戻します。2番目のドキュメントは検索しません。


関連項目:


INPATHおよびHASPATH演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。