ヘッダーをスキップ
Oracle Textアプリケーション開発者ガイド
11g リリース1(11.1)
E05788-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 Oracle Textでの問合せ

この章では、Oracle Textの問合せと関連機能を説明します。次の項目について説明します。

4.1 問合せの概要

Oracle Textの基本的な問合せでは、問合せ式を入力します。式は、通常はワードで、演算子を併用する場合と併用しない場合があります。式を満たすすべてのドキュメント(事前に索引付け済)が、各ドキュメントの関連性スコアとともに戻ります。スコアは、結果セット内のドキュメントを順序付けするために使用できます。

Oracle Textの問合せを入力するには、SQLのSELECT文を使用します。作成する索引のタイプに応じて、WHERE句にCONTAINS演算子またはCATSEARCH演算子のいずれかを使用します。これらの演算子は、PL/SQLカーソル内など、SELECT文を使用できる状況であれば、いつでもプログラムで使用できます。

CTXRULE索引を使用してドキュメントを分類するには、MATCHES演算子を使用します。

4.1.1 CONTAINSによる問合せ

CONTEXT索引タイプを作成する場合は、CONTAINS演算子を使用して問合せを入力する必要があります。大量のまとまったドキュメントのコレクションを索引付けするには、CONTEXT索引タイプが最適です。

CONTAINS演算子では、複数の演算子を使用して検索条件を定義できます。これらの演算子によって、論理、近接、ファジー、ステミング、シソーラスおよびワイルド・カードの各検索を入力できます。また、適切に構成された索引を使用すると、HTMLやXMLのような内部構造を持つドキュメントに対してセクション検索を入力することもできます。

CONTAINSでは、ABOUT演算子を使用して、ドキュメント・テーマを検索できます。

4.1.1.1 CONTAINS SQL例

SELECT文では、CONTAINS演算子を使用してWHERE句で問合せを指定します。また、ヒットリストのヒットごとにスコアを戻すには、SCORE演算子を指定します。次の例では、問合せの入力方法を示します。

SELECT SCORE(1), title from news WHERE CONTAINS(text, 'oracle', 1) > 0;

次のように、ORDER BY句を使用して、結果を最も高いスコアのドキュメントから最も低いスコアのドキュメントに順序付けることができます。

SELECT SCORE(1), title from news
           WHERE CONTAINS(text, 'oracle', 1) > 0
           ORDER BY SCORE(1) DESC;

CONTAINS演算子の後には、> 0構文が必要です。この構文は、CONTAINS演算子によって戻されるスコアの値が、戻される行に対してゼロより大きい必要があることを指定します。

SELECT文でSCORE演算子がコールされた場合、CONTAINS演算子は、前述の例の3番目のパラメータで、スコア・ラベルの値を参照する必要があります。

4.1.1.2 CONTAINS PL/SQL例

PL/SQLアプリケーションでは、カーソルを使用して問合せ結果をフェッチできます。

次の例では、CONTAINS問合せをNEWS表に対して入力し、ワードoracleを含むすべての記事を検索します。ヒットしたもののうち上位10個のタイトルとスコアが出力されます。

declare
  rowno number := 0;
begin
  for c1 in (SELECT SCORE(1) score, title FROM news
              WHERE CONTAINS(text, 'oracle', 1) > 0
              ORDER BY SCORE(1) DESC)
  loop
    rowno := rowno + 1;
    dbms_output.put_line(c1.title||': '||c1.score);
    exit when rowno = 10;
  end loop;
end;

この例では、カーソルFORループを使用して、ヒットしたもののうち上位10個を取り出します。SCORE演算子の戻り値に対して、別名scoreが宣言されています。カーソル・ドット表記法を使用して、スコアとタイトルが標準出力に出力されます。

4.1.1.3 CONTAINSによる構造化問合せ

構造化問合せは複合問合せとも呼ばれ、テキスト列を問い合せるCONTAINS述語と、構造化データ列を問い合せる別の述語を持つ問合せです。

構造化問合せを入力するには、SELECT文のWHERE条件に構造化句を指定します。

たとえば、次のSELECT文は、1997年10月1日以降に書かれた、ワードoracleを含む記事をすべて検索します。

SELECT SCORE(1), title, issue_date from news
           WHERE CONTAINS(text, 'oracle', 1) > 0
           AND issue_date >= ('01-OCT-97')
           ORDER BY SCORE(1) DESC;

注意:


CONTAINSで構造化問合せを入力できる場合でも、CTXCAT索引を作成し、CATSEARCHで問合せを発行することを検討してください。そのほうが構造化問合せのパフォーマンスが向上します。

4.1.2 CATSEARCHによる問合せ

CTXCAT索引タイプを作成する場合は、CATSEARCH演算子を使用して問合せを入力する必要があります。使用しているアプリケーションで、テキスト列に短いテキスト断片や関連列にその他の関連情報を格納する場合は、CTXCAT索引タイプが最適です。

たとえば、オンライン・オークション・サイトを提供しているアプリケーションでは、表のテキスト列に品目の説明を格納し、その他の列に日付や価格などの関連情報を格納する場合があります。CTXCAT索引を使用すると、これらの列の1つ以上にBツリー索引を作成できます。その結果、CATSEARCH演算子を使用してCTXCAT索引を検索すると、通常、複合問合せの問合せパフォーマンスが向上します。

CATSEARCHによる問合せに使用できる演算子は、ANDORなどの論理操作に制限されています。構造化基準の定義に使用できる演算子は、>、<、=、BETWEENおよびINです。

4.1.2.1 CATSEARCH SQL問合せ

