6.2 Oracle Text問合せの機能

Oracle Textには、様々な問合せ機能があります。これらの問合せ機能を問合せアプリケーションで使用できます。

6.2.1 問合せ式

問合せ式とは、CONTAINS演算子またはCATSEARCH演算子のtext_query引数内で一重引用符で囲まれたものを指します。CONTAINS問合せ内の問合せ式の内容は、CATSEARCH演算子の内容とは異なります。

6.2.1.1 CONTAINS演算子

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

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

関連項目:

CONTEXT構文

6.2.1.2 CATSEARCH演算子

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

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

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

  • =

  • <=

  • >=

  • >

  • <

  • IN

  • BETWEEN

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

関連項目:

CTXCAT構文

6.2.1.3 MATCHES演算子

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

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

関連項目:

MATCHESによる問合せ

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

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

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

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

大/小文字を区別しない検索を有効にするには、BASIC_LEXER索引プリファレンスのMIXED_CASE属性をNOに設定します。

ノート:

ワード問合せで大/小文字区別を有効にし、ストップワードと索引付け可能なワードを含む句を問い合せる場合は、ストップワードの大/小文字の区別を正確に指定する必要があります。たとえば、theがストップワードとして定義されている場合は、the dogを問い合せても、The Dogを含むテキストは戻りません。

問合せの正規化はナレッジ・カタログに基づいているため、問合せが適切な大/小文字で形成されている場合は、ABOUT問合せによって最良の結果が得られます。ナレッジ・カタログでは、大/小文字が区別されます。大文字/小文字によって意味が異なるワードの場合は、特に注意が必要です(たとえば、turkeyは鳥の名で、Turkeyは国名です)。

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

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

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

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

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

関連項目:

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

6.2.4 問合せの実行計画

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

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

  • 実行の順序

  • ABOUT問合せの正規化

  • 問合せ式の最適化

  • ストップワード変換

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

    関連項目:

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

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

Oracle Textでは、問合せアプリケーションのシソーラスを定義し、問合せをよりインテリジェントに処理できます。

トピックを表現するワードがユーザーにはわからない場合があるため、予想される問合せ語句にシノニムまたは下位語を定義できます。シソーラス演算子を使用すると、シソーラス語句を含むように問合せを拡張できます。

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

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

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

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

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

ノート:

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

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

問合せテンプレートは、既存の問合せ言語の代替として使用できます。

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

ノート:

Oracle Textの索引タイプCTXCATは、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCATは、将来のリリースで削除される可能性があります。

CONTEXT問合せの代替文法としてCTXCATおよびCTXCAT文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXTでのトランザクションに近い動作は、SYNC(ON COMMIT)または短い期間(できればSYNC(EVERY [time-period]))を使用して実現できます。

CTXCATは、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCATで管理が困難な場合があります。CTXCATへの索引セットの追加は、CONTEXT索引タイプでFILTER BY列とORDER BY列、またはSDATA列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCATが適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT索引タイプを選択することをお薦めします。

6.2.7.1 問合せリライト

問合せアプリケーションは、エンド・ユーザー問合せを解析し、異なる演算子の組合せを使用して、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;

6.2.7.2 問合せ緩和

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

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

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

{green} {pen}

{green} NEAR {pen}

{green} AND {pen}

{green} ACCUM {pen}

次に、これらの変換に対する問合せ緩和テンプレートを示します。

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

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

アプリケーションが問合せの上位N個のヒット数を必要とする場合、問合せ緩和が最も効率的です。このヒット数は、DOMAIN_INDEX_SORTまたはPL/SQLカーソルで取得できます。

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

6.2.7.3 問合せ言語

MULTI_LEXERを使用して、異なる言語の文書を含む列を索引付けする場合、問合せ中に使用する言語レクサーを指定できます。これを実行するには、問合せパラメータでlangパラメータを使用し、そこでドキュメントレベル・レクサーを指定します。

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

関連項目:

ALTER INDEXとドキュメント・サブレクサーを使用するLANGUAGEおよびlangの詳細は、『Oracle Textリファレンス』を参照してください

6.2.7.4 SDATAセクションによる並替え

問合せテンプレートの<order>および<orderkey>要素を使用すると、SDATAセクションの内容に応じて問合せ結果を並べ替えることができます。

次の例では、第1レベルの並替えがSDATA priceセクションに基づいて実行され、昇順でソートされます。第2レベルと第3レベルの並替えはSDATA pub_dateセクションとスコアに基づいて実行され、どちらも降順でソートされます。

select id from docs where CONTAINS (text, '
<query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> Oracle </textquery>
   <score datatype="INTEGER" algorithm="COUNT"/>
   <order>
       <orderkey> SDATA(price) ASC </orderkey>
       <orderkey> SDATA(pub_date) DESC </orderKey>
       <orderkey> Score DESC </orderkey>
   </order>
</query>', 1)>0;

ノート:

  • 索引にSDATAセクションを追加できます。『Oracle Textリファレンス』で、ALTER INDEXADD SDATA SECTIONパラメータ文字列に関する項を参照してください。

  • SDATAセクションを追加する前に索引付けされたドキュメントには、この新しいプリファレンスは反映されません。この場合は索引を再構築してください。

関連項目:

問合せテンプレートの<order>および<orderkey>要素の構文は、『Oracle Textリファレンス』を参照してください。

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

問合せテンプレートを使用して、代替スコアリング・アルゴリズムを指定できます。これらのアルゴリズムは、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"

6.2.7.6 代替構文

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

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

6.2.8 問合せ分析

Oracle Textを使用すると、問合せのログを作成して、問合せを分析できます。たとえば、大型動物のデータベースを検索するアプリケーションがあり、その問合せを分析したところ、ユーザーがマウスというワードで検索していることがわかったとします。この分析は、失敗した検索を返さないようにアプリケーションをリライトすることが望ましいことを示しています。かわりに、ユーザーがマウスを検索した場合は、小型動物のデータベースにリダイレクトするようにします。

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

  • 発行された問合せ

  • 成功した問合せ

  • 失敗した問合せ

  • 各問合せの発行回数

これらの要素を様々な方法で組み合せ、たとえばアプリケーションで失敗した問合せの上位50位までを調べることが可能です。

問合せのロギングは、CTX_OUTPUT.START_QUERY_LOG.によって開始しますCTX_OUTPUT.END_QUERY_LOGプロシージャが開始されるまで、プログラムで使用しているすべてのCONTEXT索引に対するすべての問合せが問合せログに書き込まれます。問合せのレポートを取得するには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。

関連項目:

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

6.2.9 その他の問合せ機能

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

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

機能 説明 実施方法

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

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

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

基本文字変換

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

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

ワード分割処理

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

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

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

代替スペル

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

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

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

近接検索

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

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

PHRASENEARおよびAND演算子の機能を含む拡張演算子。

特定の問合せに基づいてドキュメントをクランプに分割します。各クランプはプライマリ機能に基づいて分類され、2次機能に基づいてスコア付けされます。最終的なドキュメント・スコアにはクランプ・スコアが追加され、プライマリ機能の順序によってドキュメント・スコアの初期の順序が決まります。

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

ステミング

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

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

ファジー検索

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

問合せ入力時に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パッケージを使用します。)