この章では、Oracle Textの問合せアプリケーションでドキュメントのセクションを使用する方法を説明します。
次の項目について説明します。
セクション検索を使用すると、テキスト問合せをドキュメント内のテキストのブロックに絞り込むことができます。セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に有効です。
また、テキストを文レベルと段落レベルで検索できます。
この項の内容は次のとおりです。
ドキュメント・コレクションのセクション検索を使用可能にする手順は、次のとおりです。
セクション・グループを作成します。
セクションを定義します。
ドキュメントを索引付けします。
WITHIN
、INPATH
またはHASPATH
の各演算子を使用してセクションを検索します。
セクション検索を使用可能にするには、セクション・グループを定義します。システム定義のセクション・グループのいずれかを使用して、セクション・グループのインスタンスを作成します。ドキュメント・コレクションに適したセクション・グループを選択します。
セクション・グループを使用して、所有しているドキュメント・セットのタイプを指定し、タグ構造を明示的に示します。たとえば、HTMLタグ付きのドキュメントを索引付けするには、HTML_SECTION_GROUP
を使用します。同様に、XMLタグ付きのドキュメントを索引付けするには、XML_SECTION_GROUP
を使用します。
表8-1は、使用可能な各種のセクション・グループを示しています。
表8-1 セクション・グループのタイプ
セクション・グループ・プリファレンス | 説明 |
---|---|
これはデフォルトです。どのセクションも定義しない場合、または |
|
開始および終了タグが 注意: このグループ・タイプでは、片方のみのカッコ、コメント・タグおよび属性などの入力はサポートしません。このような入力には |
|
HTMLドキュメントを索引付けし、HTMLドキュメントにセクションを定義します。 |
|
XMLドキュメントを索引付けし、XMLドキュメントにセクションを定義します。 |
|
XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。 属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、tag@attributeという形式でネーミングされます。 停止セクション、空のタグ、処理の指示およびコメントは、索引付けされません。 自動セクション・グループには次の制限事項が適用されます。
|
|
|
XMLドキュメントを索引付けします。このタイプは、 相違点は、このセクション・グループを使用すると、 |
RFC 1036に基づいて、ニュース・グループ形式のドキュメントのセクションを定義します。 |
注意: HTML 、XML 、AUTO およびPATH セクショナに送られるドキュメントは、\s*< で始まる必要があります(\s* は0文字以上の空白文字を表します)。それ以外のドキュメントはプレーンテキスト・ドキュメントとして処理され、いずれのセクションも認識されません。 |
CTX_DDL
パッケージを使用してセクション・グループを作成し、セクション・グループの構成要素としてセクションを定義します。たとえば、HTMLドキュメントを索引付けするには、HTML_SECTION_GROUP
を使用してセクション・グループを作成します。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); end;
セクションは、セクション・グループの構成要素として定義します。次の例では、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ドキュメント・コレクションを索引付けする場合は、セクションを明示的に定義する必要はありません。これは、システムが索引付け時にセクションを定義するためです。 |
関連項目:
|
ドキュメントの索引付け時に、セクション・グループをCREATE
INDEX
のPARAMETERS句に指定します。
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group htmgroup');
ドキュメントが索引付けされている場合は、WITHIN
演算子を使用して、セクション内を問い合せることができます。たとえば、ドキュメントのヘッダー内にワードOracleを含むすべてのドキュメントを検索するには、次の問合せを入力します。
'Oracle WITHIN heading'
関連項目: WITHIN 演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。 |
PATH_SECTION_GROUP
を使用した場合、システムは自動的にXMLセクションを作成します。WITHIN
演算子を使用して問合せを入力できる他、INPATH
演算子とHASPATH
演算子を使用してパス検索を入力できます。
関連項目:
|
セクション・タイプはすべて、ドキュメント内のテキストのブロックです。ただし、セクションを区切る方法や索引内での記録方法にそれぞれ相違があります。セクションは、次のタイプのいずれかです。
表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 |
ゾーン・セクションは、ドキュメント内の開始タグと終了タグで区切られたテキストの本体です。開始タグと終了タグの位置は索引内に記録されているため、タグで囲まれたワードはそのセクション内に存在するとみなされます。ゾーン・セクションのインスタンスすべてに開始タグと終了タグが付いている必要があります。
たとえば、<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
セクションの同じインスタンス内にcatとdogを含むドキュメントが検出されます。
ゾーン・セクションは繰返しが可能です。各繰返しは別々のセクションとして処理されます。たとえば、<H1>がheading
セクションを示す場合は、次のように、同じドキュメント内で繰り返すことができます。
<H1> The Brown Fox </H1> <H1> The Gray Wolf </H1>
これらのゾーン・セクションがHeading
という名前の場合、問合せBrown WITHIN Headingはこのドキュメントを戻します。ただし、(Brown and Gray) WITHIN Headingという問合せはこのドキュメントを戻しません。
ゾーン・セクションは互いにオーバーラップできます。たとえば、<B>
と<I>
が2つの異なるゾーン・セクションを示す場合、これらはドキュメント内で次のようにオーバーラップできます。
plain <B> bold <I> bold and italic </B> only italic </I> plain
ゾーン・セクションは(それ自体も含めて)、次のようにネストできます。
<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のみを戻します。
フィールド・セクションは、ゾーン・セクションと同じように、開始タグと終了タグで区切られたテキストの範囲です。フィールド・セクションがゾーン・セクションと異なる点は、その範囲がドキュメントの残りの部分とは別に索引付けされることです。
フィールド・セクションは異なる方法で索引付けされるため、大量のドキュメントが索引付けされている場合は、ゾーン・セクションに比べて問合せパフォーマンスが向上します。
フィールド・セクションは、ドキュメント内のセクションに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;
停止セクションは、自動セクション・グループに追加できます。停止セクションを追加すると、自動セクション索引付け演算子によってXMLドキュメントの特定のセクションが無視されます。
注意: 停止セクションを追加すると、索引にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索できます。 |
ユーザーのドキュメントに多数の下位レベルの情報タグが含まれているときに、停止セクションを追加すると役立ちます。停止セクションの追加により、自動セクション・グループのパフォーマンスもまた改善されます。
追加できる停止セクションの数は無制限です。
停止セクションにはセクション名がないため、セクション・ビューに記録されません。
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
索引、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
はコミットを行わないため、両方をコールするとアプリケーションでデッドロックが発生する可能性があります。デッドロックを回避するのはアプリケーションの役割です。
関連項目:
|
NDATA
セクションをBASIC_SECTION_GROUP
、HTML_SECTION_GROUP
、またはXML_SECTION_GROUP
セクション・グループ・タイプに追加して、名前検索用に索引付けするデータを含むフィールドを排他的に指定できます。
ユーザーは、使用可能な2つのデータストア(MULTI_COLUMN_DATASTORE
またはUSER_DATASTORE
)を使用して、名前データを含むテキスト・ドキュメントを合成できます。次に、MULTI_COLUMN_DATASTORE
を使用して、索引付けする名前データを含む関連する列を選択する例を示します。
create table people(firstname varchar2(80), surname varchar2(80)); insert into people values('John', 'Smith'); commit; begin ctx_ddl.create_preference('nameds', 'MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('nameds', 'columns', 'firstname,surname'); end; /
これにより、索引付けに使用する次の仮想テキストが作成されます。
<FIRSTNAME> John </FIRSTNAME> <SURNAME> Smith </SURNAME>
これで、FIRSTNAME
およびSURNAME
セクションにNDATA
セクションを作成できます。
begin ctx_ddl.create_section_group('namegroup', 'BASIC_SECTION_GROUP'); ctx_ddl.add_ndata_section('namegroup', 'FIRSTNAME', 'FIRSTNAME'); ctx_ddl.add_ndata_section('namegroup', 'SURNAME', 'SURNAME'); end; /
次に、以前に作成したデータストア・プリファレンスとセクション・グループ・プリファレンスを使用して、索引を作成します。
create index peopleidx on people(firstname) indextype is ctxsys.context parameters('section group namegroup datastore nameds');
NDATA
セクションでは、シングルバイト・データとマルチバイト・データの両方がサポートされていますが、文字および語句に関する制約があります。索引付けされるNDATA
セクション・データには、次のような制約があります。
1文字の空白で区切られた語句の文字数
511
空白で区切られた語句の数
255
空白を含む文字の総数
511
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>
関連項目:
|
特殊セクションは、タグで認識されるのではありません。現在サポートされている特殊セクションは、文と段落のみです。特殊セクションを使用すると、文または段落内のワードの組合せを検索できます。
文および段落の境界はレクサーにより決定されます。たとえば、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;
HTMLには、セクション検索に使用できるタグ付きテキスト形式の内部構造があります。たとえば、<H1>
タグに対してheadingsというセクションを定義できます。これによって、ドキュメント・セット全体のこのタグ内でのみ語句を検索できます。
問合せには、WITHIN
演算子を使用します。Oracle Textにより、headingsセクション内に問合せ語句を含むすべてのドキュメントを検出します。したがって、headingsセクション内にワードoracleを含むすべてのドキュメントを検索する場合は、次の問合せを入力します。
'oracle within headings'
この項の内容は次のとおりです。
次のコードは、HTML_SECTION_GROUP
型のセクション・グループhtmgroup
を定義します。次に、<H1>タグで識別されるheading
というゾーン・セクションをhtmgroup
内に作成します。
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'
HTMLドキュメントの場合は、<META>タグのNAME/CONTENT
のペアにセクションを作成できます。セクションの作成時に、検索をCONTENT
内のテキストに制限できます。
<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'
HTMLドキュメントと同様、XMLドキュメントにもタグ付きテキストがあるため、これを使用して、セクション検索を行うテキストのブロックを定義できます。セクションの内容は、WITHIN
演算子またはINPATH
演算子を使用して検索できます。
次の各項では、様々なタイプのXML検索について説明します。
セクション・グループ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' );
XML属性テキストは、次のいずれかの方法で検索できます。
CTX_DDL
.ADD_ATTR_SECTION
を使用して属性セクションを作成し、次にXML_SECTION_GROUP
を使用して索引付けします。索引付け時にAUTO_SECTION_GROUP
を使用すると、属性セクションは自動的に作成されます。属性セクションは、WITHIN
演算子で問い合せることができます。
PATH_SECTION_GROUP
を使用して索引付けし、INPATH
演算子で属性テキストを問い合せます。
次のように、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'
異なるドキュメント・タイプに対して宣言された<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'
XMLドキュメントには、次のような親子タグの構造を設定できます。
<A> <B> <C> dog </C> </B> </A>
この例のタグCは、タグAの子であるタグBの子です。
Oracle Textでは、PATH_SECTION_GROUP
を使用してパス検索を実行できます。このセクション・グループを使用すると、問合せ内に直接の親子関係を指定できます。たとえば、要素Bの子である要素Cにある語句dogを含むすべてのドキュメントを検索できます。
PATH_SECTION_GROUP
を使用すると、属性値検索および属性の等価性のテストも実行できます。
この機能に関連する新しい演算子は、次のとおりです。
INPATH
HASPATH
パス・セクション検索を使用可能にするには、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
演算子を使用できます。
トップレベルのタグ<A>に、語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。
dog INPATH (/A)
または
dog INPATH(A)
任意レベルの<A>タグに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。
dog INPATH(//A)
この問合せは、次のドキュメントを検出します。
<A>dog</A>
および
<C><B><A>dog</A></B></C>
トップレベルの要素Aの直接の子である要素Bに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。
dog INPATH(A/B)
この問合せは、次のXMLドキュメントを検出します。
<A><B>My dog is friendly.</B></A>
ただし、次のドキュメントは検出しません。
<C><B>My dog is friendly.</B></C>
タグの値をテストできます。たとえば、次の問合せがあるとします。
dog INPATH(A[B="dog"])
この問合せは、次のドキュメントを検出します。
<A><B>dog</B></A>
ただし、次のドキュメントは検出しません。
<A><B>My dog is friendly.</B></A>
属性の内容を検索できます。たとえば、次の問合せがあるとします。
dog INPATH(//A/@B)
この問合せは、次のドキュメントを検出します。
<C><A B="snoop dog"> </A> </C>
属性の値をテストできます。たとえば、次の問合せがあるとします。
California INPATH (//A[@B = "home address"])
この問合せは、次のドキュメントを検出します。
<A B="home address">San Francisco, California, USA</A>
ただし、次のドキュメントは検出しません。
<A B="work address">San Francisco, California, USA</A>
HASPATH
演算子を使用して、パスの存在をテストできます。たとえば、次の問合せがあるとします。
HASPATH(A/B/C)
この問合せは、ドキュメントを検出し、スコア100を戻します。
<A><B><C>dog</C></B></A>
この問合せでは、dogは参照されません。
HASPATH
演算子を使用すると、セクションの等価性をテストできます。たとえば、次の問合せがあるとします。
dog INPATH A
この問合せは、次のドキュメントを検出します。
<A>dog</A>
さらに、次のドキュメントも検出します。
<A>dog park</A>
問合せを、語句dogのみに制限し、それ以外の語句を検索しないようにする場合は、HASPATH
演算子によるセクションの等価性のテストを使用できます。たとえば、次の問合せがあるとします。
HASPATH(A="dog")
この問合せは、最初のドキュメントを検索し、スコア100を戻します。2番目のドキュメントは検索しません。
関連項目: INPATH およびHASPATH 演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。 |