CATSEARCHによる一般的な問合せの例として、次のように、ワードcameraを含むすべての行を検索してbid_closeの日付順にソートする構造化句が組み込まれていることがあります。

SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'order by bid_close desc')> 0;

入力できる構造化問合せのタイプは、サブ索引の作成方法によって異なります。

前述の例のように、CATSEARCH問合せの構造化部分を指定するには、3番目のstructured_queryパラメータを使用します。構造化式で名前を指定する列には、対応するサブ索引が必要です。

たとえば、category_idbid_closeには、AUCTION表のCTXCAT索引内にサブ索引があるとします。この場合は、次のような構造化問合せを入力します。

SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'category_id=99 order by bid_close desc')> 0;

4.1.2.2 CATSEARCH例

次の例は、CATSEARCH問合せ内の問合せテンプレートにより、CONTEXT文法を使用した、CTXCAT索引に対するフィールド・セクション検索を示します。

-- Create and populate table
create table BOOKS (ID number, INFO varchar2(200), PUBDATE DATE);

insert into BOOKS values(1, '<author>NOAM CHOMSKY</author><subject>CIVIL
   RIGHTS</subject><language>ENGLISH</language><publisher>MIT
   PRESS</publisher>', '01-NOV-2003');

insert into BOOKS values(2, '<author>NICANOR PARRA</author><subject>POEMS
  AND ANTIPOEMS</subject><language>SPANISH</language>
  <publisher>VASQUEZ</publisher>', '01-JAN-2001');

insert into BOOKS values(1, '<author>LUC SANTE</author><subject>XML
  DATABASE</subject><language>FRENCH</language><publisher>FREE
  PRESS</publisher>', '15-MAY-2002');

commit;

-- Create index set and section group
exec ctx_ddl.create_index_set('BOOK_INDEX_SET');
exec ctx_ddl.add_index('BOOKSET','PUBDATE');

exec ctx_ddl.create_section_group('BOOK_SECTION_GROUP',
      'BASIC_SECTION_GROUP');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','AUTHOR','AUTHOR');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','SUBJECT','SUBJECT');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','LANGUAGE','LANGUAGE');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','PUBLISHER','PUBLISHER');

-- Create index
create index books_index on books(info) indextype is ctxsys.ctxcat
  parameters('index set book_index_set section group book_section_group');

-- Use the index
-- Note that: even though CTXCAT index can be created with field sections, it
-- cannot be accessed using CTXCAT grammar (default for CATSEARCH).
-- We need to use query template with CONTEXT grammar to access field
-- sections with CATSEARCH

select  id, info from books
where catsearch(info,
'<query>
      <textquery grammar="context">
              NOAM within author and english within language
      </textquery>
 </query>',
'order by pubdate')>0;

4.1.3 MATCHESによる問合せ

CTXRULE索引タイプを作成する場合は、MATCHES演算子を使用してドキュメントを分類する必要があります。CTXRULE索引は、本来は分類を定義する問合せのセットに作成される索引です。

たとえば、ドキュメントの着信ストリームをドキュメントの内容に基づいて分類する必要がある場合は、カテゴリを定義する条件式のセットを作成できます。この条件式は、テキスト列の行として作成します。このタイプの表は、CTX_CLS.TRAINプロシージャを使用して作成することもできます。

次に、CTXRULE索引を作成するために表を索引付けします。ドキュメントの着信時に、MATCHES演算子を使用して各ドキュメントを分類します。

4.1.3.1 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

この問合せは、問合せ2(ワードlarryおよびellisonは表示されません)および3(ドキュメント内にテキストがないため問合せに一致しません)ではなく、問合せ1(ワードoracleがドキュメントに表示されます)および4(句market shareがドキュメントに表示されます)を戻します。

この例では、簡略化するために、ドキュメントを文字列として渡しています。通常は、ドキュメントはバインド変数で渡されます。

MATCHES問合せで使用されるドキュメント・テキストは、VARCHAR2またはCLOBになります。BLOB入力は受け入れられないため、フィルタ処理されたドキュメントを直接照合することはできません。かわりに、AUTO_FILTERフィルタを使用して、バイナリ・コンテンツをCLOBにフィルタ処理する必要があります。次の例の場合、2つのことを前提としています。1つ目は、ドキュメント・データがバインド変数:doc_blob内にあること、2つ目は、CTX_DOC.POLICY_FILTERが使用できるポリシーmy_policyがすでに定義されていることです。たとえば、次の式を使用します。

  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;

プロシージャCTX_DOC.POLICY_FILTERは、BLOBCLOBデータにフィルタ処理します。これは、テキストをCLOBに取り込んで、MATCHES問合せを入力する必要があるためです。これは、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をコールします。


関連項目:


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

4.1.3.2 MATCHES PL/SQL例

次の例では、問合せ表profilesCTXRULE索引が作成されているとします。また、表newsfeedには、分類対象の記事のセットが含まれているとします。

この例では、newsfeed表内をループし、MATCHES演算子を使用して各記事を分類します。結果は、results表に格納されます。

PROMPT  Populate the category table based on newsfeed articles
PROMPT
set serveroutput on;
declare
  mypk   number;
  mytitle varchar2(1000);
  myarticles clob;
  mycategory varchar2(100);
  cursor doccur is select pk,title,articles from newsfeed;
  cursor mycur is  select category from profiles where matches(rule, myarticles)>0;
  cursor rescur is select category, pk, title from results order by category,pk;

begin
  dbms_output.enable(1000000);
  open doccur;
  loop
    fetch doccur into mypk, mytitle, myarticles;
    exit when doccur%notfound;
    open mycur;
    loop
      fetch mycur into mycategory;
      exit when mycur%notfound;
      insert into results values(mycategory, mypk, mytitle);
    end loop;
    close mycur;
    commit;
  end loop;
  close doccur;
  commit;

end;
/

次の例では、分類された記事をカテゴリ別に表示します。

PROMPT  display the list of articles for every category
PROMPT
set serveroutput on;

declare
  mypk   number;
  mytitle varchar2(1000);
  mycategory varchar2(100);
  cursor catcur is select category from profiles order by category;
  cursor rescur is select pk, title from results where category=mycategory order by pk;

begin
  dbms_output.enable(1000000);
  open catcur;
  loop
    fetch catcur into mycategory;
    exit when catcur%notfound;
    dbms_output.put_line('********** CATEGORY: '||mycategory||' *************');
open rescur;
    loop
      fetch rescur into mypk, mytitle;
      exit when rescur%notfound;
dbms_output.put_line('**  ('||mypk||'). '||mytitle);
    end loop;
    close rescur;
    dbms_output.put_line('**');
dbms_output.put_line('*******************************************************');
  end loop;
  close catcur;
end;
/

関連項目:


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

4.1.4 ワード問合せと句問合せ

ワード問合せは、ワードまたは句に対する問合せです。たとえば、テキスト表でワードdogを含むすべての行を検索するには、問合せ語句として、dogを指定して問合せを入力します。

ワード問合せは、SQL演算子のCONTAINSCATSEARCHの両方で入力できます。ただし、句問合せは、異なる方法で解釈されます。

4.1.4.1 CONTAINS句問合せ

問合せ式に複数のワードが空白のみ(演算子なし)で区切られて含まれている場合、そのワードの文字列は句とみなされ、問合せ時に文字列全体が検索されます。

たとえば、句international lawを含むすべてのドキュメントを検索するには、句international lawを指定して問合せを入力します。

4.1.4.2 CATSEARCH句問合せ

CATSEARCH演算子では、句の各ワードの間にAND演算子が挿入されます。たとえば、international lawの問合せでは、international AND lawとして解釈されます。

4.1.5 ストップワードの問合せ

ストップワードは、索引エントリが作成されないワードです。ストップワードは、通常、それ自体は検索の対象とならない、その言語の一般的なワードです。

Oracle Textには、使用言語のデフォルトのストップワード・リストが組み込まれています。このリストは、ストップリストと呼ばれます。たとえば、英語では、ワードthisおよびthatは、デフォルトのストップリストでストップワードとして定義されています。このデフォルトのストップリストを変更したり、CTX_DDLパッケージを使用して新しいストップリストを作成できます。また、索引を作成した後で、ALTER INDEX文でストップワードを追加することもできます。

ストップワードまたはストップワードのみで構成されている句に対する問合せは発行できません。たとえば、thisがストップワードとして定義されている場合は、ワードthisを問い合せても、ヒットは戻りません。

ただし、this boy talks to that girlのように、ストップワードとストップワード以外のワードが含まれている句を問い合せることはできます。これは、Oracle Textの索引では、ストップワードの索引エントリは作成しませんが、ストップワードの位置は記録しているためです。

問合せ句内にストップワードが含まれている場合、このストップワードは任意のワードに一致します。たとえば、次の問合せがあるとします。

'Jack was big'

ストップワードがwasの場合、Jack is bigおよびJack grew bigなどの句が一致します。grewはストップワードではありませんが、この問合せでは一致します。

4.1.6 ABOUT問合せおよびテーマ

ABOUT問合せは、ドキュメント・テーマに対する問合せです。ドキュメント・テーマは、テキスト内で詳しく展開されている概念のことです。たとえば、US politicsABOUT問合せでは、アメリカの大統領選挙や外交政策に関する情報を含むドキュメントが戻る可能性があります。戻るドキュメントには、US politicsと正確に一致する句が含まれている必要はありません。

索引付け時に、ドキュメント・テーマはナレッジ・ベースから導出されます。このナレッジ・ベースには、一般的な知識を表すカテゴリと概念が階層式にリストされています。たとえば、ナレッジ・カタログのテーマには、jazz musicfootballまたはNelson Mandelaなどの具体的な概念も含まれています。また、テーマには、happinessまたはhonestyなどの抽象的な概念もあります。

索引付け時に、システムでは、ドキュメント内で詳しく展開されているが、ナレッジ・ベースには存在しないドキュメント・テーマも識別し、索引付けすることができます。

ナレッジ・ベースは、業界または問合せアプリケーション固有の概念や用語を定義して補強できます。補強した場合は、追加した概念に対するABOUT問合せの精度が向上します。

索引内にテーマ・コンポーネントを作成すると、ABOUT問合せのパフォーマンスが最も向上します。テーマ・コンポーネントは、英語とフランス語ではデフォルトで作成されます。


関連項目:


『Oracle Textリファレンス』

4.1.6.1 ストップテーマの問合せ

ABOUT演算子を使用すると、テーマを問い合せることができます。ストップテーマは、索引付け対象外のテーマです。ストップテーマは、CTX_DLLパッケージを使用して追加および削除できます。また、索引を作成した後で、ALTER INDEX文でストップテーマを追加することもできます。

4.1.7 問合せ式

問合せ式とは、CONTAINS演算子またはCATSEARCH演算子のtext_query引数内で一重引用符で囲まれたものを指します。CONTAINS問合せの問合せ式に組み込むことができる内容は、CATSEARCH演算子に組み込める内容とは異なります。

4.1.7.1 CONTAINS演算子

CONTAINSの問合せ式には、論理検索、近接検索、シソーラスを使用した検索、ファジー検索およびワイルド・カード検索を行う問合せ演算子を含めることができます。ストアド式を使用した問合せも可能です。問合せ式内でグループ化文字を使用すると、演算子の優先順位を変更できます。このマニュアルでは、このような演算子をCONTEXT文法と呼びます。

CONTAINSでは、ABOUT問合せを使用して、ドキュメント・テーマを問い合せることもできます。


関連項目:


「CONTEXT文法」

4.1.7.2 CATSEARCH演算子

CATSEARCH演算子では、text_query引数を使用して問合せ式を指定し、structured_query引数を使用してオプションの構造化基準を指定できます。text_query引数を使用すると、ワードと句を問い合せることができます。AND、ORおよびNOTなどの論理操作を使用できます。このマニュアルでは、このような演算子をCTXCAT文法と呼びます。

CONTEXT文法によりサポートされているさらに豊富な演算子を使用する場合は、CATSEARCHで問合せテンプレート機能を使用できます。

structured_query引数では、構造化基準を指定します。次のSQL操作を使用できます。

  • =

  • <=

  • >=

  • >

  • <

  • IN

  • BETWEEN

また、ORDER BY句を使用して出力を順序付けできます。


関連項目:


「CTXCAT文法」

4.1.7.3 MATCHES演算子

CONTAINSおよびCATSEARCHと異なり、MATCHESは問合せ式を入力として受け取りません。

MATCHES演算子はドキュメントを入力として受け取り、問合せ(ルール)表から条件に合うすべての行を検出します。したがって、MATCHESを使用すると、一致するルールに従ってドキュメントを分類できます。

4.1.8 大/小文字を区別する検索

Oracle Textでは、ワード問合せとABOUT問合せで大/小文字区別がサポートされています。

4.1.8.1 ワード問合せ

ワード問合せでは、デフォルトで大/小文字を区別していません。たとえば、語句dogを問い合せると、テキスト表のワードdogDogまたはDOGを含む行が検出されます。

BASIC_LEXER索引プリファレンスのmixed_case属性を使用可能にすると、大/小文字を区別した検索を使用可能にできます。大/小文字を区別する索引の場合は、大/小文字を正確に区別して問合せを入力する必要があります。つまり、Dogへの問合せは、Dogを含むドキュメントのみと一致します。dogまたはDOGを含むドキュメントは、ヒットとして戻りません。

4.1.8.1.1 ストップワードと大/小文字区別

ワード問合せに大/小文字区別を使用可能に設定して、ストップワードとストップワード以外のワードを含む句に問合せを入力する場合は、そのストップワードの大/小文字の区別を正確に指定する必要があります。たとえば、theがストップワードとして定義されている場合は、the dogを問い合せても、The Dogを含むテキストは戻りません。

4.1.8.2 ABOUT問合せ

大/小文字区別を適切に行って問合せを実行すると、ABOUT問合せの精度が最も向上します。これは、問合せの正規化が、大/小文字が区別されるナレッジ・カタログに基づいているためです。大文字/小文字によって意味が異なるワードの場合は、特に注意が必要です。たとえば、turkeyは鳥の名で、Turkeyは国名です。

ただし、ABOUT問合せの関連結果を取得するために、大/小文字を正確に区別して問合せを入力する必要はありません。システムが、最適な方法で問合せを解釈します。たとえば、ORACLEという問合せを入力し、この概念がナレッジ・カタログで検索されない場合、システムは検索用の関連概念としてOracleを使用する場合があります。

4.1.9 問合せのフィードバック

フィードバック情報には、CONTEXT索引で指定した問合せに対する上位語、下位語および関連語の情報が含まれています。フィードバック情報は、CTX_QUERY.HFEEDBACKプロシージャを使用してプログラムで取得します。

上位語、下位語および関連語の情報は、他の問合せ語句を問合せアプリケーションのユーザーに提示する場合に役立ちます。

戻されるフィードバック情報はナレッジ・ベースから取得され、索引中にも存在する語句のみを含みます。これによって、HFEEDBACKプロシージャから戻された語句が、現在索引付けされているドキュメント・セットに対して高いヒットを生成する可能性が高くなります。


関連項目:


CTX_QUERY.HFEEDBACKの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.1.10 問合せの実行計画

実行計画情報では、CONTAINS問合せ式の解析ツリーがグラフィカルに表示されます。実行計画情報は、CTX_QUERY.EXPLAINプロシージャを使用してプログラムで取得できます。

実行計画情報を使用すると、問合せを実行しなくても、問合せの拡張方法や解析方法がわかります。実行計画情報を取得すると、STEM、ワイルド・カード、シソーラス、FUZZY、SOUNDEX、ABOUTなどの特定の問合せの拡張方法がわかります。解析ツリーには、次の情報も表示されます。

  • 実行の順序

  • ABOUT問合せの正規化

  • 問合せ式の最適化

  • ストップワード変換

  • サポート対象言語の複合語トークンの分類


    関連項目:


    CTX_QUERY.EXPLAINの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.1.11 問合せでのシソーラスの使用

Oracle Textでは、問合せアプリケーション用のシソーラスを定義できます。

カスタム・シソーラスを定義すると、問合せをより優れた方法で処理できます。使用しているアプリケーションのユーザーには、トピックを表現するワードがわからない場合があるため、予想される問合せ語句にシノニムまたは下位語を定義できます。シソーラス演算子を使用すると、シソーラス語句を含むように問合せを拡張できます。

4.1.12 ドキュメントのセクション検索

セクション検索を使用すると、テキスト問合せをドキュメント内のセクションに絞り込むことができます。

セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に実現できます。たとえば、<H1>タグに対してセクションを定義すると、WITHIN演算子を使用してこのセクション内を問い合せることができます。

XMLドキュメントからセクションを自動的に作成するようにシステムを設定できます。

また、属性セクションを定義して、XMLドキュメントの属性テキストを検索できます。


注意:


セクション検索がサポートされているのは、CONTEXT索引によるワード問合せのみです。

4.1.13 問合せテンプレートの使用

問合せテンプレートは、既存の問合せ言語の代替として使用できます。問合せ文字列をCONTAINSまたはCATSEARCHに渡すのではなく、問合せ文字列をタグ付き要素内に含む、構造化ドキュメントを渡します。この構造化ドキュメントまたは問合せテンプレートでは、次に示すその他の問合せ機能を使用できます。

4.1.14 クエリー・リライト

問合せアプリケーションは、エンド・ユーザー問合せを解析し、異なる演算子の組合せを使用して、1つ以上の方法で問合せ文字列を解釈することがあります。たとえば、ユーザーがkukui nutという問合せを入力すると、アプリケーションでは、再コールを増やすために、問合せ{kukui nut}および{kukui or nut}が入力されます。

クエリー・リライト機能を使用すると、元の問合せをリライトされたバージョンに拡張する単一の問合せを発行できます。これにより、重複のない結果が戻されます。

問合せテンプレート機能を使用して、リライトの順序を指定します。リライトされた問合せのバージョンは、CONTAINSまたはCATSEARCHの単一のコールを使用して、効率的に実行されます。

次のテンプレートは、クエリー・リライトの順序を定義します。問合せ{kukui nut}は、次のようにリライトされます。

{kukui} {nut}

{kukui} ; {nut}

{kukui} AND {nut}

{kukui} ACCUM {nut}

この変換のクエリー・リライト・テンプレートは、次のとおりです。

select id from docs where CONTAINS (text,
 '<query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> kukui nut
     <progression>
       <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", " ; "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
     </progression>
   </textquery>
  <score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

4.1.15 問合せ緩和

問合せ緩和を使用すると、アプリケーションでは、最も制限されたバージョンの問合せを最初に実行して、必要なヒット数を得るまで、問合せを徐々に緩和できます。

たとえば、アプリケーションが最初にblack penを検索した後、より多くのヒットを得るため、問合せがblack NEAR penに緩和されます。

次の問合せテンプレートは、問合せ緩和の順序を定義します。問合せblack penは、次の順序で入力されます。

{black} {pen}

{black} NEAR {pen}

{black} AND {pen}

{black} ACCUM {pen}

この変換の問合せ緩和テンプレートは、次のとおりです。

select id from docs where CONTAINS (text,
 '<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <progression>
       <seq>{black} {pen}</seq>
       <seq>{black} NEAR {pen}</seq>
       <seq>{black} AND {pen}</seq>
       <seq>{black} ACCUM {pen}</seq>
     </progression>
   </textquery>
   <score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

アプリケーションが結果を必要とするかぎり、問合せのヒットは、この順序で重複なしで戻されます。

問合せ緩和は、アプリケーションが問合せの上位n個のヒットを必要とする場合に最も有効です。この場合、FIRST_ROWSヒントを使用して、またはPL/SQLカーソルでヒットを取得できます。

したがって、問合せテンプレートを使用した問合せの緩和は、問合せの再実行よりも効率的です。

4.1.16 問合せ言語

マルチレクサーを使用して、異なる言語の文書を含む列を索引付けする場合、問合せ中に使用する言語レクサーを指定できます。言語レクサーを指定するには、問合せテンプレートでlangパラメータを使用します。

以前のリリースでは、MULTI_LEXERを使用した場合、問合せを実行する前にセッション言語を変更することでのみ、問合せ言語の変更が可能でした。

select id from docs where CONTAINS (text,
'<query><textquery lang="french">bon soir</textquery></query>')>0;

4.1.17 代替スコアリングおよびユーザー定義スコアリング

問合せテンプレートを使用して、デフォルト以外の代替スコアリング・アルゴリズムを指定できます。これにより、CONTAINSをスコアリングする方法をカスタマイズしたり、SDATA をスコアリング式の一部として使用できます。このようにして、事前定義済スコアリング・コンポーネントのみでなくSDATAコンポーネントを使用してスコアリング式を数学的に定義できます。

代替のユーザー定義スコアリングを使用して、次の操作を実行できます。

  • 次を使用して、問合せのスコアリング方法を定義する演算式を定義して、語句のスコアリング式を指定します。

    • 事前定義済スコアリング・アルゴリズム: DISCRETEOCCURRENCERELEVANCEおよびCOMPLETION

    • 算術操作: 加算、減算、乗算、除算

    • 算術関数: ABS(n)n ; LOG(n)の絶対値の検索、10を底とするnの対数値の検索

    • 数値リテラル

  • 語句レベルでスコアリング式を指定します。

  • スコアの計算時に考慮に入れない語句を指定します。

  • OR演算子およびAND演算子の子要素によるスコアをどのようにマージするかを指定します。

  • 数値を格納するSDATAまたはDATETIME値を使用して、ドキュメントの最終スコアに影響を与えます。

次の例では、代替スコアリング・アルゴリズムを指定します。

select id from docs where CONTAINS (text,
'<query>
 <textquery grammar="CONTEXT" lang="english"> mustang  </textquery>
 <score datatype="float" algorithm="DEFAULT"/>
</query>')>0

次の問合せテンプレート例には、SDATA値が、最終スコアの一部として含まれています。

select id from docs where CONTAINS (text,
'<query>
<textquery grammar="CONTEXT" lang="english"> mustang </textquery>
<score datatype="float" algorithm="DEFAULT" normalization_expr =Ódoc_score+SDATA(price)Ó/>
</query>')>0"

4.1.18 代替文法

問合せテンプレートを使用すると、CATSEARCH問合せとともにCONTEXT文法を使用できます。または、CONTEXT問合せとともにCATSEARCH文法を使用できます。

select id from docs where CONTAINS (text,
'<query>
  <textquery grammar="CTXCAT">San Diego</textquery>
  <score datatype="integer"/>
</query>')>0;

4.1.19 問合せ分析

Oracle Textを使用すると、問合せのログを作成して、そのログに含まれる問合せを分析できます。たとえば、大きい動物のデータベースを検索するアプリケーションがあり、その問合せの分析は、ユーザーがワードmouseを頻繁に検索することを示しているとします。この分析は、mouseの検索で、単に検索の失敗を戻すのではなく、ユーザーを小さい動物のデータベースにリダイレクトするようにアプリケーションをリライトすることを促しています。

問合せ分析では、次のことがわかります。

  • 行われた問合せ

  • 成功した問合せ

  • 失敗した問合せ

  • 各問合せが行われた回数

これらの要素を様々な方法で組み合せると、アプリケーションで最も頻繁に行われた、失敗した50個の問合せなどのような判断ができます。

CTX_OUTPUT.START_QUERY_LOGを使用して、問合せのロギングを開始します。問合せログには、CTX_OUTPUT.END_QUERY_LOGプロシージャが入力されるまでプログラムが使用するすべてのコンテキスト索引に対するすべての問合せが含まれます。行われた問合せのレポートを取得するには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。


関連項目:


これらの手順の構文および例については、『Oracle Textリファレンス』を参照してください。

4.1.20 その他の問合せ機能

問合せアプリケーションでは、近接検索などのその他の問合せ機能を使用できます。表4-1は、これらの問合せ機能のいくつかを示しています。

表4-1 Oracle Textのその他の問合せ機能

機能 説明 実施方法

大/小文字を区別する検索

問合せに入力したとおりに、ワードまたは句を正確に検索できます。たとえば、Romanの検索は、Romanを含み、romanを含まないドキュメントを戻します。

索引作成時にBASIC_LEXERを使用します。

基本文字変換

ティルデ、アクセント、ウムラウトなどの発音区別符号に関係なく、ワードを問い合せます。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、energíaおよびenergiaが含まれているドキュメントが一致します。

索引作成時にBASIC_LEXERを使用します。

ワード分割処理

(ドイツ語およびオランダ語)

指定した語句が複合語の要素として含まれているワードを検索できます。

索引作成時にBASIC_LEXERを使用します。

代替スペル

(ドイツ語、オランダ語およびスウェーデン語)

ワードの代替スペルを検索します。

索引作成時にBASIC_LEXERを使用します。

近接検索

相互に近接しているワードを検索します。

問合せ入力時にNEAR演算子を使用します。

ステミング

指定した語句と同じ語幹を持つワードを検索します。

問合せ入力時に$演算子を使用します。

ファジー検索

指定した語句に類似するスペルを持つワードを検索します。

問合せ入力時にFUZZY演算子を使用します。

問合せの実行計画

問合せの解析情報を生成します。

索引作成後にPL/SQLプロシージャCTX_QUERY.EXPLAINを使用します。

階層問合せフィードバック

問合せに対する上位語、下位語および関連語の情報を生成します。

索引作成後にPL/SQLプロシージャCTX_QUERY.HFEEDBACKを使用します。

索引のブラウズ

索引内のシード・ワードに関するワードをブラウズします。

索引作成後にPL/SQLプロシージャCTX_QUERY.BROWSE_WORDSを使用します。

ヒット数のカウント

問合せのヒット数をカウントします。

索引作成後にPL/SQLプロシージャCTX_QUERY.COUNT_HITSを使用します。

ストアド・クエリー式

後で別の問合せで再利用するために、問合せ式のテキストを保存します。

索引作成後にPL/SQLプロシージャCTX_QUERY.STORE_SQEを使用します。

シソーラスを使用した問合せ

シソーラスを使用して問合せを拡張します。

SYNおよびBTなどのシソーラス演算子とABOUT演算子を使用します。

シソーラスのメンテナンスにはCTX_THESパッケージを使用します。


4.2 CONTEXT文法

CONTEXT文法は、CONTAINSのデフォルトの文法です。この文法では、演算子を使用してさらに複雑な検索を行うことができます。問合せ演算子は問合せ式で使用します。たとえば、論理演算子ANDを使用すると、2つの異なるワードを含むすべてのドキュメントを検索できます。ABOUT演算子を使用すると、概念を検索できます。

また、セクション検索にはWITHIN演算子を、近接検索にはNEAR演算子を使用できます。さらに、問合せ式の拡張には、STEM演算子、FUZZY演算子およびシソーラス演算子を使用できます。

CONTAINSでは、問合せテンプレート機能を使用してCTXCAT文法を使用できます。

次の各項では、Oracle Textの演算子について説明します。


関連項目:


問合せ演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.1 ABOUT問合せ

英語またはフランス語での概念の問合せには、ABOUT演算子を使用します。通常、問合せ文字列は、検索する内容を表す概念またはテーマになります。Oracle Textでは、そのテーマを含むドキュメントを戻します。

ワード情報とテーマ情報は、単一の索引に結合されます。テーマ問合せを入力するには、索引内にテーマ・コンポーネントが存在している必要があります。英語とフランス語の場合は、デフォルトで作成されます。

テーマ問合せは、問合せ式内でABOUT演算子を使用して入力します。たとえば、politicsに関するすべてのドキュメントを取り出すには、次のように問合せを記述します。

SELECT SCORE(1), title FROM news
           WHERE CONTAINS(text, 'about(politics)', 1) > 0
           ORDER BY SCORE(1) DESC;

関連項目:


ABOUT演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.2 論理演算子

ANDORなどの論理演算子を使用すると、様々な方法で検索条件を制限できます。表4-2では、論理演算子について説明します。

表4-2 論理演算子

演算子 記号 説明 式の例

AND

&


各問合せ語句が1つ以上出現するドキュメントを検索するには、AND演算子を使用します。

オペランドの最小値がスコアとして戻ります。

'cats AND dogs'
'cats & dogs'

OR

|


問合せ語句のいずれかが1つ以上出現するドキュメントを検索するには、OR演算子を使用します。

オペランドの最大値がスコアとして戻ります。

'cats | dogs'
'cats OR dogs'

NOT

~

ある問合せ語句が含まれているが、別の問合せ語句は含まれていないドキュメントを検索するには、NOT演算子を使用します。

たとえば、animalsという語句が含まれていて、dogsという語句は含まれていないドキュメントを取得するには、次の式を使用します。

'animals ~ dogs'

ACCUM

,

問合せ語句のいずれかが1つ以上出現するドキュメントを検索するには、ACCUM演算子を使用します。ACCUM演算子は、ドキュメントを語句の合計の重みによってランク付けします。

次の問合せは、dogs、catsおよびpuppiesという語句を含むすべてのドキュメントを検出し、3つの語句をすべて含むドキュメントに最も高いスコアを割り当てます。

'dogs, cats, puppies'

EQUIV

=


問合せ時に条件を満たす代替ワードを指定するには、EQUIV演算子を使用します。

次の例は、句alsatians are big dogsまたはGerman shepherds are big dogsのいずれかを含むすべてのドキュメントを検出します。

'German shepherds=alsatians are big dogs'

4.2.3 セクション検索

セクション検索は、ドキュメント・セットがHTMLまたはXMLの場合に有効です。HTMLの場合は、埋込みタグを使用してセクションを定義し、次にWITHIN演算子を使用して定義したセクションを検索します。

XMLの場合は、システムでセクションを自動的に作成するように設定できます。パスを検索するには、WITHIN演算子またはINPATH演算子で問い合せることができます。

4.2.4 NEAR演算子およびNEAR_ACCUM演算子による近接問合せ

NEAR演算子を使用すると、ドキュメント内で互いに近接している語句を検索できます。

たとえば、dogcatの6ワード以内にあるすべてのドキュメントを検索する場合は、次の問合せを入力します。

'near((dog, cat), 6)'

NEAR_ACCUM演算子は、NEAR演算子の機能とACCUM演算子の機能を結合します。NEARと同様に、NEAR_ACCUM演算子は、互いに指定の範囲内に近接した語句を戻します。ただし、一方の語句が見つからなかった場合、見つかった方の語句が出現する頻度に従って、ドキュメントがランク付けされます。


関連項目:


NEARおよびNEAR_ACCUM演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.5 FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算子

ワイルド・カード、FUZZY、STEM、SOUNDEX、シソーラスなどの演算子を使用すると、問合せを長いワード・リストに拡張できます。


関連項目:


これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

「問合せに多数の拡張を使用してもかまいませんか」


4.2.6 CTXCAT文法の使用方法

CONTAINS問合せにCTXCAT文法を使用できます。そのためには、CONTAINStext_queryパラメータに問合せテンプレート指定を使用します。

代替のより単純な問合せ文法が必要な場合は、CTXCAT文法を利用できます。


関連項目:


これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.7 ストアド・クエリー式

CTX_QUERY.STORE_SQEプロシージャを使用すると、結果を格納せずに問合せの定義を格納できます。CONTAINSのSQL演算子によって、その問合せの定義を参照します。このように、ストアド・クエリー式を使用すると、長い問合せ式や使用頻度の高い問合せ式を簡単に定義できます。

ストアド・クエリー式は索引に連結されません。CTX_QUERY.STORE_SQEをコールする場合、指定するのはストアド・クエリー式の名前と問合せ式のみです。

問合せの定義は、テキスト・データ・ディクショナリに格納されます。ストアド・クエリー式は、すべてのユーザーが参照できます。


関連項目:


CTX_QUERY.STORE_SQEの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.7.1 ストアド・クエリー式の定義

ストアド・クエリー式は、次のように定義して使用します。

  1. CTX_QUERY.STORE_SQEをコールして、テキスト列に対する問合せを格納します。STORE_SQEを使用して、ストアド・クエリー式の名前と問合せ式を指定します。

  2. SQE演算子を使用して、問合せ式でストアド・クエリー式をコールします。ストアド・クエリー式の結果は、通常の問合せの結果と同じ方法で戻されます。問合せは、ストアド・クエリー式のコール時に評価されます。

    ストアド・クエリー式は、REMOVE_SQEを使用して削除できます。

4.2.7.2 SQE例

次の例では、disasterというストアド・クエリー式を作成します。この式は、tornado、hurricaneまたはearthquakeのいずれかのワードを含むドキュメントを検索します。

begin
ctx_query.store_sqe('disaster', 'tornado | hurricane | earthquake');
end;

この問合せを1つの式で実行するには、次のように問合せを記述します。

SELECT SCORE(1), title from news
   WHERE CONTAINS(text, 'SQE(disaster)', 1) > 0
   ORDER BY SCORE(1);

関連項目:


CTX_QUERY.STORE_SQEの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.8 CONTAINSでのPL/SQLファンクションのコール

ユーザー定義ファンクションを直接CONTAINS句でコールできます。ただし、そのユーザー定義ファンクションがSQL文で指定された要件を満たしている必要があります。また、コールを実行するユーザーは、そのファンクションに対するEXECUTE権限を所有している必要があります。

たとえば、ファンクションfrenchが英語のワードに相当するフランス語を戻すとします。次の問合せを記述すると、catに相当するフランス語のワードを検索できます。

SELECT SCORE(1), title from news
   WHERE CONTAINS(text, french('cat'), 1) > 0
   ORDER BY SCORE(1);

関連項目:


ユーザー・ファンクションの作成およびSQLからのユーザー・ファンクションのコールの詳細は、『Oracle Database SQLリファレンス』を参照してください。

4.2.9 応答時間短縮のための最適化

CONTAINS問合せを応答時間短縮のために最適化すると、ヒットリストの最もスコアの高いドキュメントが必要な場合に、高速なソリューションとなります。

次の例では、標準出力に最初の20個のヒットを戻します。この例では、FIRST_ROWS(n)ヒントとカーソルを使用します。

declare
cursor c is
  select /*+ FIRST_ROWS(20) */ title, score(1) score
    from news where contains(txt_col, 'dog', 1) > 0 order by score(1) desc;
begin
  for c1 in c
  loop
    dbms_output.put_line(c1.score||':'||substr(c1.title,1,50));
    exit when c%rowcount = 21;
  end loop;
end;
/

4.2.9.1 問合せの応答時間に影響するその他の要因

問合せヒントの使用以外にも、次のような要因が問合せ応答時間に影響します。

4.2.10 ヒット数のカウント

CONTAINS述語のみが指定された問合せから戻されたヒット数をカウントするには、PL/SQLのCTX_QUERY.COUNT_HITSまたはSQL SELECT文のCOUNT(*)を使用できます。

おおまかなヒット件数が必要な場合は、CTX_QUERY.COUNT_HITSを予測モード(EXACTパラメータをFALSEに設定)で使用できます。応答時間の点では、これが最も高速なカウント方法です。

構造化述語が含まれた問合せから戻されるヒット数をカウントするには、SELECT文のCOUNT(*)ファンクションを使用します。

4.2.10.1 SQLによるヒット数のカウント例

ワードoracleを含むドキュメント数を検索するには、SQLのCOUNTファンクションによる問合せを次のように入力します。

SELECT count(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0;

4.2.10.2 構造化述語によるヒット数のカウント

構造化述語による問合せで戻されるドキュメント数を検索するには、COUNT(*)を次のように使用します。

SELECT COUNT(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0 and author = 'jones';

4.2.10.3 PL/SQLによるヒット数のカウント例

ワードoracleを含むドキュメント数を検索するには、COUNT_HITSを次のように使用します。

declare count number;
begin
  count := ctx_query.count_hits(index_name => my_index, text_query => 'oracle', exact => TRUE);
 dbms_output.put_line('Number of docs with oracle:');
 dbms_output.put_line(count);
end;

関連項目:


CTX_QUERY.COUNT_HITSの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.11 ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用

DEFINESCORE演算子を使用すると、語句または句のスコアの計算方法を定義できます。DEFINEMERGE演算子では、AND演算子およびOR演算子の子要素のスコアのマージ方法を定義します。また、SDATAとともに代替スコアリング・テンプレートを使用して、ドキュメントの最終スコアリングに影響を与えることができます。


関連項目:


DEFINESCOREおよびDEFINEMERGEの構文の詳細は、『Oracle Textリファレンス』を参照してください。

代替スコアリング・テンプレートの詳細は、「代替スコアリングおよびユーザー定義スコアリング」を参照してください。


4.3 CTXCAT文法

CTXCAT文法は、CATSEARCHのデフォルトの文法です。この文法は、句問合せの他に、ANDORなどの論理操作もサポートしています。

CATSEARCHの問合せ演算子は、次の構文です。

表4-3 CATSEARCH問合せ演算子の構文

操作 構文 操作の説明

論理AND

a b c

a、bおよびcを含む行を戻します。

論理OR

a | b | c

a、bまたはcを含む行を戻します。

論理NOT

a - b

aを含み、bを含まない行を戻します。

空白なしのハイフン

a-b

通常の文字として処理されるハイフンです。

たとえば、ハイフンがskipjoinとして定義されている場合、web-siteなどのワードは、単一の問合せ語句websiteとして処理されます。

同様に、ハイフンがprintjoinとして定義されている場合、web-siteなどのワードは、CTXCAT問合せ言語ではweb-siteとして処理されます。

" "

"a b c"

句"a b c"を含む行を戻します。

たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。

( )

(A B) | C

グループ設定をカッコで囲みます。この問合せは、CONTAINS問合せの(A &B) | Cに相当します。


4.3.1 CONTEXT文法およびCATSEARCHの使用

さらに、CATSEARCH問合せでCONTEXT文法を使用することもできます。そのためには、text_queryパラメータに問合せテンプレート指定を使用します。

CTXCAT索引で近接問合せ、シソーラス問合せまたはABOUT問合せを入力する必要がある場合に、CONTAINS文法を使用することがあります。


関連項目:


これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。