MATCHES
問合せでは、指定したドキュメントに一致する問合せ表内のすべての行を検索します。表querytable
にCTXRULE
索引が関連付けられている場合、次の問合せを入力します。
SELECT classification FROM querytable WHERE MATCHES(query_string,:doc_text) > 0;
バインド変数:doc_text
には、分類されるドキュメントCLOB
が含まれています。
次の簡単な例に、すべてをまとめて示します。
create table queries ( query_id number, query_string varchar2(80) ); insert into queries values (1, 'oracle'); insert into queries values (2, 'larry or ellison'); insert into queries values (3, 'oracle and text'); insert into queries values (4, 'market share'); create index queryx on queries(query_string) indextype is ctxsys.ctxrule; select query_id from queries where matches(query_string, 'Oracle announced that its market share in databases increased over the last year.')>0
この問合せでは、問合せ1(ドキュメントにoracleというワードが表示される)および4(ドキュメントにmarket shareという語句が表示される)が返され、問合せ2(larryおよびellisonというワードは表示されない)および3(ドキュメント内にテキストがないため問合せに一致しない)は返されません。
この例では、簡略化するために、ドキュメントを文字列として渡しています。通常は、ドキュメントはバインド変数で渡されます。
MATCHES問合せで使用されるドキュメント・テキストは、VARCHAR2
またはCLOB
になります。BLOB
入力は使用できないため、フィルタ処理済のドキュメントに直接一致させることはできません。かわりに、AUTO_FILTER
フィルタを使用してバイナリ・コンテンツをCLOB
にフィルタ処理する必要があります。次の例では、ドキュメント・データがバインド変数:doc_blob
内にあることと、CTX_DOC.POLICY_FILTER
が使用できるポリシーmy_policy
がすでに定義されていることの2つを前提としています。次に例を示します。
declare doc_text clob; begin -- create a temporary CLOB to hold the document text doc_text := dbms_lob.createtemporary(doc_text, TRUE, DBMS_LOB.SESSION); -- create a simple policy for this example ctx_ddl.create_preference(preference_name => 'fast_filter', object_name => 'AUTO_FILTER'); ctx_ddl.set_attribute(preference_name => 'fast_filter', attribute_name => 'OUTPUT_FORMATTING', attribute_value => 'FALSE'); ctx_ddl.create_policy(policy_name => 'my_policy', filter => 'fast_filter); -- call ctx_doc.policy_filter to filter the BLOB to CLOB data ctx_doc.policy_filter('my_policy', :doc_blob, doc_text, FALSE); -- now do the matches query using the CLOB version for c1 in (select * from queries where matches(query_string, doc_text)>0) loop -- do what you need to do here end loop; dbms_lob.freetemporary(doc_text); end;
テキストをCLOB
に取り込んでMATCHES
問合せを入力する必要があるため、プロシージャCTX_DOC.POLICY_FILTER
によりBLOB
をCLOB
データにフィルタ処理します。これは、CTX_DDL.CREATE_POLICY
を使用してすでに作成されたポリシーの名前を1つの引数として受け取ります。
ファイルがデータベース・キャラクタ・セット内のテキストである場合、BFILE
を作成し、ファンクションDBMS_LOB.LOADFROMFILE
を使用してCLOB
にロードするか、UTL_FILE
を使用して、ファイルを一時的なCLOB
ロケータに読み込むことができます。
ファイルがAUTO_FILTER
フィルタ処理を必要とする場合は、ファイルをBLOB
にロードして、前述のように、CTX_DOC.POLICY_FILTER
をコールします。