ヘッダーをスキップ
Oracle® Textアプリケーション開発者ガイド
12cリリース1 (12.1)
B71317-04
  目次へ移動
目次
索引へ移動
索引

前
次
 

SDATAセクション

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

SDATA演算子は、非SDATAの子も持つAND演算子の子としてのみ使用する必要があります。SDATA演算子は、二次的な確認または非駆動基準として使用されることになっています。たとえば、「評価が> 4のドキュメントの検索」ではなく、「DOGという語句が含まれており、価格が> 5でもあるドキュメントの検索」に使用します。

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

SDATAセクションの作成後に、CTX_DDL.SET_SECTION_ATTRIBUTEを使用すれば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>

次の例では、ROWIDが1のドキュメントで、priceというSDATAセクションの値を新しく30000に更新します。

BEGIN
    SELECT ROWID INTO rowid_to_update FROM items WHERE id=1;

    CTX_DDL.UPDATE_SDATA('items$doc', 
                         'price',
                         SYS.ANYDATA.CONVERTVARCHAR2('30000'),
                         rowid_to_update);
END;

上の問合せを実行すると、Honda Pilotの価格が27000から30000に変更されます。

注意:

索引を再構築せずにSDATAセクションを既存の索引に追加するには、ALTER INDEX PARAMETERS文のADD SDATA SECTIONパラメータを使用します。詳細は、『Oracle Textリファレンス』のALTER INDEXセクションに関する項を参照してください。

関連項目:

  • SDATA演算子の詳細は、『Oracle Textリファレンス』のCONTAINSに関する項を参照してください

  • SDATAセクションの追加および更新と、ADD_SDATA_SECTIONSET_SECTION_ATTRIBUTEおよびUPDATE_SDATAプロシージャを使用してその属性を変更する方法については、『Oracle Textリファレンス』のCTX_DDLパッケージに関する項を参照してください