ヘッダーをスキップ
Oracle® Textアプリケーション開発者ガイド
12cリリース1 (12.1)
B71317-04
  目次へ移動
目次
索引へ移動
索引

前
次
 

MATCHES SQL問合せ

MATCHES問合せでは、指定したドキュメントに一致する問合せ表内のすべての行を検索します。表querytableCTXRULE索引が関連付けられている場合、次の問合せを入力します。

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によりBLOBCLOBデータにフィルタ処理します。これは、CTX_DDL.CREATE_POLICYを使用してすでに作成されたポリシーの名前を1つの引数として受け取ります。

関連項目:

CTX_DOC.POLICY_FILTERの詳細は、『Oracle Textリファレンス』を参照してください

ファイルがデータベース・キャラクタ・セット内のテキストである場合、BFILEを作成し、ファンクションDBMS_LOB.LOADFROMFILEを使用してCLOBにロードするか、UTL_FILEを使用して、ファイルを一時的なCLOBロケータに読み込むことができます。

ファイルがAUTO_FILTERフィルタ処理を必要とする場合は、ファイルをBLOBにロードして、前述のように、CTX_DOC.POLICY_FILTERをコールします。

関連項目:

拡張された分類の例は、「Oracle Textでのドキュメントの分類」を参照してください