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番目のドキュメントは検索しません。