この章では、空間述語およびテキスト述語を使用する式について説明します。Expressionデータ型の列に格納されている式には、次の述語を指定できます。
注意: 格納されている式で空間述語を使用するには、Oracle Spatialまたはロケータ・コンポーネントがインストールされている必要があります。 |
表の列に格納される式には、SDO_GEOMERTY
属性で定義された空間述語を含めることができます。この項では、第11章で紹介したCar4Saleの例を使用して空間述語の適用方法について説明します。そのために、販売対象となる各自動車について公開される情報には、Model
、Price
、Mileage
およびYear
属性のみでなくLocation
属性も含まれています。Location
属性には、自動車の位置に関する地理的な座標がSDO_GEOMETRY
データ型のインスタンスとして含まれています。
Location
属性を使用すると、自動車に関心を持っている顧客は、指定した距離、たとえば自分の居場所から半マイル以内にある自動車のみに検索を制限できます。この検索制限は、SDO_WITHIN_DISTANCE
演算子を含む次の空間述語を使用して指定できます。
SDO_WITHIN_DISTANCE( Location, SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(-77.03644, 37.89868, NULL), NULL, NULL ) , 'distance=0.5 units=mile' ) = 'TRUE'
空間述語は、空間索引を利用することで効率的に評価されます。第14.1.1項および第14.1.2項では、任意の式での空間述語の指定方法および適切な空間索引を使用したこの述語の評価方法について、それぞれ説明します。
オラクル社が提供するSDO_GEOMETRY
データ型を使用すると、問合せの標準SQL WHERE
句の中で空間ジオメトリのインスタンスに空間述語を指定できます。これらの述語では、SDO_GEOMETRY
データ型のインスタンスにSDO_WITHIN_DISTANCE
やSDO_RELATE
などの演算子を使用し、特定の方法で2つの空間ジオメトリを関連付けます。詳細は、『Oracle Spatial開発者ガイド』を参照してください。
式セットで空間述語を許可するには、次の例に示すように、MDSYS.SDO_GEOMETRY
データ型の属性を使用して対応する属性セットを作成する必要があります。
CREATE OR REPLACE TYPE Car4Sale AS OBJECT (Model VARCHAR2(20), Year NUMBER, Price NUMBER, Mileage NUMBER, Location MDSYS.SDO_GEOMETRY); / BEGIN dbms_expfil.create_attribute_set (attr_set => 'Car4Sale', from_type => 'YES'); END; /
空間属性に対して述語を指定し、効率を上げるためにその述語を索引付けするには、ディメンション、下限、上限、および各ディメンションの許容差を記述したジオメトリ・メタデータが、この属性セットの各空間ジオメトリ属性に関連付けられている必要があります。このメタデータ情報は、表名のかわりに属性セット名を使用して、USER_SDO_GEOM_METADATA
ビューに挿入できます。USER_SDO_GEOM_METADATA
ビューとそのセマンティクスの詳細は、『Oracle Spatial開発者ガイド』を参照してください。
INSERT INTO user_sdo_geom_metadata VALUES ('CAR4SALE','LOCATION', mdsys.sdo_dim_array( mdsys.sdo_dim_element('X', -180, 180, 0.5), mdsys.sdo_dim_element('Y', -90, 90, 0.5)), 8307);
1つ以上のSDO_GEOMETRY
属性を含む属性セットを使用した式セットには、次の例に示すように、SDO_WITHIN_DISTANCE
演算子またはSDO_RELATE
演算子を使用してこれらの属性の述語を指定できます。
Model = 'Taurus' and Price < 15000 and Mileage < 25000 and SDO_WITHIN_DISTANCE (Location, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(-77.03644, 37.89868, NULL), NULL, NULL), 'distance=0.5 units=mile') = 'TRUE'
Model = 'Taurus' and Price < 15000 and Mileage < 25000 and SDO_RELATE (Location, SDO_GEOMETRY(2001, 8307, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3), SDO_ORDINATE_ARRAY(-77.03644, 37.89868, -75, 39), 'mask=anyinteract') = 'TRUE'
完全な非空間述語を使用した式の場合とは異なり、式フィルタ索引が式セット用に定義されていない場合、空間述語を使用した式は評価できないことに注意してください。式の格納列に式フィルタ索引を作成した後は、他の属性値とともにLocation
属性に関するSDO_GEOMETRY
データ型のインスタンスをEVALUATE
演算子に渡し、データ項目に対して空間述語を使用した式を処理できます。
SELECT * FROM Consumer WHERE EVALUATE (Interest, sys.anyData.convertObject( Car4Sale('Mustang', 2002, 20000, 250000, SDO_GEOMETRY(2001, 8307, sdo_point_type(-77.03644, 38.9059284, null), null, null))) ) = 1;
前述の問合せでは、空間述語と非空間述語に基づいてTRUEとなる式を持つ行がすべて識別されます。
格納されている式の空間述語は、その空間述語で指定したジオメトリに作成したカスタム空間索引を使用して処理されます。これらの空間索引は、式の格納列に式フィルタ索引が作成されると自動的に作成されます。空間索引がない場合、空間述語を使用した式は処理できません。したがって、式フィルタ索引は、このような式を評価するために常に必要です。
式の列に式フィルタ索引が定義されている場合、対応する属性セットの空間属性は、すべて索引付き述語グループとみなされます。述語表には、各属性に対するSDO_GEOMETRY
型の列があり、空間索引は、これらの列で作成されます。述語表のSDO_GEOMETRY
列に格納される値は、対応する属性を含む空間述語で指定した値に基づいて計算されます。
データ項目について式が評価されると、ジオメトリ列で作成された空間索引は、他の索引付き述語グループに対して作成されたビットマップ索引と結合し、すべての索引付き述語グループに基づいてFALSEである式を除外します。作業セットに残っている式は、指定したデータ項目に対してTRUEであるすべての式を識別するために、格納されている述語グループとまばらな述語に基づいてさらに評価されます。
格納されている式のテキスト述語は、SQL-WHERE句構文内のCONTAINS演算子を使用して指定されます。テキスト述語には、属性名で検索される文書およびテキスト問合せ式が含まれています。テキスト問合せ式によって文書内で検索されるテキスト・パターンが指定され、CONTEXT文法を使用して表されます(『Oracle Textアプリケーション開発者ガイド』を参照)。
Model='Taurus' and Price < 15000 and Mileage < 25000 AND CONTAINS (InsReport, 'near(water, damage), 4)') = 1
テキスト分類エンジンにより、現在、表の列へ(テキスト)問合せ式を格納し、受け取った文書に対して問合せ式を処理できます。受け取った文書は、SQL問合せ内のMATCHES演算子を使用して格納されている式と照合されます。文書と格納されている式を照合する必要のあるメタデータは、問合せ式を格納する列に定義されているCTXRULE索引から取得されます。このメタデータには、使用するLEXERの型およびSTOP言語のリストのようなテキスト・プリファレンスについての情報が含まれています。このメタデータは、索引の作成時にCTXRULE索引に割り当てられており、したがって、CTXRULE索引が列に存在する場合、MATCHES演算子は唯一の演算子です。
格納されている式のテキスト述語に対するサポートは、テキスト分類エンジンおよび式フィルタ機能の統合によって提供されます。これらの格納されている式では、SQL WHERE句構文を使用して、テキスト述語を他のテキスト述語、スカラーまたはXML述語と結合できます。テキスト述語は、評価される必要のあるテキスト問合せ式のテキスト属性を識別するCONTAINS演算子を使用して指定されます。テキスト問合せ式は、式の評価時に、テキスト属性に割り当てられる文書と照合されます。この一致する操作に必要なテキスト・プリファレンスは、メタデータの形式としてテキスト属性に割り当てられています。
Expression列に作成された属性セットでは、テキスト属性は、関連テキスト・プリファレンスのCLOBデータ型またはVARCHARデータ型の属性として識別されます。このような属性は、格納されている式内のテキスト述語を形成するCONTAINS演算子に対する最初の引数として使用できます。属性のテキスト・プリファレンスは、文字列形式のテキスト・プリファレンスを受け取るEXF$TEXT型のインスタンスを使用して指定されます。文字列形式は、たとえば、LEXER insrpt_lexer WORDLIST insrpt_wordlist
です。この引数を介して指定されたプリファレンスは、属性にバインドされた文書の解析および、ctxsys.CTXRULE
索引タイプを使用したテキスト問合せ式の索引付けに使用されます。または、空のプリファレンス文字列を含むEXF$TEXTインスタンスは、CTXRULE索引のデフォルトのプリファレンスの使用に割り当てられます(『Oracle Textリファレンス』を参照)。
begin dbms_expfil.create_attribute_set(attr_set => 'Car4Sale'); // create scalar attributes dbms_expfil.add_elementary_attribute( attr_set => 'Car4Sale', attr_name => 'Model', attr_type => 'VARCHAR2(30)'); dbms_expfil.add_elementary_attribute( attr_set => 'Car4Sale', attr_name => 'Price', attr_type => 'NUMBER'); . . . // create text attribute dbms_expfil.add_elementary_attribute( attr_set => 'Car4Sale', attr_name => 'InsReport', attr_type => 'CLOB' attr_type => exf$text( 'LEXER insrpt_lexer WORDLIST insrpt_wordlist')); end;
注意: 1つ以上のテキスト属性で構成される属性セットは、構成にADD_ELEMENTARY_ATTRIBUTEプロシージャを使用する必要があり、既存のオブジェクト型からは作成できません。 |
前述の属性セットでは、LEXERプリファレンスinsrpt_lexer
およびWORDLISTプリファレンスinsrpt_wordlist
はCTX_DDLパッケージを使用して作成される必要があります(『Oracle Textリファレンス』を参照)。
テキスト属性の属性セットが、Expression列のメタデータとして使用されている場合、列に格納されている式をテキスト述語に含めることができます。テキスト述語内で使用されるテキスト問合せ式では、CONTEXT文法のサブセットが使用され、CONTEXT演算子(ABOUT、AND、NEAR、NOT、OR、STEM、WITHINおよびTHESAURUS)を使用した近接検索やテーマ検索などがサポートされます。(構文の詳細は、『Oracle Textアプリケーション開発者ガイド』の文書の分類に関する項を参照)。格納されている式のスカラー述語は、式がExpressionデータ型の列に挿入されている場合に、構文およびセマンティクスの正当性が検証されます。ただし、CONTAINS演算子に第2の引数として指定されているテキスト問合せ式は、索引の作成時または索引のメンテナンス時まで検証されません。索引の作成時に識別されたテキスト問合せ式は、CTX_USER_INDEX_ERRORS
ビューを介して報告されます。次に説明します。
単にスカラー述語を含む式の場合とは異なり、テキスト属性の述語を含む式は、式フィルタ索引が式を格納する列に定義されていない場合は評価されません。索引の作成時に、すべてのテキスト属性は索引付き述語グループに追加され、CTXRULE索引はこれらの述語グループそれぞれの述語表に作成されます。また、テキスト述語グループへのCTXRULE索引の作成によって、対応するテキスト問合せ式のエラーが識別され、これらのエラーはCTX_USER_INDEX_ERRORS
ビューに報告されます(『Oracle Textリファレンス』を参照)。ただし、このビューに報告されたエラーは、式フィルタ索引の述語表構造の行を参照しています。これらのエラーは、USER_EXPFIL_TEXT_INDEX_ERRORS
ビューを使用してユーザー表の行にマップできます。
索引が定義されると、格納されている式はSQL問合せのEVALUATE演算子を使用して評価されます。属性セットが1つ以上のテキスト属性で定義されている場合は、データ項目はこれらの属性に割り当てられている対応する値(VARCHARまたはCLOB)で構成されているEVALUATE演算子に渡されます。
SELECT * FROM Consumer WHERE EVALUATE (Interest, AnyData.convertObject( Car4Sale('Mustang',19000,25000,2001, '...4 star crash test rating ...') = 1
EVALUATE演算子を持つ前述の問合せでは、テキスト述語および非テキスト述語に基づいてTRUEに評価されたすべての式が識別されます。
式フィルタ索引が式を格納する列に定義されている場合、最も一般的で選択的なスカラー述語およびXPath述語がエンド・ユーザーによって識別され、このような述語を作成するために述語表が作成されます。式フィルタ索引に述語グループを選択する場合、テキスト属性を含む述語は索引付け述語グループに含まれない場合があります。述語表はVARCHAR列で作成され、テキスト属性に指定されたテキスト問合せ式が格納され、CTXRULE索引はこの列に定義されます。これらの索引は、他の索引付き述語に定義されているビットマップ索引とともに、データ項目の式を効率的に処理されます。
EVALUATE演算子を含む問合せが発行されると、データ項目から渡された値は述語表の問合せにバインドされます。述語表問合せには、テキスト問合せ式を格納する列のMATCHES演算子が使用され、受け取った文書と格納されているテキスト問合せ式が照合されます。MATCHES演算子には内部的にCTXRULE索引が使用され、テキスト問合せ式が効率的に処理され、文書と一致する式のサブセットが戻されます。文書とテキスト問合せ式との照合結果には、他のスカラー述語とXPath述語の照合結果が結合され、作業セットをすべての索引付き述語グループに基づいてTRUEに評価された候補式のセットに絞り込みます。格納されている述語グループおよびまばらな述語の処理には、式セットのテキスト述語が含まれ、そのまま残ります。
テキスト述語に対するDMLメンテナンスの遅延
Expressionデータ型列に格納されているデータへの変更は、実際にすべて処理されます。つまり、Expression列への変更は自動的に対応する式フィルタ索引に反映されます。ただし、格納されている式内のテキスト問合せ式への変更は、対応するCTXRULE索引に即時に反映されません。索引のメンテナンスは手動で索引を同期化すると実行され、CTXRULE索引が同期化されるまでは式フィルタ索引には(古いテキスト述語および新しいスカラー述語に基づいて)不正確な結果が戻されます。表に格納されている式セットに定義されている1つ以上のCTXRULE索引は、DBMS_EXPFIL.SYNC_TEXT_INDEXES
プロシージャ・コールを使用してすべて同期化されます。1つ以上のExpression列を持つユーザー表の名前は、唯一の引数としてこのプロシージャ・コールに渡されます。
begin dbms_expfil.sync_text_indexes (expr_tab => 'Consumer'); end;
前述のコマンドが正常に完了したCTX_DDLパッケージのEXECUTE権限を持つ必要があります。DBMS_EXPFIL.SYNC_TEXT_INDEXES
プロシージャへのコールによって、式セットに新しく追加されたすべてのテキスト述語または変更されたすべてのテキスト述語が処理され、対応するCTXRULE索引が同期化されます。この処理に識別されているテキスト述語エラーはUSER_EXPFIL_TEXT_INDEX_ERRORS
ビューによって報告されます。