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

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

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

11.3.1 自動セクション

XMLドキュメントからセクションを自動的に作成するように索引付け操作を設定するには、AUTO_SECTION_GROUPセクション・グループを使用します。システムは、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'
           );

11.3.2 属性検索

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

  • 属性セクションの作成

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

    次のように、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'
               );
    

    booktitle XML属性セクションを問い合せるには:

    'Cities within booktitle'
  • INPATH演算子による属性の検索

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

関連項目:

パス・セクション検索

11.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'

11.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

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

11.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演算子を使用できます。

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

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

dog INPATH (/A)

または

dog INPATH(A)

11.3.4.3 任意レベルのタグ検索

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

dog INPATH(//A)

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

<A>dog</A>

および

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

11.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>

11.3.4.5 タグ値のテスト

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

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

は、次のドキュメントを検索します。

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

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

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

11.3.4.6 属性検索

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

dog INPATH(//A/@B)

は、次のドキュメントを検索します:

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

11.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>

11.3.4.8 パスのテスト

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

HASPATH(A/B/C)

は、次のドキュメントを検索して、スコア100を戻します。

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

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

11.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リファレンス』を参照してください。