6.2 Oracle Text問合せの機能
Oracle Textには、様々な問合せ機能があります。これらの問合せ機能を問合せアプリケーションで使用できます。
6.2.1 問合せ式
問合せ式とは、CONTAINS
演算子またはCATSEARCH
演算子のtext_query
引数内で一重引用符で囲まれたものを指します。CONTAINS
問合せ内の問合せ式の内容は、CATSEARCH
演算子の内容とは異なります。
6.2.1.1 CONTAINS演算子
CONTAINS
の問合せ式には、論理検索、近接検索、シソーラスを使用した検索、ファジー検索およびワイルド・カード検索を行う問合せ演算子を含めることができます。ストアド式を使用した問合せも可能です。問合せ式内でグループ化文字を使用すると、演算子の優先順位を変更できます。このマニュアルでは、このような演算子をCONTEXT
文法と呼びます。
CONTAINS
では、ABOUT
問合せを使用して、ドキュメント・テーマを問い合せることもできます。
関連項目:
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.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
プロシージャから戻された語句が、現在索引付けされているドキュメント・セットよりヒットする可能性が高くなります。
6.2.4 問合せの実行計画
実行計画情報では、CONTAINS
問合せ式の解析ツリーがグラフィカルに表示されます。実行計画情報は、CTX_QUERY.EXPLAIN
プロシージャを使用してプログラムで取得できます。
実行計画情報を使用すると、問合せを実行しなくても、問合せの拡張方法や解析方法がわかります。実行計画情報を取得すると、STEM、ワイルド・カード、シソーラス、FUZZY、SOUNDEX、ABOUT
などの特定の問合せの拡張方法がわかります。解析ツリーには、次の情報も表示されます。
-
実行の順序
-
ABOUT
問合せの正規化 -
問合せ式の最適化
-
ストップワード変換
-
サポート対象言語の複合語トークンの分類
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 INDEX
のADD SDATA SECTION
パラメータ文字列に関する項を参照してください。 -
SDATA
セクションを追加する前に索引付けされたドキュメントには、この新しいプリファレンスは反映されません。この場合は索引を再構築してください。
関連項目:
問合せテンプレートの<order>
および<orderkey>
要素の構文は、『Oracle Textリファレンス』を参照してください。
6.2.7.5 代替スコアリングおよびユーザー定義スコアリング
問合せテンプレートを使用して、代替スコアリング・アルゴリズムを指定できます。これらのアルゴリズムは、CONTAINS
のスコアリング方法をカスタマイズする場合に役立ちます。また、SDATA
をスコアリング式の一部として使用できるようになります。このようにして、事前定義済スコアリング・コンポーネントのみでなくSDATA
コンポーネントを使用してスコアリング式を数学的に定義できます。
代替のユーザー定義スコアリングを使用して、次のことを指定できます。
-
語句のスコアリング式では、次を使用して、問合せのスコアリング方法を定義する演算式を定義します
-
事前定義済スコアリング・アルゴリズム:
DISCRETE
、OCCURRENCE
、RELEVANCE
および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.8 問合せ分析
Oracle Textを使用すると、問合せのログを作成して、問合せを分析できます。たとえば、大型動物のデータベースを検索するアプリケーションがあり、その問合せを分析したところ、ユーザーがマウスというワードで検索していることがわかったとします。この分析は、失敗した検索を返さないようにアプリケーションをリライトすることが望ましいことを示しています。かわりに、ユーザーがマウスを検索した場合は、小型動物のデータベースにリダイレクトするようにします。
問合せ分析では、次のことがわかります。:
-
発行された問合せ
-
成功した問合せ
-
失敗した問合せ
-
各問合せの発行回数
これらの要素を様々な方法で組み合せ、たとえばアプリケーションで失敗した問合せの上位50位までを調べることが可能です。
問合せのロギングは、CTX_OUTPUT.START_QUERY_LOG.
によって開始しますCTX_OUTPUT.END_QUERY_LOG
プロシージャが開始されるまで、プログラムで使用しているすべてのCONTEXT
索引に対するすべての問合せが問合せログに書き込まれます。問合せのレポートを取得するには、CTX_REPORT.QUERY_LOG_SUMMARY
を使用します。
6.2.9 その他の問合せ機能
問合せアプリケーションでは、近接検索などのその他の問合せ機能を使用できます。表6-1は、これらの問合せ機能のいくつかを示しています。
表6-1 Oracle Textのその他の問合せ機能
機能 | 説明 | 実施方法 |
---|---|---|
大/小文字を区別する検索 |
問合せに入力したとおりに、ワードまたは句を正確に検索できます。たとえば、Romanの検索は、Romanを含み、romanを含まないドキュメントを戻します。 |
索引作成時に |
基本文字変換 |
ティルデ、アクセント、ウムラウトなどの発音区別符号に関係なく、ワードを問い合せます。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、energíaおよびenergiaが含まれているドキュメントが一致します。 |
索引作成時に |
ワード分割処理 (ドイツ語およびオランダ語) |
指定した語句が複合語の要素として含まれているワードを検索できます。 |
索引作成時に |
代替スペル (ドイツ語、オランダ語およびスウェーデン語) |
ワードの代替スペルを検索します。 |
索引作成時に |
近接検索 |
相互に近接しているワードを検索します。 |
問合せ入力時に |
|
特定の問合せに基づいてドキュメントをクランプに分割します。各クランプはプライマリ機能に基づいて分類され、2次機能に基づいてスコア付けされます。最終的なドキュメント・スコアにはクランプ・スコアが追加され、プライマリ機能の順序によってドキュメント・スコアの初期の順序が決まります。 |
問合せ入力時に |
ステミング |
指定した語句と同じ語幹を持つワードを検索します。 |
問合せ入力時に$演算子を使用します。 |
ファジー検索 |
指定した語句に類似するスペルを持つワードを検索します。 |
問合せ入力時に |
問合せの実行計画 |
問合せの解析情報を生成します。 |
索引作成後にPL/SQLプロシージャ |
階層問合せフィードバック |
問合せに対する上位語、下位語および関連語の情報を生成します。 |
索引作成後にPL/SQLプロシージャ |
索引のブラウズ |
索引内のシード・ワードに関するワードをブラウズします。 |
索引作成後にPL/SQLプロシージャ |
ヒット数のカウント |
問合せのヒット数をカウントします。 |
索引作成後にPL/SQLプロシージャ |
ストアド・クエリー式 |
後で別の問合せで再利用するために、問合せ式のテキストを保存します。 |
索引作成後にPL/SQLプロシージャ |
シソーラスを使用した問合せ |
シソーラスを使用して問合せを拡張します。 |
(シソーラスのメンテナンスには |