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