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に変更されます。