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をコールします。