7 Oracle TextでのCONTEXT構文およびCTXCAT構文の使用

CONTEXT構文およびCTXCAT構文について理解します。

この章のトピックは、次のとおりです:

7.1 CONTEXT構文

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

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

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

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

関連項目:

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

7.1.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リファレンス』を参照してください。

7.1.2 論理演算子

様々な方法で検索基準を制限するには、論理演算子を使用します。表7-1では、論理演算子について説明します。

表7-1 論理演算子

演算子 記号 説明 式の例

AND

&

問合せ語句が1つ以上出現するドキュメントを検索する場合に使用します。

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

'cats AND dogs'
'cats & dogs'

OR

|

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

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

'cats | dogs'
'cats OR dogs'

NOT

~

1つの問合せ語句が含まれているが、もう1つの問合せ語句が含まれていないドキュメントを検索する場合に使用します。

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

'animals ~ dogs'

ACCUM

,

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

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

'dogs, cats, puppies'

EQUIV

=

問合せ時に条件を満たすワードの置換を指定する場合に使用します。

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

'German shepherds=alsatians are big dogs'

7.1.3 セクション検索とHTMLおよびXML

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

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

7.1.4 NEAR、NEAR_ACCUMおよびNEAR2演算子による近接問合せ

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

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

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

NEAR演算子が変更され、NESTED NEAR内の句間での距離の測定方法が変わりました。

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

NEAR2演算子には、PHRASENEARANDの各演算子の機能が結合されています。また、NEAR2演算子では位置情報を使用してそのヒット数のスコアを上げることができます。つまり、1つのドキュメントの先頭で1つの句がヒットし、ドキュメントの終わりに別の句がヒットすると、最初のヒットに2つ目のヒットよりも高い重みが与えられます。

関連項目:

NEARNEAR_ACCUMおよびNEAR2演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照

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

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

関連項目:

7.1.6 CTXCAT構文の使用

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

代替のより単純な問合せ構文が必要な場合は、CTXCAT構文を使用します。

関連項目:

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

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

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

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

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

関連項目:

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

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

ストアド・クエリー式を定義して使用するには:

  1. CTX_QUERY.STORE_SQEをコールして、テキスト列に対する問合せを格納します。STORE_SQE,を使用して、ストアド・クエリー式の名前と問合せ式を指定します。
  2. SQE演算子を使用して、問合せ式でストアド・クエリー式をコールします。ストアド・クエリー式の結果は、通常の問合せの結果と同じ方法で戻されます。問合せは、ストアド・クエリー式のコール時に評価されます。

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

7.1.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リファレンス』を参照してください。

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

ユーザー定義ファンクションは、SQL文で指定されるための要件を満たしていれば、CONTAINS句内で直接コールできます。コール側には、そのファンクションに対するEXECUTE権限も必要です。

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

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

関連項目:

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

7.1.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; 
/

また、問合せの応答時間に影響を与える要因として、次のものが考えられます。

7.1.10 ヒット数のカウント

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

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

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

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

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

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

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

ワード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リファレンス』を参照してください。

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

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

関連項目:

7.2 CTXCAT構文

CTXCAT構文は、CATSEARCHのデフォルトの構文です。この構文は、ANDORなどの論理演算と句問合せをサポートしています。

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

表7-2 CATSEARCH問合せ演算子の構文

演算 構文 演算子の説明

論理積AND

a b c

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

論理OR

a | b | c

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

論理NOT

a - b

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

空白なしのハイフン

a-b

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

たとえば、ハイフンをskipjoinとして定義した場合、vice-presidentなどのワードは、単一の問合せ語句vicepresidentとして処理されます。

同様に、ハイフンをprintjoinとして定義した場合、vice-presidentなどのワードは、CTXCAT問合せ言語では空白を含めたvice presidentとして処理されます。

" "

"a b c"

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

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

( )

(A B) | C

カッコは演算をグループ化します。この問合せは、CONTAINS問合せ(A &B) | Cに相当します。

CATSEARCH問合せでCONTEXT構文を使用するには、text_queryパラメータで問合せテンプレート指定を使用します。

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

関連項目:

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