3 Oracle Text CONTAINS問合せ演算子

この章では、CONTAINS演算子の優先順位を説明し、各演算子の説明、構文および例を示します。

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

3.1 演算子の優先順位

演算子の優先順位は、問合せ式のコンポーネントが評価される順序を決定します。テキスト問合せ演算子は、それぞれ独自の評価順を持つ2組の演算子に分けることができます。次に、これら2つのグループをグループ1およびグループ2として説明します。

どのような場合でも、問合せ式は演算子の優先順位に従って、左から右の順に評価されます。優先順位の高い演算子が最初に評価されます。優先順位が等しい演算子は、式の中で現れる順序に従って左から右へ適用されます。

3.1.1 グループ1の演算子

問合せ式内のグループ1の演算子を優先順位の高い順に並べると次のようになります。

  1. EQUIValence (=)

  2. NEAR (;)

  3. WEIGHT (*), THRESHOLD (>)

  4. MINUS (-)

  5. NOT (~)

  6. MNOT

  7. WITHIN

  8. AND (&)

  9. OR (|)

  10. ACCUMulate ( _ )

3.1.2 グループ2の演算子および文字

問合せ式内のグループ2の演算子を評価順位の高い順に並べると次のようになります。

  1. ワイルドカード文字

  2. STEM ($)

  3. FUZZY

  4. SOUNDEX (!)

3.1.3 プロシージャ型演算子

グループ1にもグループ2にもリストされていないその他の演算子は、プロシージャ型演算子です。これらの演算子には優先順位がありません。これらには、SQEおよびシソーラス演算子が含まれます。

3.1.4 優先順位の例

表3-1 問合せ式の優先順位の例

問合せ式 評価順

w1 | w2 & w3

(w1) | (w2 & w3)

w1 & w2 | w3

(w1 & w2) | w3

?w1, w2 | w3 & w4

(?w1), (w2 | (w3 & w4))

abc = def ghi & jkl = mno

((abc = def) ghi) & (jkl=mno)

dog and cat WITHIN body

dog and(cat WITHIN body)

1番目の例では、ANDORよりも優先順位が高いため、問合せはw1を含むすべてのドキュメント、およびw2w3の両方を含むすべてのドキュメントを戻します。

2番目の例では、問合せはw1w2の両方を含むすべてのドキュメント、およびw3を含むすべてのドキュメントを戻します。

3番目の例では、最初にFUZZY演算子がw1に適用されます。次にAND演算子が引数w3およびw4に適用され、その後OR演算子がw2およびAND演算子の結果に適用されます。最後に、w1に対するFUZZY演算子のスコアがOR演算子のスコアに加えられます。

4番目の例は、EQUIVALENCE演算子がAND演算子より優先順位が高いことを示しています。

5番目の例は、AND演算子がWITHIN演算子より優先順位が低いことを示しています。

3.1.5 優先順位の変更

優先順位は、グループ化文字によって次のように変わります。

  • カッコ内の拡張操作または実行操作は、演算子の優先順位に関係なく、他の拡張操作に優先して解決されます。

  • カッコ内の式の評価に関しては、演算子の優先順位が有効です。

  • カッコ内では、拡張演算子は自身もカッコ内に存在しないかぎり式に適用されません。

3.2 ABOUT

動作概要

問合せ語句に関連するドキュメントを戻すには、ABOUT演算子を使用します。英語とフランス語では、ABOUTによって概念を問い合せることができます。これは、概念が実際に問合せに含まれていなくても可能です。たとえば、heat (熱)に対するABOUT問合せでは、temperature (温度)という語が問合せに含まれていなくても、温度に関連するドキュメントが戻されます。

その他の言語では、ABOUTを使用すると、多くの場合は戻されるドキュメントの数が多くなり、結果のソート順序が改善される場合があります。Oracle Textはすべての言語において、ABOUT問合せの結果に対し、関連性の最も高いドキュメントが最も高いスコアとなるようにスコア付けします。

英語とフランス語での動作

英語とフランス語では、ABOUT演算子を使用して概念を問い合せます。システムは、索引のテーマ・コンポーネントの概念情報を検索します。索引にテーマ・コンポーネントを作成するには、INDEX_THEMES BASIC_LEXER属性をYESに設定します。

ノート:

英語およびフランス語でABOUT問合せを入力する場合、索引にテーマ・コンポーネントは必要ありません。ただし、索引にテーマ・コンポーネントがあると、ABOUT問合せの結果が最も向上します。

Oracle Textでは、問合せワードまたは句に関連する概念を含むドキュメントを取り出します。たとえば、CaliforniaについてのABOUT問合せを入力すると、システムによって、Californiaの都市であるLos AngelesSan Franciscoという語句を含むドキュメントが戻されます。このABOUT問合せで戻されるドキュメントには、Californiaという語句は必ずしも含まれてはいません。

ABOUT問合せに指定したワードまたは句が、索引に格納されたテーマと完全に一致する必要はありません。Oracle Textは、索引の検索を実行する前に、ワードまたは句を正規化します。

ABOUT演算子は、CONTAINS SQL演算子およびCATSEARCH SQL演算子と併用できます。CATSEARCHの場合は、CONTEXT文法による問合せテンプレートを使用して索引テーマを問い合せる必要があります。「例」の項の「CATSEARCHによるABOUT問合せ」を参照してください。

構文

構文 説明

about(phrase)

すべての言語で、ABOUT演算子を指定していない同じ問合せに対して返される関連ドキュメントの数が多くなります。phraseパラメータは、1つのワード、句またはフリー・テキスト・フォーマットのワード文字列です。

英語およびフランス語では、索引付け時にBASIC_LEXER INDEX_THEMES属性がYESに設定された場合、phraseに関連する概念を含むドキュメントを戻します。

戻されたスコアは関連性スコアです。

Oracle Textでは、phraseに組み込まれた問合せ演算子は無視されます。

索引にテーマ情報のみが含まれている場合、ABOUT演算子およびオペランドをテキスト列の問合せに組み込む必要があります。そうしない場合、Oracle Textからエラーが戻されます。

指定するphraseは、4000文字以内です。

大/小文字の区別

問合せを適切な文字で表すと、ABOUT問合せの結果が最も向上します。これは、問合せの正規化が、大/小文字が区別されるナレッジ・カタログに基づくためです。

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

ABOUT結果の改善

ABOUT演算子は、英語とフランス語では、提供されているナレッジ・ベースを使用して入力された句を解析します。したがって、ABOUT問合せは、ナレッジ・ベースにある概念の認識と解析に制限されています。

使用しているアプリケーション固有の用語をナレッジ・ベースに追加すると、ABOUT問合せの結果が改善されます。

制限事項

  • ABOUT問合せで指定する句は、4000文字以内です。

  • ABOUT問合せ演算子は、セクション内ではサポートされていません。

ABOUT演算子の例

単一のワード

サッカー(soccer)についてのドキュメントを検索するには、次の構文を使用します。

'about(soccer)'

句を問合せ語句として入力することで、問合せをさらに詳細化し、国際大会のサッカー・ルール(soccer rules in international competition)についてのドキュメントを含めます。

'about(soccer rules in international competition)'

この英語の例では、soccerrulesまたはinternational competitionのテーマを持つすべてのドキュメントがOracle Textにより戻されます。

通常、スコア付けの点では、これら3つのテーマをすべて含むドキュメントの方が、これらのテーマのうちの1つまたは2つのみを含むドキュメントより高いスコアを示します。

構成されていない句

次の例のように、構成されていない句で問い合せることもできます。

'about(japanese banking investments in indonesia)'

結合された問合せ

ANDNOTなど、他の演算子を使用して、ABOUT問合せをワード問合せと結合します。たとえば、結合されたABOUTおよびワード問合せを次のように入力します。

'about(dogs) and cat'

次のように、ABOUT問合せを別のABOUT問合せと結合します。

'about(dogs) not about(labradors)'

ノート:

ABOUTは、'ABOUT (xyz) WITHIN abc'のようにWITHIN演算子と結合できません。

CATSEARCHによるABOUT問合せ

ABOUT問合せは、次のように、grammarにCONTEXTを設定した問合せテンプレートを使用して、CATSEARCHとともに入力します。

select pk||' ==> '||text from test
where catsearch(text,
'<query> 
  <textquery grammar="context">
     about(California)
  </textquery>
  <score datatype="integer"/>
</query>','')>0
order by pk; 

3.3 ACCUMulate(,)

問合せ語句のいずれかが1つ以上含まれるドキュメントを検索するには、ACCUM演算子を使用します。この場合、戻されるドキュメントは、検出された問合せ語句の数(および頻度)に基づく累積スコアによってランク付けされます。

構文

構文 説明

term1,term2

term1 ACCUM term2

term1またはterm2を含むドキュメントを戻します。語句の重みによってドキュメントをランク付けし、語句の合計の重みが最も高いドキュメントに最も高いスコアを割り当てます。

ACCUMulateスコアリング

ACCUMulateはまず、複数ある問合せ語句のうち、いくつの語句がドキュメントにあるかということに基づいてドキュメントをスコア付けします。一致する語句の数が多いドキュメントは、一致する語句の数が少ないドキュメントよりも常にスコアが高くなります。これは、後者のドキュメントの方が語句の出現頻度が高い場合でも当てはまります。つまり、dog ACCUM catを検索した場合、

the dog played with the cat 

は、次の文よりもスコアが高くなります。

the big dog played with the little dog while a third dog ate the dog food

スコアは複数の範囲に分けられます。2つの語句のACCUMでは、両方の語句に一致するヒットは、常に51から100の範囲のスコアとなりますが、いずれかの語句のみが一致するヒットは、1から50の範囲のスコアとなります。同様に、3つの語句のACCUMでは、1つの語句に一致するヒットは、1から33の範囲のスコアとなり、2つの語句に一致するヒットは34から66の範囲のスコアとなり、また3つのすべての語句に一致するヒットは67から100の範囲のスコアとなります。これらの範囲内では、通常のスコア付けのアルゴリズムが適用されます。

関連項目:

スコアの計算方法の詳細は、「Oracle Textのスコア付けのアルゴリズム」を参照してください。

複数の語句にそれぞれ異なる重みを割り当てることができます。たとえば、次の形式の問合せでは、

soccer, Brazil*3

Brazilという語句には、soccerの3倍の重みが割り当てられます。したがって、次のドキュメント

people play soccer because soccer is challenging and fun 

は、次のドキュメントよりも低いスコアになります。

Brazil is the largest nation in South America

ただし、どちらのドキュメントも、次のドキュメントより下にランク付けされます。

soccer is the national sport of Brazil

soccer ACCUM Brazil*3という問合せは、soccer ACCUM Brazil ACCUM Brazil ACCUM Brazilと同等である点に注意してください。問合せ語句Brazilはそれぞれ独立したものとみなされるため、問合せ全体が2つではなく4つの語句を含むもののようにスコア付けされ、したがってスコア付けの範囲も4つになります。前述のBrazilとsoccerのドキュメントの1つ目の例では、1つ目の範囲(1から25)、2つ目の例では3つ目の範囲(51から75)、3つ目の例では4つ目の範囲(76から100)でスコア付けされます。(Brazilが含まれるドキュメントは少なくとも3つの問合せ語句に一致するとみなされるため、2つ目の範囲でスコア付けされるドキュメントはありません。)

ACCUM演算子の例

set serveroutput on;
DROP TABLE accumtbl;
CREATE TABLE accumtbl (id NUMBER, text VARCHAR2(4000) );
 
INSERT INTO accumtbl VALUES ( 1, 'the little dog played with the big dog 
      while the other dog ate the dog food');
INSERT INTO accumtbl values (2, 'the cat played with the dog');
 
CREATE INDEX accumtbl_idx ON accumtbl (text) indextype is ctxsys.context;
  
PROMPT dog ACCUM cat
SELECT SCORE(10) FROM accumtbl WHERE CONTAINS (text, 'dog ACCUM cat', 10)
   > 0;
 
PROMPT dog*3 ACCUM cat
SELECT SCORE(10) FROM accumtbl WHERE CONTAINS (text, 'dog*3 ACCUM cat', 10)
   > 0;

これは、次の出力結果を戻します。dogおよびcatが両方とも含まれるドキュメントが最もスコアが高い点に注意してください。

dog ACCUM cat
   ID  SCORE(10)
----- ----------
    1          6
    2         52
 
dog*3 ACCUM cat
   ID  SCORE(10)
----- ----------
    1         53
    2         76

関連項目

WEIGHT (*)

3.4 AND(&)

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

構文

構文 説明

term1&term2

term1 and term2

term1およびterm2が両方含まれているドキュメントを戻します。そのオペランドの最小スコアを戻します。すべての問合せ語句が存在する必要があり、スコアの低い方が選択されます。

AND演算子の例

blueblackおよびredという語句が含まれているすべてのドキュメントを取得するには、次の問合せを入力します。

'blue & black & red'

AND問合せでは、各問合せ語句のスコアのうち最も低いスコアが戻ります。この例では、ドキュメント内のblue、blackおよびredの3つの語句のスコアがそれぞれ10、20および30の場合、ドキュメントのスコアは10になります。

関連項目

「OR (|)」

3.5 BROADER TERM(BT、BTG、BTP、BTI)

指定された問合せ語句の上位語としてシソーラスで定義されている語句が含まれるように問合せを拡張するには、BROADER TERM演算子(BTBTGBTPBTI)を使用します。上位語の上位語、さらにその上位語、というようにシソーラス階層を上がるように問合せを拡張できます。

構文

構文 説明

BT(term[(qualifier)][,level][,thes])

シソーラスでtermに対する上位語として定義されたすべての語句が含まれるように、問合せを拡張します。

BTG(term[(qualifier)][,level][,thes])

シソーラスでtermに対する上位汎用語として定義されたすべての語句が含まれるように、問合せを拡張します。

BTP(term[(qualifier)][,level][,thes])

シソーラスでtermに対する上位語分語として定義されたすべての語句が含まれるように、問合せを拡張します。

BTI(term[(qualifier)][,level][,thes])

シソーラスでtermに対する上位インスタンス語として定義されたすべての語句が含まれるように、問合せを拡張します。

term

BROADER TERM演算子にオペランドを指定します。termは、thesによって指定されたシソーラスで、語句に対して定義された上位語のエントリが含まれるようにOracle Textによって拡張されます。たとえば、BTG(dog)と指定すると、拡張には、dogに対する上位汎用語として定義されている語句のみが含まれます。拡張演算子はterm引数に指定できません。

この拡張に含まれる上位語の数は、levelの値によって決定されます。

qualifier

termthesの同じ階層分岐で2つ以上のノードに現れる同形異義語(同じスペルで複数の意味を持つワードまたは句)の場合は、termに修飾子を指定します。

BROADER TERM問合せで同形異義語に修飾子が指定されていない場合は、すべての同形異義語の上位語が含まれるように問合せが拡張されます。

level

指定された語句に対する上位語を戻すために、シソーラス階層内を横断するレベル数を指定します。たとえば、BTのレベル1問合せは、上位語が定義されている場合、指定した問合せ語句の上位語エントリを戻します。レベル2問合せは、指定した問合せ語句の上位語エントリ、さらにそれらの上位語の上位語エントリを戻します。

level引数はオプションで、デフォルト値は(1)です。level引数に0(ゼロ)または負の値を設定すると、元の問合せ語句のみを戻します。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。このデフォルト値を使用する場合は、シソーラス表にDEFAULTという名前のシソーラスが存在している必要があります

ノート:

thesを指定する場合は、levelも指定する必要があります。

BROADER TERM演算子の例

次の問合せは、tutorialという問合せ語句、またはDEFAULTシソーラスでtutorialBT語として定義された語句が含まれているすべてのドキュメントを戻します。

'BT(tutorial)'

シソーラス名を指定する場合は、次のようにlevelも指定する必要があります。

'BT(tutorial, 2, mythes)'

同形異義語のBROADER TERM演算子

machinecrane(building equipment)の上位語で、birdcrane(waterfowl)の上位語であり、上位語問合せに修飾子が指定されていない場合、問合せ

BT(crane) 

は、次のように拡張されます。

'{crane} or {machine} or {bird}'

上位語問合せでwaterfowlcraneの修飾子として指定されている場合、問合せ

BT(crane{(waterfowl)}) 

は、次のように拡張されます。

'{crane} or {bird}' 

ノート:

BROADER TERMまたはNARROWER TERM問合せで修飾子を指定する場合、修飾子およびその表記法(カッコ付け)はこの例のようにエスケープする必要があります。

関連項目

シソーラスの上位語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.BT」を参照してください。

3.6 CTXFILTERCACHE

Oracle Textには、問合せ結果のキャッシュに使用できる、問合せフィルタ・キャッシュというキャッシュ・レイヤーがあります。問合せフィルタ・キャッシュは、問合せ間で共有が可能です。そのため、キャッシュされた問合せ結果を複数の問合せで再利用でき、問合せの応答時間が短縮されます。問合せフィルタ・キャッシュでどの問合せ結果、または問合せ結果の一部をキャッシュするかを指定するには、CTXFILTERCACHE演算子を使用します。

CTXFILTERCACHEは、CONTEXT文法問合せのみサポートしています。テンプレート問合せなどのCONTAINER問合せは、サポートされません。テンプレート問合せに対して実行すると、エラーが発生します。

警告:

CTXFILTERCACHEを使用する前に、次のようにPURGE recyclebinを実行する必要があります。

SQL> PURGE recylebin;

ごみ箱のオブジェクトのパージの詳細は、『Oracle Database管理者ガイド』を参照してください。

構文

ctxfiltercache((query_text) [, save_score] [, topN])
query_text

結果をキャッシュに格納する必要がある問合せを指定します。

save_score

すべての問合せ結果を、そのスコアとともにキャッシュに格納する場合は、TRUEを指定します。

デフォルトはFALSEです。この場合、問合せ結果ごとに戻されるスコアは100で、このスコアはキャッシュに格納されません。問合せ結果のみキャッシュに格納されます。

問合せ結果は再利用し、そのスコアは他の問合せで再利用しない場合は、FALSEを指定します。これは、問合せテキストをセキュリティ・フィルタなどのフィルタとして使用する場合に特に便利です。キャッシュされた問合せの一部の関連性が、問合せ全体の関連性に影響しないような場合です。そのため、AND演算子(そのオペランドの低いスコアを戻す)とともに使用する場合、スコア100は問合せ全体のスコアに影響しません。

topN

上位スコアの問合せ結果のみをキャッシュに格納する場合は、TRUEを指定します。上位どのくらいのスコアの問合せ結果がキャッシュに格納されるかは、Oracle Textによって内部的に決定されます。これによって、キャッシュのメモリー消費量が抑えられます。

ノート:

topNTRUEを指定する場合は、save_scoreTRUEに設定する必要があります。

CTXFILTERCACHEの例

ストアド・クエリー結果およびTopNの例

次の例は、common_predicate問合せの問合せ結果をキャッシュに格納します。

select * from docs where contains(txt, 'ctxfiltercache((common_predicate), FALSE)')>0;

ここで、save_scoreFALSEです。したがって問合せ結果ごとに戻されるスコアは100であり、このスコアはキャッシュに格納されません。

次の例では、common_predicate問合せの結果がキャッシュされ、new_query問合せによって再利用されます。

select * from docs where contains(txt, 'new_query & ctxfiltercache((common_predicate), FALSE)')>0; 

common_predicate問合せの結果をすべて、実際のスコアとともにキャッシュに格納するには、次の例のようにsave_scoreTRUEに設定します。

select * from docs where contains(txt, 'ctxfiltercache((common_predicate), TRUE)')>0;

common_predicate問合せで上位スコアの結果のみをキャッシュに格納する場合は、次の例で説明しているように、topNTRUEに設定します。

select id, score(1) from docs where contains(txt, 'ctxfiltercache((common_predicate), TRUE, TRUE)', 1)>0 order by score(1) desc;

スコアが問合せの主要部分にのみ関連する場合、問合せの主要部分についてはtopNTRUEに設定し、フィルタ部分についてはFALSEに設定します。次の例は、ctxfiltercache句を2つ使用する問合せです。"cat AND dog"という自由テキスト検索を実行し、検索処理にセキュリティ・フィルタを適用します。この問合せで両方の部分の結果は別々にキャッシュされるため、再利用は可能ですが、スコアは問合せの最初の部分にしか該当しません。

select id, score(1) from docs where contains(txt, 'ctxfiltercache((cat AND dog), TRUE, TRUE) AND ctxfiltercache((john WITHIN allowedUsers), FALSE, FALSE)', 1) > 0;

キャッシュされたスコアの例

CTXFILTERCACHEは、一度にscoreの1つの問合せ結果をキャッシュに格納します。したがって、シリアルに実行される2つの類似の問合せは同じ問合せとみなされ、キャッシュに格納される問合せは1つのみです。

次の例の問合せAと問合せBは、2つの類似の問合せを示します。Aのヒット・スコアは100で、Bのヒット・スコアは5です。キャッシュが空で、問合せAを最初に実行するとします。計算されたスコア100は、この問合せのキャッシュに格納されます。問合せBを後ですぐに実行する場合、キャッシュに格納されたスコアの100が含まれるため、問合せBはキャッシュされたスコアの100を戻します。逆に、問合せAの前に問合せBを実行する場合、戻されるキャッシュおよび計算されたスコアは5です。

問合せA:

select  /*+ DOMAIN_INDEX_SORT */ id, score(1) as ORADD from mydocs where contains (txt ,'ctxfiltercache((DEFINEMERGE
        (       ((definescore(Oracle,relevance)),(definescore(Java,discrete)))
                ,OR,ADD
        )),T,T)',1)>0 order by score(1) desc;

問合せB:

select /*+ DOMAIN_INDEX_SORT */ id, score(1) as ORAVG from docs where contains (txt ,'ctxfiltercache((DEFINEMERGE
        (       ((definescore(Oracle,relevance)),(definescore(Java,discrete)))
                ,OR,AVG
        )),T,T)',1)>0 order by score(1) desc;

ノート

問合せフィルタ・キャッシュは、索引レベルの記憶域プリファレンスです。

問合せフィルタ・キャッシュの記憶域プリファレンスは、索引レベルでも設定されている場合のみ、パーティション・レベルで設定できます。フィルタ・キャッシュのプリファレンスを索引レベルで設定せずにフィルタ・キャッシュのプリファレンスをパーティション・レベルで設定すると、次のエラーがスローされます: 索引、プリファレンス、ソースまたはセクション名の構文に誤りがあります。

CTXFILTERCACHEは次の項目とともに使用されないので注意してください。

  • INPATH/HASPATH問合せ

  • NDATAおよびSDATAsyncindexの後の最初の問合せ

topNFALSEの場合、CTXFILTERCACHE演算子は最上位の演算子か、次の演算子の子です。

  • AND

  • ACCUM

  • NOT

  • OR

  • THRESHOLD (左辺の演算子のみ)

  • WEIGHT (左辺の演算子のみ)

topNTRUEの場合は、次のようになります。

  • ctxfiltercache演算子は最上位の演算子か、次の演算子の子です。

    • AND

    • THRESHOLD (左辺の演算子のみ)

    • WEIGHT (左辺の演算子のみ)

  • TopNは、ctxfiltercache演算子が順序キーORDER BY SCORE(n) DESCおよびグローバル索引用のOracleヒントDOMAIN_INDEX_SORTとともに使用される場合にのみ有効です。さらに、パーティション索引の場合、問合せにパーティション・プルーニングを必ず含めてください。そうしないと、topNをTRUEに設定しても、topNモードではなく通常モードが使用されます。

ノート:

ctxfiltercache演算子は、CONTEXT文法問合せのみサポートしています。つまり、テンプレート問合せのようなコンテナ問合せはサポートされません。

問合せテンプレートでctxfiltercacheを使用する場合、次のタイプのエラーが発生します。

ERROR at line 1:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50900: text query parser error on line 1, column 8
DRG-50905: invalid score threshold <textquery

このエラーになる問合せの例は、次のとおりです。

select score(1), id, txt from tdrbqfc45 where contains(txt, 'ctxfiltercache((<query><textquery>near2((a,b,c,d))
</textquery><score datatype="FLOAT"/>
</query>),true)', 1)>0 order by id;

ctxfiltercacheを使用するには、基本記憶域属性query_filter_cache_sizeを使用して、問合せフィルタ・キャッシュのサイズを指定する必要があります。デフォルトのサイズは0です。これは、ctxfiltercacheがデフォルトで無効であることを意味します。

ctx_filter_cache_statisticsビューには、問合せフィルタ・キャッシュに関する様々な統計が用意されています。

問合せフィルタ・キャッシュは、スコアの計算方法が異なるだけの問合せを区別しません。スコアは、問合せフィルタ・キャッシュ内ですぐに計算されません。この仕組みの図は、「キャッシュされたスコアの例」を参照してください。

関連項目

ctx_filter_cache_statisticsビューの詳細は、「CTX_FILTER_CACHE_STATISTICS」を参照してください。

query_filter_cache_size基本記憶域属性の詳細は、「BASIC_STORAGE」を参照してください。

3.7 DEFINEMERGE

ANDおよびORの子ノードのスコアをマージする方法を定義するには、DEFINEMERGE演算子を使用します。DEFINEMERGE演算子は、オペランドにANDまたはORを使用できる演算子のオペランドとして使用できます。スコアは3つの方法でマージできます。最小値を選択する方法、最大値を選択する方法、またはすべての子ノードの平均スコアを計算する方法です。

DEFINESCOREは、DEFINEMERGEを使用する前に使用してください。

構文

DEFINEMERGE ( (  (text_query1), (text_query2), … )  , operator, merge_method )
構文 説明

text_query1,2 ...

検索基準を定義します。これらのパラメータには、ANDまたはOR演算子に対して有効な値を設定できます。

operator

2つのtext_queryパラメータ間の関係を定義します。

merge_method

text_queryのスコアのマージ方法を定義します。有効な値: MINMAXAVGADD

DEFINEMERGE演算子の例

'DEFINEMERGE (((dog , cat) , (blue or black)), AND, MIN )'

「dog ACCUM cat」および「blue OR black」という式は、デフォルトのスコア付けスキーマを使用し、次に、2つの最小スコアを、マージしたスコアとして使用して問い合せます。

'DEFINEMERGE( ((DEFINESCORE(dog, DISCRETE)) , (cat)), AND, MAX)'

「dog」の語句にはDISCRETEスコア付けを使用し、「cat」の語句にはデフォルトの関連性スコア付けを使用し、次に、2つの最大スコアを、マージしたスコアとして使用して問い合せます。

例3-1 DEFINEMERGEおよびtext_query

次の例では、CONTAINS問合せのtext_query部分のみを示します。

'DEFINEMERGE ( ((dog), (cat)), OR, AVG)'

「dog」や「cat」の語句は、両方の語句の平均関連性スコアを、マージしたスコアとして使用して問い合せます。

関連項目

DEFINESCORE

3.8 DEFINESCORE

語句、句または一連のEQUIVALENCE語句のスコア付け方法を定義するには、DEFINESCORE演算子を使用します。スコアリング式の定義は、事前定義済のスコアリング・コンポーネントと数値リテラルの算術式で構成できます。

DEFINEMERGEは、DEFINESCOREの後に使用できます。

構文

DEFINESCORE (query_term, scoring_expression)
query_term

問合せ語句または句。次の演算子を含む式も使用できます。

演算子 演算子

-

-

ABOUT

EQUIV(=)

FUZZY

SOUNDEX(!)

STEM($)

ワイルド・カード(% _)

SDATA

MDATA

scoring_expression

query_termのスコア付け方法を示す算術式。このオペランドは、次のコンポーネントを含む文字列です。

  • 算術演算子: + - * /。優先順位は、乗算および除算(*、/)が加算および減算(+、-)よりも高くなります。

  • グループ化演算子: ()。カッコを使用すると、算術演算子の優先順位を変更できます。

  • 絶対値関数: ABS(n)nの絶対値を戻します。nは数値を戻す式です。

  • 対数関数: LOG(n)は、nの基数10の対数値を戻します。nは数値を戻す式です。

  • 事前定義済のスコアリング・コンポーネント: 次の各スコアリング・コンポーネントは、様々な基準に応じて0から100の値を戻します。

    名前 説明

    DISCRETE

    ドキュメントに語句が存在する場合はscore = 100を戻します。存在しない場合はscore = 0を戻します。

    OCCURRENCE

    出現回数に基づいてスコア付けします。

    RELEVANCE

    ドキュメントの関連性に基づいてスコア付けします。

    COMPLETION

    対象範囲に基づいてスコア付けします。セクションで一致語句数とすべての語句数(ストップワード数を含む)間の比率が高いほど、ドキュメントのスコアは高くなります。COMPLETIONスコア付けが適用されるのは、WITHIN演算子を使用してゾーン・セクションを検索する場合のみです。

    IGNORE

    語句に対するスコア付けを無視します。このコンポーネントは単独で使用する必要があります。単独で使用しない場合は、問合せで構文エラーが戻されます。問合せで唯一の語句のスコア付けがIGNOREに設定されている場合は、すべての一致ドキュメントが100の同一スコアで戻されます。

ノート:

数値リテラルの場合は、SQLの数値リテラルのパターンに準拠し、倍精度浮動小数点(-3.4e38から3.4e38)の範囲内にある数値リテラルを使用できます。

scoring_expression構文

<Exp>   :=         <Exp> + <Term> | <Exp> - <Term> |  <Term>
 
<Term>   :=         <Term> * <Factor> | <Term> / <Factor> | <Factor>
 
<Factor> :=         <<NumericLiterals >>| DISCRETE | OCCURRENCE | RELEVANCE |
         COMPLETION | IGNORE |  ( <Exp> ) | -<Factor> | Abs(<Exp>) | Log(<Exp>)

DEFINESCORE演算子の例

'DEFINESCORE (dog, OCCURRENCE)'

dogというワードを問い合せ、出現スコアを使用して各ドキュメントをスコア付けします。スコアは整数で戻ります。

'DEFINESCORE (Labradors are big dog, RELEVANCE)'

Labradors are big dogsという句を問い合せ、関連性スコアを使用して各ドキュメントをスコア付けします。

'cat and DEFINESCORE (dog, IGNORE)'

dogおよびcatというワードを問い合せます。catのデフォルトの関連性スコアのみをドキュメント全体のスコアとして使用します。スコアは整数で戻ります。

'DEFINESCORE (dog, IGNORE)'

dogというワードを問い合せ、dogというワードが含まれたすべてのドキュメントを戻します。この結果は、すべてのドキュメントのスコアが100になるのと同じです。スコアは整数で戻ります。

'DEFINESCORE (dog, ABS (100-RELEVANCE))'

dogというワードを問い合せ、100から関連性スコアを差し引いた絶対値を使用して各ドキュメントをスコア付けします。スコアは整数で戻ります。

'cat and DEFINESCORE (dog, RELEVANCE*5 - OCCURRENCE)'

構文エラー: 「事前定義済のコンポーネントが2つ使用されています。」が戻されます。

問合せテンプレートでDEFINESCOREが使用されている場合は、scoring_expressionがテンプレートで指定した値よりも優先されます。次の例では、「dog」と「cat」を問い合せ、「cat」はOCCURRENCE(COUNT)を使用してスコア付けし、「dog」はRELEVANCEに基づいてスコア付けします。

<query>
      <textquery grammar="CONTEXT" lang="english">
                 DEFINESCORE(dog, RELEVANCE) and  cat
      </textquery>
      <score datatype="INTEGER" algorithm="COUNT"/>
</query>

制限事項

  • ABOUT演算子がquery_termで使用されている場合、OCCURRENCECOMPLETIONのスコア付けは適用できません。使用されている場合は、問合せで構文エラーが戻されます。

  • IGNOREスコアは、MINUS演算子の右側で使用できません。使用した場合は、構文エラーが発生します。

  • COMPLETIONスコアを適用できるのは、DEFINESCOREWITHIN演算子とともに使用してゾーン・セクションを検索する場合のみです。次に例を示します。

    'DEFINESCORE (dog, COMPLETION) within zonesection'

    それ以外の場合は、問合せで構文エラーが戻されます。

  • WITHINの左側のオペランドの制限事項は、次のとおりです。

    • すべてのノードで、同じ事前定義済のスコアリング・コンポーネントを使用する必要があります。(指定しない場合、事前定義済のスコア付けはRELEVANCEになります。)

    • ノードでDISCRETEまたはCOMPLETIONを使用する場合、WITHINの左側の子として使用できる演算子はANDおよびOR演算子のみです。

    • ノードでDISCRETEまたはCOMPLETIONを使用する場合、WITHINでは、すべてのセクション・インスタンスの最大スコアをスコアとして使用します。

    • ノードでRELEVANCEまたはOCCURRENCEを使用する場合、WITHINでは、すべてのセクション・インスタンスのスコアの合計をスコアとして使用します。

  • 一度にscoring_expressionで使用できる事前定義済のスコアリング・コンポーネントは1つのみです。複数の事前定義済のスコアリング・コンポーネントを使用した場合は、構文エラーが発生します。

ノート

  • DEFINESCORE演算子、絶対値関数、対数関数および事前定義済のスコアリング・コンポーネントでは、大/小文字は区別されません。

  • query_termおよびscoring_expressionパラメータは必須です。

  • DEFINESCORE演算子の最終スコアは、0から100の範囲に切り捨てられます。データ型がINTEGERの場合、スコアは切り上げられます。

  • 中間データ型のスコア付けの値は倍精度浮動小数点です。したがって、その値は-3.4e38から3.4e38の範囲に制限されます。ドキュメントの中間スコア付けがこの値を超えた場合、そのスコアは切り捨てられます。整数のスコア付けが必要な場合、計算された後のそのスコアは常に切り上げられます。

  • DEFINESCORE演算子は、次の演算子のオペランドとして使用できます。

    • AND

    • NOT

    • INPATH

    • THRESHOLD

    • WITHIN

    • SQE

    • OR

    • DEFINEMERGE

    • MINUS

    • WEIGHT

    • ACCUM

    たとえば、次の文は有効です。

    DEFINESCORE('dog', OCCURRENCE) AND DEFINESCORE('cat', RELEVANCE)
    

    「dog」の語句は出現スコア付けを使用して問い合せ、「cat」の語句は関連性スコア付けを使用して問い合せます。

  • DEFINESCOREが他の演算子のパラメータとして使用されている場合は、エラーが戻されます。たとえば、次の例ではエラーが戻されます。

    SYN(DEFINESCORE('cat', OCCURRENCE))
    
  • 問合せテンプレートで使用されている場合は、scoring_expressionがテンプレートで指定した値よりも優先されます。次に例を示します。

    <query>
        <textquery grammar="CONTEXT" lang="english">
            DEFINESCORE(dog, RELEVANCE) and  cat
        </textquery>
        <score datatype="INTEGER" algorithm="COUNT"/>
    </query>
    

    は、「dog」と「cat」を問い合せ、「cat」はOCCURRENCE(COUNT)を使用してスコア付けし、「dog」はRELEVANCEに基づいてスコア付けします。

関連項目

DEFINEMERGE

3.9 EQUIValence(=)

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

構文

構文 説明

term1=term2

term1 equiv term2

term2term1の条件を満たす置換語であることを指定します。スコアは、両方の語句の出現回数の合計として計算されます。

EQUIV演算子の例

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

'labradors=alsatians are big dogs'

演算子の優先順位

EQUIV演算子は、拡張演算子(FUZZY、SOUNDEX、STEM)を除く他のすべての演算子より高い優先順位を持ちます。

3.10 FUZZY

指定された語句に類似するスペルのワードが含まれるように問合せを拡張するには、fuzzy演算子を使用します。この拡張タイプは、ドキュメント・セットにスペル・ミスが多い場合に、より正確な結果を検索するために有効です。

fuzzy構文を使用すると、結果セットのランク付けができます。このランク付けによって、問合せワードに対する類似度が高いワードを含むドキュメントには、類似度の低いワードを含むドキュメントより高いスコアが割り当てられます。また、拡張する語句の数も制限できます。

STEM拡張とは異なり、fuzzy拡張によって生成されるワード数は、索引内のワードによって異なります。したがって、結果は、索引の内容によって大幅に変わってきます。

サポートされている言語

Oracle Textでは、英語、フランス語、ドイツ語、イタリア語、オランダ語、スペイン語、ポルトガル語、日本語、OCRおよび自動言語識別のfuzzy定義をサポートしています。

ストップワード

fuzzy拡張がストップワードを戻す場合、そのストップワードは問合せの中には含まれず、CTX_DOC.HIGHLIGHTまたはCTX_DOC.MARKUPでハイライト表示もされません。

基本文字変換

テキスト列に基本文字変換を使用でき、問合せ式にfuzzy演算子が指定されている場合は、Oracle Textによって問合せの基本文字書式が処理されます。

構文

fuzzy(term, score, numresults, weight)
パラメータ 説明

term

fuzzy拡張の実行対象ワードを指定します。Oracle Textにより、termが索引内のワードのみを含むように拡張されます。fuzzy演算子で処理するには、ワードは3文字以上である必要があります。

score

類似度スコアを指定します。この数値未満のスコアを割り当てられた拡張内の語句は、排除されます。1から80の数を指定します。デフォルトは60です。

numresults

termの拡張に使用する語句の最大数を指定します。1から5000の数を指定します。デフォルトは100です。

weight

結果に対して、それぞれの類似度スコアに応じて重みを付ける場合は、WEIGHTまたはWを指定します。

結果に重みを付けない場合は、NOWEIGHTまたはNを指定します。

FUZZY演算子の例

次のCONTAINS問合せについて考えます。

...CONTAINS(TEXT, 'fuzzy(government, 70, 6, weight)', 1) > 0;

この問合せは、類似度スコアが70を超える、索引にあるgovernmentの最初の6つのfuzzyバリエーションに拡張されます。

さらに、結果セットのドキュメントには、governmentに対するそれぞれの類似度に応じて重み付けが行われます。governmentに最も類似しているワードが含まれているドキュメントに、最も高いスコアが割り当てられます。

不要なパラメータは、適切な数のカンマを使用してスキップします。次に例を示します。

'fuzzy(government,,,weight)'

下位互換性のための構文

前のリリースの古いfuzzy構文も引き続きサポートされています。この構文は、次のとおりです。

パラメータ 説明

?term

スペルが似ているすべての語句が、指定した問合せ語句に含まれるように問合せtermを拡張します。fuzzy演算子で処理するには、termは3文字以上である必要があります。

3.11 HASPATH

指定したセクション・パスを含むすべてのXMLドキュメントを検索するには、HASPATH演算子を使用します。また、この演算子を使用すると、セクションの等価性もテストできます。

この演算子を機能させるには、PATH_SECTION_GROUPを使用して索引を作成する必要があります。

構文

構文 説明

HASPATH(path)

XMLドキュメント・セットを検索し、pathが存在するすべてのドキュメントに対してスコア100を戻します。親と子のパスは、/文字で区切ります。たとえば、A/B/Cと指定できます。

例を参照してください。

HASPATH(A="value")

XMLドキュメント・セットを検索し、valueの内容のみ含まれている要素Aがあるすべてのドキュメントに対してスコア100を戻します。

例を参照してください。

HASPATHおよびINPATHでの特殊文字の使用

HASPATHおよびINPATH演算子で特殊文字を使用する場合のルールは次のとおりです。

  • 左中カッコ({)と右中カッコ(})文字は、二重引用符で囲まれた等価オペランド内にある場合を除き、HASPATHまたはINPATH式内では使用できません。このため、HASPATH({/A/B})およびHASPATH(/A/{B})では、エラーが戻されます。ただし、HASPATH(/A[B="{author}"])は正常に解析されます。

  • 円記号(\)を除き、ドル記号($)、パーセント記号(%)、アンダースコア(_)、左中カッコ({)、右中カッコ(})などの特殊文字は、二重または一重引用符で囲まれた等価オペランド内にある場合、特殊な意味を持ちません。(つまりこれらに対しては、ステミング、ワイルド・カード拡張またはこれに類似する処理は実行されません。)ただし、これらは通常のテキストのレクサー処理の対象であり、printjoinとして宣言された文字を除き、空白に変換されます。円記号は、そのすぐ後に続く文字をエスケープします。

    たとえば、ハイフン(-)と二重引用符(")がレクサー・プリファレンスでprintjoinとして定義されている場合は、次のようになります。

    • HASPATH(/A[B="B_TEXT")内の文字列B_TEXTは、句B TEXTとしてレクサー処理されます。

    • HASPATH(/A[B="B-TEXT")内の文字列B-TEXTは、ワードB-TEXTとしてレクサー処理されます。

    • HASPATH(/A[B="B'TEXT")内の文字列B'TEXTは、ワードB"TEXTとしてレクサー処理されます。円記号を使用して、BTEXTの間の二重引用符をエスケープする必要があります。そうしないと、解析エラーが戻されます。

    • HASPATH(/A[B="{B_TEXT}")内の文字列{B_TEXT}は、句B TEXTとしてレクサー処理されます。

HASPATH演算子の例

パスのテスト

次の問合せの例を示します。

HASPATH(A/B/C)

は、次のドキュメントを検索して、スコア100を戻します。

<A><B><C>dog</C></B></A>

この問合せでは、dogは参照されません。

セクションの等価性のテスト

次の問合せの例を示します。

dog INPATH A

finds

<A>dog</A>

さらに、次のドキュメントも検索します。

<A>dog park</A>

問合せを、語句dogのみに制限し、それ以外の語句を検索しないようにする場合は、HASPATH演算子によるセクションの等価性のテストを使用できます。次に例を示します。

HASPATH(A="dog")

は、最初のドキュメントを検索し、スコア100を戻します。2番目のドキュメントは検索しません。

制限事項

XMLのセクション・データの記録方法により、完全に空のXMLセクションの場合は、次のように不適切な一致が発生することがあります。

<A><B><C></C></B><D><E></E></D></A>

HASPATH(A/B/E)またはHASPATH(A/D/C)の問合せでは、このドキュメントと不適切に一致します。この種の不適切な一致は、空のタグの間にテキストを挿入することで回避できます。

ドキュメントに空の要素があり、属性に値がある場合には、次の例のドキュメントのように不適切な一致が発生することがあります。

<Test>
<Client id="1">
 <Info infoid="1"/>
</Client>
<Client id="2">
 <Info infoid="2"/>
</Client>
</Test>

次の問合せで検索すると、例のように問合せでドキュメントが戻されますが、これは不適切な一致です。

次の問合せを使用すると、例のドキュメントが戻されますが、これは不適切な一致です。

SELECT main_detail_logging_id, t.xml_data.getstringval() xml_data FROM
TEST_XMLTYPE t
WHERE CONTAINS(t.xml_data,
'HASPATH(/Test/Client[@id="1"]/Info[@infoid="2"])') > 0;

3.12 INPATH

XMLドキュメントでパス検索を実行するには、INPATH演算子を使用します。この演算子は、WITHIN演算子と似ています。ただし、右側には、単一のセクション名ではなく、カッコで囲んだパスが置かれます。

INPATH演算子を機能させるには、PATH_SECTION_GROUPを使用して索引を作成する必要があります。

構文

INPATH演算子の構文は、次のとおりです。

トップレベルのタグ検索

構文 説明

term INPATH (/A)

term INPATH (A)

<A>および</A>タグ内にtermが含まれているドキュメントを戻します。

任意レベルのタグ検索

構文 説明

term INPATH (//A)

任意レベルの<A>タグにtermが含まれているドキュメントを戻します。この問合せは、'term WITHIN A'と同じです。

直接の親子関係のパス検索

構文 説明

term INPATH (A/B)

トップレベルの要素Aの直接の子である要素Bにtermが含まれているドキュメントを戻します。

たとえば、次のドキュメント

<A><B>term</B></A>

が戻されます。

単一レベルのワイルド・カード検索

構文 説明

term INPATH (A/*/B)

トップレベルの要素Aの孫(2レベル下位)である要素Bにtermが含まれているドキュメントを戻します。

たとえば、次のドキュメント

<A><D><B>term</B></D></A>

が戻されます。

マルチレベルのワイルド・カード検索

構文 説明

term INPATH (A/*/B/*/*/C)

トップレベルの要素Aの2レベル下位(孫)にある要素Bから3レベル下位の要素Cにtermが含まれているドキュメントを戻します。

任意レベルの子検索

構文 説明

term INPATH(A//B)

トップレベルの要素Aの子(任意レベル)である要素Bにtermが含まれているドキュメントを戻します。

属性検索

構文 説明

term INPATH (//A/@B)

任意レベルの要素Aの属性Bにtermが含まれているドキュメントを戻します。属性は、直接の親にバインドされている必要があります。

子/属性の存在のテスト

構文 説明

term INPATH (A[B])

要素Bを直接の子として持つトップレベルの要素Aにtermが含まれているドキュメントを戻します。

term INPATH (A[.//B])

任意レベルの要素Bを子として持つトップレベルの要素Aにtermが含まれているドキュメントを戻します。

term INPATH (//A[@B])

属性Bを持つ任意レベルの要素Aにtermが含まれているドキュメントを検索します。属性は、直接の親に結合されている必要があります。

属性値のテスト

構文 説明

term INPATH (A[@B = "value"])

値がvalueである属性Bを持つトップレベルの要素Aにtermが含まれているすべてのドキュメントを検索します。

term INPATH (A[@B != "value"])

値がvalue以外の属性Bを持つトップレベルの要素Aにtermが含まれているすべてのドキュメントを検索します。

タグ値のテスト

構文 説明

term INPATH (A[B = "value"]))

値がvalueであるタグBを持つタグAにtermが含まれているドキュメントを戻します。

NOTのテスト

構文 説明

term INPATH (A[NOT(B)])

要素Bを直接の子として持たないトップレベルの要素Aにtermが含まれているドキュメントを検索します。

ANDおよびORのテスト

構文 説明

term INPATH (A[B and C])

要素Bと要素Cを直接の子として持つトップレベルの要素Aにtermが含まれているドキュメントを検索します。

term INPATH (A[B and @C="value"]])

要素Bと値がvalueである属性Cを持つトップレベルの要素Aにtermが含まれているドキュメントを検索します。

term INPATH (A [B OR C])

要素Bまたは要素Cを持つトップレベルの要素Aにtermが含まれているドキュメントを検索します。

パスとノードの組合せのテスト

構文 説明

term INPATH (A[@B = "value"]/C/D)

値がvalueである属性Bを持つトップレベルの要素Aの子が要素Cの場合、要素Cの子である要素Dにtermが含まれているドキュメントを戻します。

ネストされたINPATH

次のように、INPATH式全体を別のINPATH式内にネストします。

(dog INPATH (//A/B/C)) INPATH (D)

ネストを実行しても、2つのINPATHのパスは完全に独立しています。外部INPATHのパスは、内部INPATHのパスのコンテキスト・ノードを変更しません。次に例を示します。

(dog INPATH (A)) INPATH (D)

この式は、ドキュメントを検索しません。内部INPATHは、トップレベルのタグA内のdogを検索し、外部INPATHは、トップレベルのタグDを持つドキュメントに検索を制限されているためです。ドキュメントが保持できるトップレベルのタグは1つのみです。このため、この式はドキュメントを検索しません。

大/小文字の区別

パス検索では、タグ名と属性名の大/小文字が区別されます。次に例を示します。

dog INPATH (A)

この式では、<A>dog</A>は検索されますが、<a>dog</a>は検索されません。この場合は、次の式を使用します。

dog INPATH (a)

INPATHでの特殊文字の使用

INPATHでのパーセント記号(%)や円記号(\)などの特殊文字の使用の詳細は、「HASPATHおよびINPATHでの特殊文字の使用」を参照してください。

INPATH演算子の例

トップレベルのタグ検索

トップレベルのタグ<A>に、語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを実行します。

dog INPATH (/A)

または

dog INPATH(A)

任意レベルのタグ検索

任意レベルの<A>タグに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを実行します。

dog INPATH(//A)

この問合せは、次のドキュメントを検索します。

<A>dog</A>

および

<C><B><A>dog</A></B></C>

直接の親子関係の検索

トップレベルの要素Aの直接の子である要素Bに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH(A/B)

この問合せは、次のXMLドキュメントを検索します。

<A><B>My dog is friendly.</B><A>

ただし、次のドキュメントは検索しません。

<C><B>My dog is friendly.</B></C>

タグ値のテスト

タグの値をテストできます。たとえば、次の問合せ

dog INPATH(A[B="dog"])

は、次のドキュメントを検索します。

<A><B>dog</B></A>

ただし、次のドキュメントは検索しません。

<A><B>My dog is friendly.</B></A>

属性検索

属性の内容を検索できます。たとえば、次の問合せ

dog INPATH(//A/@B)

次のドキュメントを検索します。

<C><A  B="snoop dog"> </A> </C>

属性値のテスト

属性の値をテストできます。たとえば、次の問合せ

California INPATH (//A[@B = "home address"])

は、次のドキュメントを検索します。

<A B="home address">San Francisco, California, USA</A>

ただし、次のドキュメントは検索しません。

<A B="work address">San Francisco, California, USA</A>

パスのテスト

HASPATH演算子を使用して、パスの存在をテストできます。たとえば、次の問合せ

HASPATH(A/B/C)

は、次のドキュメントを検索して、スコア100を戻します。

<A><B><C>dog</C></B></A>

この問合せでは、dogは参照されません。

制限事項

等価性のテスト

INPATHによる等価性のテストの例を次に示します。

dog INPATH (A[@B = "foo"])

これらの式には、次の制限事項が適用されます。

  • 等価性と非等価性のみがサポートされています。範囲演算子および範囲関数は、サポートされていません。

  • 等式の左側には属性を置く必要があります。タグとリテラルは、左側に置くことができません。

  • 等式の右側にはリテラルを置く必要があります。タグと属性は、右側に置くことができません。

  • 等価性のテストは、使用しているレクサーの設定によって異なります。デフォルト設定の場合の例を示します。

    dog INPATH (A[@B= "pot of gold"])
    

    この問合せは、次のセクションと一致します。

    <A B="POT OF GOLD">dog</A>
    

    および

    <A B="pot of gold">dog</A>
    

    これは、デフォルト設定のレクサーでは、大/小文字が区別されないためです。

    <A B="POT IS GOLD">dog</A>

    これは、英語ではofおよびisはデフォルトのストップワードであり、ストップワードは任意のストップワードのワードと一致するためです。

    <A B="POT_OF_GOLD">dog</A>
    

    これは、デフォルトでは、アンダースコアが結合文字ではないためです。

3.13 MDATA

MDATAセクションが含まれるドキュメントを問い合せるには、MDATA演算子を使用します。MDATAセクションは、複合問合せを高速化するためにドキュメントに追加されたメタデータです。

MDATAはリテラルとして処理されます。たとえば、次の問合せ

MDATA(price, $1.24)

では、$はSTEM演算子として解釈されません。また、. (ピリオド)も空白に変換されません。MDATA演算子の範囲は右(閉じ)カッコまでであるため、右カッコを持つMDATA値は検索されません。

構文

MDATA(sectionname, value)
sectionname

検索するMDATAセクションの名前。sectionnameパラメータがDATEFILTER BY列または一部の数値型にマップされている場合、MDATADATEまたは数値等価も検索します。

value

MDATAセクションの値。たとえば、Booktypeという名前のMDATAセクションが作成されている場合、値の例としてpaperbackがあります。

DATE FILTER BY列にマップされているMDATAセクションに対するMDATA演算子の場合、MDATAの値は日付書式のYYYY-MM-DD HH24:MI:SSに準拠している必要があります。準拠していない場合は、必要な行が戻されません。時間のコンポーネントを省略した場合は、SQLセマンティクスに従って00:00:00にデフォルト設定されます。

MDATA演算子の例

たとえば、作家Nigella Lawsonの著書を問い合せるとします。問い合せる著書にはsummerというワードが含まれています。AUTHORという名前のMDATAセクションが宣言されているとの想定で、次のような問合せを実行できます。

SELECT id FROM idx_docs
  WHERE CONTAINS(text, 'summer AND MDATA(author, Nigella Lawson)')>0

この問合せは、(簡易トークン化後の)AUTHORタグの値がNigella Lawsonである場合にのみ有効です。NigellaまたはMs. Nigella Lawsonの場合は無効です。

ノート

MDATA問合せ値では、ストップワードは無視されます。

MDATA演算子は、ドキュメントが一致するかどうかに応じて、無制限な結果の数または0を戻します。最大値を設定できます。

CTXCATおよびCTXRULE索引に対して、MDATA演算子はサポートされていません。

表3-2に、MDATAと一部の他の問合せ演算子との関係を示します。

表3-2 MDATAおよび他の問合せ演算子

演算子 yes/no

AND

dog & MDATA(a, b)

yes

OR

dog | MDATA(a, b)

yes

NOT

dog ~ MDATA(a, b)

yes

MINUS

dog - MDATA(a, b)

yes

ACCUM

dog , MDATA(a, b)

yes

PHRASE

MDATA(a, b) dog

no

NEAR

MDATA(a, b) ; dog

no

WITHIN、HASPATH、INPATH

MDATA(a, b) WITHIN c

no

シソーラス

MDATA(a, SYN(b))

no

拡張

MDATA(a, $b)

MDATA(a, b%)

MDATA(a, !b)

MDATA(a, ?b)

no(構文上は可能ですが、内部演算子はリテラル・テキストとして処理されます)

ABOUT

ABOUT(MDATA(a,b))

MDATA(ABOUT(a))

no(構文上は可能ですが、内部演算子はリテラル・テキストとして処理されます)

MDATAセクションが繰り返される場合、各インスタンスは別個の独立した値です。たとえば、ドキュメント

<AUTHOR>Terry Pratchett</AUTHOR><AUTHOR>Douglas Adams</AUTHOR>

は、次の問合せのいずれを使用しても検出できます。

MDATA(author, Terry Pratchett)
MDATA(author, Douglas Adams)
MDATA(author, Terry Pratchett) and MDATA(author, Douglas Adams)

次の問合せでは検出できません。

MDATA(author, Terry Pratchett Douglas Adams)
MDATA(author, Terry Pratchett & Douglas Adams)
MDATA(author, Pratchett Douglas)

関連項目

ADD_MDATA

ADD_MDATA_SECTION

関連項目:

セクション検索の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

3.14 MINUS(-)

不要なノイズ語句が含まれているドキュメントのスコアを低くするには、MINUS演算子を使用します。MINUSは、特定の問合せ語句が含まれているドキュメントを検索し、2番目の問合せ語句が存在するドキュメントのランクを低くする場合に有効です。

構文

構文 説明

term1-term2

term1 minus term2

term1が含まれているドキュメントを戻します。term1のスコアからterm2のスコアを引いて、スコアを計算します。正数のスコアを持つドキュメントのみが戻されます。

MINUS演算子の例

たとえばcarsという語句についての問合せが、常にFord carsについてのドキュメントに高いスコアを戻すとします。次の式を使用して、Fordに関するドキュメントのスコアを低くできます。

'cars - Ford'

この式は語句carsを含むドキュメントを戻しますが、Ford も含まれている可能性があります。ただし、戻されたドキュメントのスコアは、carsのスコアからFordのスコアを差し引いた値になります。

関連項目

「NOT (~)」

3.15 MNOT

Mild Not(MNOT)演算子は、NOTおよびMINUS演算子と似ています。Mild Not演算子は、左の子が右の子に含まれない場合のヒットを戻します。どちらの子も、TERMまたはPHRASEノードのみ使用できます。

セマンティクスは、「term1 mnot term1 term2」の問合せで示すことができます。「term1 term2」のヒットはフィルタで除外されます。次に例を示します。

  • term1のみ使用するドキュメントが戻されます。スコアは変更されません。

  • term1 term2のみ使用するドキュメントは戻されません。

  • term1 term1 term2を使用するドキュメントが戻されますが、最初のterm1のヒットのみでスコアが計算されます。

3番目の項目の動作は、このタイプのドキュメントを戻さないNOTの動作と異なります。

MNOT演算子は、左の子が右の子に含まれる必要があるため、MINUS演算子よりも詳細です。それ以外の場合、Mild Not演算子は、右の子を無視します。また、Mild Notでは右の子が正確なフィルタです。つまり、左の子と右の子のスコアがただ引かれるだけではありません。

MNOT演算子は、NOTより低くWITHINより高い優先順位を持ちます。

構文

構文 説明

term1 mnot term2

term1 term2句の一部ではないかぎり、term1を含むドキュメントを戻します。

term1 mnot term2

term1が含まれているすべてのドキュメントを戻します。term1と同じ問合せになります。

MNOT演算子の例

MNOT演算子の子には、TERMまたはPHRASEを使用する必要があります。

SELECT * FROM docs
WHERE CONTAINS(txt, 'term1 mnot term1 term2') >0

関連項目

NOT (~)

3.16 NARROWER TERM(NT、NTG、NTP、NTI)

指定された問合せ語句の下位語としてシソーラスで定義されているすべての語句が含まれるように問合せを拡張するには、NARROWER TERM演算子(NTNTGNTPNTI)を使用します。また、下位語の下位語、さらにその下位語、というようにシソーラス階層を下がるように問合せを拡張できます。

構文

構文 説明

NT(term[(qualifier)][,level][,thes])

シソーラスでtermに対する下位語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。

NTG(term[(qualifier)][,level][,thes])

シソーラスでtermに対する下位汎用語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。

NTP(term[(qualifier)][,level][,thes])

シソーラスでtermに対する下位部分語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。

NTI(term[(qualifier)][,level][,thes])

シソーラスでtermに対する下位インスタンス語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。

term

NARROWER TERM演算子にオペランドを指定します。termは、thesによって指定されたシソーラスで、語句に対して定義された下位語のエントリが含まれるように拡張されます。この拡張に含まれる下位語の数は、levelの値によって決定されます。拡張演算子はterm引数に指定できません。

qualifier

termthesの同じ階層分岐で2つ以上のノードに現れる同形異義語(同じスペルで複数の意味を持つワードまたは句)の場合は、termに修飾子を指定します。

NARROWER TERM問合せで同形異義語に修飾子が指定されていない場合は、すべての同形異義語の下位語が含まれるように問合せが拡張されます。

level

指定された語句に対する下位語を戻すために、シソーラス階層内を横断するレベル数を指定します。たとえば、NTのレベル1問合せは、下位語が定義されている場合、指定した問合せ語句のすべての下位語エントリを戻します。レベル2問合せは、指定した問合せ語句の下位語エントリ、さらにそれらの下位語の下位語エントリを戻します。

level引数はオプションで、デフォルト値は(1)です。level引数に0(ゼロ)または負の値を設定すると、元の問合せ語句のみを戻します。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。このデフォルト値を使用する場合は、シソーラス表にDEFAULTという名前のシソーラスが存在している必要があります

ノート:

thesを指定する場合は、levelも指定する必要があります。

NARROWER TERM演算子の例

次の問合せは、catという問合せ語句、またはDEFAULTシソーラスでcatNT語として定義された語句のいずれかが含まれているすべてのドキュメントを戻します。

'NT(cat)'

シソーラス名を指定する場合は、次のようにlevelも指定する必要があります。

'NT(cat, 2, mythes)'

次の問合せは、fairy tale という問合せ語句、またはDEFAULTシソーラスでfairy taleの下位インスタンス語として定義された語句のいずれかが含まれているすべてのドキュメントを戻します。

'NTI(fairy tale)'

cinderellaという語句およびsnow whiteという語句が、fairy taleに対する下位語インスタンスとして定義されている場合、Oracle Textは、fairy tale、cinderellaまたはsnow whiteが含まれているドキュメントを戻します。

ノート

シソーラスの各階層は個別の分離されたブランチを表し、4つのNARROWER TERM演算子に対応します。NARROWER TERM問合せでは、Oracle Textは指定されたNARROWER TERM演算子に対応するブランチを使用してその問合せを拡張するのみです。

関連項目

シソーラスの下位語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.NT」を参照してください。

3.17 NDATA

同じようなスペルの一致を検索する場合または指定された句の語句の再配置が役立つ場合に、NDATA演算子を使用します。ドキュメント・セットの名前データにスペルミス(不正確な順序付け)が頻出する場合に、より正確な結果を検出する上で有用です。定義されたNDATAセクションにのみ、この演算子を使用できます。NDATA構文を使用すると、結果セットのランク付けができます。このランク付けによって、表記の類似度が高いワードを含むドキュメントには、類似度の低いワードを含むドキュメントより高いスコアが割り当てられます。

正規化

レクサーは、NDATA問合せ句を処理しません。ただし、ユーザーは、NDATAセクションを含む特定のセクション・グループの基本文字属性および代替スペル属性を設定できます。問合せが正規化され、文字以外のデータ(空白を除く)が削除されます(数値や句読点など)。

構文

ndata(sectionname, phrase [,order][,proximity][,threshold])
パラメータ名 デフォルト値 パラメータの説明

sectionname

問合せに使用する定義されたNDATAセクションの名前(section_name)を指定します。

phrase

名前データ問合せの句を指定します。

phraseパラメータは、1つのワード、句またはフリー・テキスト・フォーマットのワード文字列です。

戻されたスコアは関連性スコアです。

Oracle Textでは、phraseに組み込まれた問合せ演算子は無視されます。

句の文字長には少なくとも2文字を指定し、4000文字を超えないようにしてください。

order

NOORDER

問合せの個々のトークン(語句)が順序どおりまたは任意の順序で一致するかどうかを指定します。orderパラメータは、候補ドキュメントと一致する1次フィルタを提供します。

ORDERまたはO: 問合せ語句が順序どおりに一致します。

NOORDER o N [デフォルト]: 問合せ語句が任意の順序で一致します。

proximity

NOPROXIMITY

語句の出現位置の近さが一致候補の類似度スコアに影響するかどうかを指定します。つまり、proximityパラメータが有効な場合、一致語句の間の一致しない追加語句が一致候補の類似度スコアを低くします。

PROXIMITYまたはP: 一致候補の問合せ語句の出現位置の近さにより影響を受ける類似度スコア。

NOPROXIMITYまたはN [デフォルト]: 類似度スコアは、一致候補の問合せ語句の出現位置の近さによって影響を受けません。

threshold

20

Oracle Database 12c リリース2 (12.2)以降では、しきい値をNDATA演算子の部分として指定できます。グラムが一致する割合のしきい値を指定します。グラムが一致する割合が低いセクションの値は無視されます。しきい値が20の場合、一致するグラムが20%以下のセクションは無視されます。この値を低くすると、無視されるセクションが減るため、再コールが高度になります。このしきい値は、値を低くすると再コールの正確さが向上します。次に例を示します。

NDATA(author, LAST First, x, proximity, 10)

NDATA演算子の例

blackおよびsmithの出現位置の近さによって類似度スコアに影響を与えることなく、任意の順序で問合せ句の語句と一致する索引付けされた姓セクション名のNDATA問合せは、次の形式になります。

SELECT entryid, SCORE(1) FROM people WHERE
CONTAINS(idx_column, 'NDATA(surname, black smith)',1)>0;

blackおよびsmithの出現位置の近さによって類似度スコアが影響を受ける場合に、任意の順序で問合せ句の語句と一致する索引付けされた姓セクション名のNDATA問合せは、次の形式になります。

SELECT entryid, SCORE(1) FROM people WHERE
CONTAINS(idx_column, 'NDATA(surname, black smith,,proximity)',1)>0;

blackおよびsmithの出現位置の近さによって類似度スコアに影響を与えることなく、順序どおりに問合せ句の語句と一致する索引付けされた姓セクション名のNDATA問合せは、次の形式になります。

SELECT entryid, SCORE(1) FROM people WHERE
CONTAINS(idx_column, 'NDATA(surname, black smith, order)',1)>0;

blackおよびsmithの出現位置によって類似度スコアが影響を受ける場合に、順序どおりに問合せ句の語句と一致する索引付けされた姓セクション名のNDATA問合せは、次の形式になります。

SELECT entryid, SCORE(1) FROM people WHERE
CONTAINS(idx_column, 'NDATA(surname, black smith, order, proximity)',1)>0;

ノート

NDATA問合せ演算子は、オフセット情報を提供しません。つまり、WITHINNEAR(;)またはEQUIV(=)の子として使用できません。NDATAセクションはCTX_DOC.HIGHLIGHTCTX_DOC.SNIPPET、およびCTX_DOC.MARKUPによって無視されます。また、NDATA演算子はCTXCAT文法でサポートされていません。ORおよび問合せテンプレートを含む他の演算子とともに使用できます。

NDATA演算子のユースケースには、個人のフル・ネームの適切なスペルおよび予測される生年月日に基づく特定のエントリの検索が含まれます。エントリの生年月日がSDATAセクションとして格納される場合、ユーザー定義のスコア付けの代替スコアリング・テンプレートを使用して、フル・ネームのNDATAセクション・データと生年月日のSDATAセクション・データのスコアを結合できます。

フル・ネームのsection_nameで指定されたセクションに対して、john smithという名前を問い合せます。2012年11月8日に近接するSDATAセクションの生年月日に基づくNDATA演算子のスコアの変更により、次のように一致するドキュメントのランク付けが修正されます。

<query>
   <textquery grammar="CONTEXT" lang="english">
       NDATA(fullname, john smith)
   </textquery>
   <score algorithm="COUNT" normalization_expr = 
       "doc_score-(DATE(8-NOV-2012)-sdata:dob)"/>
</query>

制限事項

NDATA問合せ演算子は、 CTX_DOC Package プロシージャで機能しません。CTX_DOCプロシージャとともにNDATAを使用しようとすると、サポートされていないことを示すエラーが戻ります。

3.18 NEAR(;)

2つ以上の問合せ語句の出現位置の近さを基準にしてスコアを戻すには、NEAR演算子を使用します。Oracle Textにより、ドキュメント内で互いに近接した語句には高いスコアが、互いに離れた語句には低いスコアが戻されます。単語または項目がNEAR問合せで複数回出現する場合、一致するにはその単語がドキュメントで複数回出現する必要があります。

ノート:

NEAR演算子はワード問合せのみで機能します。ABOUT問合せではNEARを使用できません。

構文

NEAR((word1,word2,...,wordn) [, max_span [, order [, maxreqd]]])

下位互換性のための構文は、次のとおりです。

word1;word2
word1-n

問合せ語句をカンマで区切って指定します。問合せ語句は、1つのワードまたは句の場合もあり、他の問合せ演算子を使用する場合もあります(「NEARおよびその他の演算子」を参照)。

max_span

オプションで、クランプの開始ワードと終了ワードを区切るワード数を指定します。デフォルトは100です。100より大きい数を指定すると、Oracle Textからエラーが戻されます。

クランプはすべての問合せ語句が出現する最小のワード・グループです。すべてのクランプは問合せ語句で始まり、問合せ語句で終わります。

2つの問合せ語句を持つNEAR問合せでは、max_spanがこの2つの語句間の最大距離になります。たとえば、ドキュメントに「The cat sat on the dog」が含まれている場合、次の問合せを使用すると、dogから3ワード以内にあるcatを見つけることができます。

'near((dog, cat, 3)'

ドキュメントに「The cat and the rabbit sat on the dog」が含まれている場合、次の問合せを使用すると、6ワード以内にあるcatdogおよびrabbitを見つけることができます。

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

ノート:

検索語句rabbitmax_span計算に含まれます。max_spanに5を指定すると、rabbitは見つかりません。ストップワードも計算の範囲に含まれます。

order

Oracle Textを使用して、指定した順序で語句を検索するには、TRUEを指定します。デフォルトはFALSEです。

たとえば、最大クランプ・サイズを20にして、mondaytuesdayおよびwednesdayの順でワード検索をする場合は、次の問合せを入力します。

'near((monday, tuesday, wednesday), 20, TRUE)'

ノート:

orderを指定するには、常にmax_spanに数を指定する必要があります。

orderフラグ設定が異なる同じ問合せ式を使用すると、Oracle Textから同じドキュメントに対して異なるスコアが戻される場合があります。たとえば、次の問合せを入力すると、Oracle Textから同じドキュメントに対して異なるスコアが戻されます。

'near((dog, cat), 50, FALSE)'
'near((dog, cat), 50, TRUE)'
maxreqd

この新規の引数は、Oracle Database 12c リリース2 (12.2)以降で使用できます。結果に一致する近くの語句の数を指定します。結果に一致する近くの語句の数を指定を指定しない場合、すべての語句が一致する必要があります。例えば、次の問合せは、魚に関する語句のクラスタを含むドキュメントを一致させます。

'near((fish, shark, ocean, scales, fishing), 10, FALSE, 3)'

ここで、3つ問合せ語句のみが、10以内の距離で互いに一致します。

NEARスコアリング

NEAR演算子のスコア付けは、語句の出現頻度および語句の出現位置の近さを組み合せて行われます。問合せに適合する各ドキュメントに対して、ドキュメント内のクランプの数に比例し、そのクランプの平均サイズに反比例する1から100までのスコアがOracle Textにより戻されます。小さなクランプは問合せ語句が近接していることを示すため、ドキュメントに小さなクランプが多く存在するほど高いスコアになります。

問合せ語句の数もスコアに影響を与えます。多くの語句(7個程度)で問い合せると、少ない語句(2個程度)で問い合せたときよりも、通常100のスコアを得るために必要なドキュメントのクランプ数が少なくなります。

クランプはすべての問合せ語句が出現する最小のワード・グループです。すべてのクランプは問合せ語句で始まり、問合せ語句で終わります。この項で説明するとおり、クランプ・サイズはmax_spanパラメータで定義します。

クランプのサイズに問合せ語句そのものは含まれません。そのため、問合せNEAR((DOG, CAT), 1)dog catdog ate catは一致しますが、dog sat on catは一致しません

NEARおよびその他の演算子

ANDORなど他の演算子とともにNEAR演算子を使用できます。スコアは通常の方法で計算されます。

たとえば、語句lionおよびtigerが互いに10ワード以内のところに位置する場合、語句tigerlionおよびcheetahを含むすべてのドキュメントを検索するには、次の問合せを入力します。

'near((lion, tiger), 10) AND cheetah'

戻される各ドキュメントのスコアは、NEAR演算子および語句cheetahのうち低い方のスコアになります。

EQUIVALENCE演算子を使用して、NEAR問合せの1つの問合せ語句を置換することもできます。

'near((stock crash, Japan=Korea), 20)'

この問合せは、Japanまたは Koreaの20ワード以内に語句stock crashを含むすべてのドキュメントを検索します。

次のNEAR構文が有効になります。

SELECT * FROM docs WHERE CONTAINS(txt, 'near((aterm1 aterm2 ... atermI 
OR bterm1 bterm2 ... btermJ
OR cterm1 cterm2 ... ctermK, dterm))') >0

指定されたNEARの子に複数のORが使用される場合があります。NEARの子にORを使用できます。

NEAR内のNEAR機能により、ユーザーはネストされた近接問合せを使用できます。Oracle Database 12c リリース2 (12.2)以降では、句の間の距離として句内の最近語句の距離を計測します。たとえば、ドキュメントに‘Lorem ipsum dolor sit amet’および‘Sed ut perspiciatis unde omnis’という句が含まれる場合、2つの句の距離は、最初の語句、‘Lorem’と‘Sed’の間ではなく、‘amet’と‘Sed’の間を測ります。句の間の距離は、ハウスドルフ測度と呼ばれます。

SELECT * FROM docs 
WHERE CONTAINS(txt, 'near((near((term1, term2),5), term3), 100)')>0

この問い合わせは、term1term2、およびterm3が100トークン・ウィンドウ内に位置し、term1およびterm2トークンが5トークン・ウィンドウ内に位置するドキュメントを戻します。

セミコロンおよびNEAR構文の混在はサポートされていません。エラーがスローされます。つまり、"near((a;b,c),3)" or "near((a,b));c"問合せは使用できません。

次の演算子もNEARおよび;とともに使用できます。

  • EQUIV

  • ワード、句またはEQUIVを生成する拡張演算子すべて。次のものが含まれます。

    • SOUNDEX

    • FUZZY

    • ワイルドカード

    • STEM

下位互換性のあるNEAR構文

以前のOracle Textリリースの構文を使用してNEAR問合せを記述できます。ただし、NEAR問合せをネストする場合は、セミコロン演算子を内部のNEARとして使用することはできません。したがって、'near(((a;d),f),3)'という問合せは構文エラーになります。ネストしたNEAR問合せでセミコロン演算子を使用できるのは、最も外側のNEARです。

たとえば、liontigerの近くに出現するすべてのドキュメントを検索するには、次のように記述します。

'lion near tiger'

または、セミコロンを使用して次のようにも記述できます。

'lion;tiger'

この問合せは次の問合せと同等です。

'near((lion, tiger), 100, FALSE)'

ノート:

NEAR演算子の構文のみが下位互換性を持ちます。この例では、戻されるスコアはこの項で説明したクランプ方法を使用して計算されます。

NEAR演算子でのハイライト表示

ハイライト表示を使用し、問合せにnear演算子が含まれている場合は、出現位置の近さの要件を満たすすべての語句がハイライト表示されます。ハイライト表示される語句は、1つのワードまたは句の場合もあります。

たとえば、次のようなテキストを含むドキュメントがあるとします。

Chocolate and vanilla are my favorite ice cream flavors.  I like chocolate served
in a waffle cone, and vanilla served in a cup with caramel syrup.

問合せがnear((chocolate, vanilla)), 100, FALSE)である場合、次の語句がハイライト表示されます。

<<Chocolate>> and <<vanilla>> are my favorite ice cream flavors.  I like
<<chocolate>> served in a waffle cone, and <<vanilla>> served in a cup with
caramel syrup.

ただし、問合せがnear((chocolate, vanilla)), 4, FALSE)である場合、次の語句のみがハイライト表示されます。

<<Chocolate>> and <<vanilla>> are my favorite ice cream flavors.  I like
chocolate served in a waffle cone, and vanilla served in a cup with caramel syrup.

関連項目:

ハイライト表示用プロシージャの詳細は、「CTX_DOCパッケージ」を参照してください。

セクション検索およびNEAR

セクションの検索には、次のように、WITHIN演算子とNEAR演算子を併用します。

'near((dog, cat), 10) WITHIN Headings'

このような式を評価する場合は、Oracle Textにより、指定されたセクション内全体にあるクランプが検索されます。

この例では、セクションHeadings内全体にあるdogおよびcatを含むクランプのみがカウントされます。つまり、語句dogHeadings内にあり、語句catdogから5ワードのところにあるがHeadingsの外にある場合、これら2つのワードは式を満たさず、カウントされません。

3.19 NEAR2

NEAR2演算子を使用して、位置ベースのスコアリングおよび長さの正規化を実行すると、関係性が向上します。

NEAR2演算子は、特定の問合せに基づいてドキュメントをセグメントに分割します。次に、各セグメントをプライマリ機能に基づいて分類し、2次機能に基づいてスコア付けします。使用されるプライマリ機能は、次のとおりです。

  • 句のヒット

  • 部分句のヒット

  • 順序付けされたNEARのヒット

  • 順序付けされていないNEARのヒット

  • ANDのヒット

2次機能は次のとおりです。

  • 超過範囲

  • 開始位置

  • 最長部分句

構文

NEAR2((word1, word2,...,wordn),max_span, phrase_weight, partial_phrase_weight, ordered_near_weight, unordered_near_weight, and_weight)

重みのすべてまたは1つを指定する必要があります。重みを指定すると、NEAR2演算子が加重平均モードで動作します。重みは0から10の間の整数です。

word1-n

問合せ語句をカンマで区切って指定します。問合せ語句は、1つのワードまたは句の場合もあり、他の問合せ演算子を使用する場合もあります(「NEARおよびその他の演算子」を参照)。ワードリストのみ必須です。

max_span

オプションで、最大クランプのサイズを指定します。デフォルトは50です。50より大きい数を指定すると、Oracle Textからエラーが戻されます。

クランプはすべての問合せ語句が出現する最小のワード・グループです。すべてのクランプは問合せ語句で始まり、問合せ語句で終わります。

2つの問合せ語句を持つNEAR問合せでは、max_spanがこの2つの語句間の最大距離になります。たとえば、dogcatの6ワード以内にある場合、dogおよびcatについて問い合せるには、次の問合せを入力します。

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

加重平均モードで使用する句のプライマリ機能の重みを指定します。これは質的な重みで、内部的重みにマップされます。

partial_phrase_weight

加重平均モードで使用する部分句のプライマリ機能の重みを指定します。これは質的重みです。

ordered_near_weight

加重平均モードで使用する順序付されたNEARのプライマリ機能の重みを指定します。これは質的重みです。

unordered_near_weight

加重平均モードで使用する順序付されていないNEARのプライマリ機能の重みを指定します。これは質的重みです。

and_weight

加重平均モードで使用するANDのプライマリ機能の重みを指定します。これは質的重みです。

3.20 NOT(~)

1つの問合せ語句が含まれているが、もう1つの問合せ語句が含まれていないドキュメントを検索するには、NOT演算子(~)を使用します。

構文

構文 説明

term1~term2

term1 not term2

term1が含まれるが、term2が含まれていないドキュメントを戻します。

NOT演算子の例

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

'animals ~ dogs'

同様に、transportationという語句が含まれていて、automobilesまたはtrainsという語句は含まれていないドキュメントを取得するには、次の式を使用します。

'transportation not (automobiles or trains)'

ノート:

NOT演算子は、他の論理演算子が作成したスコアには影響を与えません。

関連項目

「MINUS (-)」

3.21 OR(|)

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

構文

構文 説明

term1|term2

term1 or term2

term1またはterm2を含むドキュメントを戻します。そのオペランドの最大スコアを戻します。少なくともどちらか1つの問合せ語句が存在する必要があり、スコアの高い方が選択されます。

OR演算子の例

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

'cats | dogs'
'cats OR dogs'

スコアリング

OR問合せでは、問合せ語句の最も高いスコアが戻ります。この例では、ドキュメント内でのcatsおよびdogsのスコアが、それぞれ30および40の場合、ドキュメントのスコアは40になります。

関連項目

「AND (&)」

3.22 PREFERRED TERM(PT)

問合せ内の問合せ語句を、その問合せ語句の優先語としてシソーラスで定義された語句に置換するには、PREFERRED TERM演算子(PT)を使用します。

構文

構文 説明

PT(term[,thes])

問合せで指定されたワードをtermに対する優先語で置換します。

term

PREFERRED TERM演算子にオペランドを指定します。termは、指定されたシソーラスで優先語として定義されている語句に置換されます。ただし、termに対してPTエントリが定義されていない場合は、問合せ式でtermは置換されず、termが拡張の結果となります。

拡張演算子はterm引数に指定できません。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。したがって、シソーラス演算子を使用するには、DEFAULTという名前のシソーラスがシソーラス表に存在している必要があります

PT演算子の例

automobileはシソーラスにcarという優先語があるとします。automobilePT問合せを行うと、carというワードが含まれているすべてのドキュメントが戻ります。automobileというワードが含まれているドキュメントは戻りません。

関連項目

シソーラスの優先語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.PT」を参照してください。

3.23 RELATED TERM(RT)

問合せ語句の関連語としてシソーラスに定義されたすべての語句が含まれるように問合せを拡張するには、RELATED TERM演算子(RT)を使用します。

構文

構文 説明

RT(term[,thes])

シソーラスでtermに対する関連語として定義されたすべての語句が含まれるように、問合せを拡張します。

term

RELATED TERM演算子にオペランドを指定します。term、およびthestermに対して定義されたすべての関連エントリが含まれるように、termが拡張されます。

拡張演算子はterm引数に指定できません。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。したがって、シソーラス演算子を使用するには、DEFAULTという名前のシソーラスがシソーラス表に存在している必要があります

RT演算子の例

dogという語句には、wolfという関連語があるとします。dogに対してRT問合せを行うと、dogおよびwolfというワードを含むすべてのドキュメントが戻ります。

関連項目

シソーラスの関連語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.RT」を参照してください。

3.24 SDATA

構造化データの値が含まれるSDATAセクションと列でテストを実行するには、SDATA演算子を使用します。SDATAセクションは、複合問合せおよび順序付けを高速化します。この演算子は、CONTAINSに対して構造化述語をサポートします。このサポートによって、SQL以外のインタフェース(count_hitsや結果セット・インタフェースなど)が拡張されます。

SDATA演算子は、SDATA以外の子もあるAND演算子の子としてのみ使用する必要があります。

SDATA問合せは、文字列や数値のリテラル、および日付文字列に対して実行します。文字列リテラルおよび日付文字列は、一重引用符または二重引用符で囲みます。数値は引用符で囲まず、SQL書式のNUMBERに準拠する必要があります。次に例を示します。

CONTAINS(text, "dog and SDATA(category = ''news'')")>0 ...

SDATA(rating between 1.2 and 3.4) ...

SDATA(author LIKE 'FFORDE%') ...

SDATA(date >='2005-09-18') ...

閉じカッコは、一重引用符または二重引用符で囲まれている場合にかぎり許可されます。

SDATA演算子は、問合せテンプレートで使用できます。

構文

構文 演算子

SData

:= "SDATA" "(" SDataPredicate ")"

SDataPredicate

:= section_name SDataTest

SDataTest

:= <SDataSingleOp SDataLiteral> | SDataBetweenOp | <"is" ("not")? "null">

SDataSingleOp

:= ("<" | "<=" | "=" | ">=" | ">" | "!=" | "<>" | "like") SDataLiteral

SDataBetweenOp

:= "between" SDataLiteral "and" SDataLiteral

SDataLiteral

:= numeric_literal | "'" string_literal "'" | "'" date_string "'"

section_name

検索してテストを実行したり、チェックする対象のSDATAセクションの名前。

SDataLiteral

SDATAセクションの値。この値は、文字列リテラル、数値リテラルまたは日付文字列のいずれかである必要があります。

囲まれた述語がTRUEを戻す場合、SDATA演算子はスコア100を戻します。それ以外の場合は0を戻します。NULL値の場合、SDATA演算子はスコア0を戻します。これは、SQLではTRUEを戻さないためです。

複数値のセマンティクスは、複数値のSDATAセクションがサポートされていないため定義されていません。

文字列の比較では大/小文字が区別されます。常にBINARY照合が使用されます。

ノート:

DATE FILTER BY列にマップされているSDATAセクションに対するSDATA演算子の場合、SDATAの値は日付書式のYYYY-MM-DDまたはYYYY-MM-DD HH24:MI:SSに準拠している必要があります。準拠していない場合は、必要な行が戻されません。時間のコンポーネントを省略した場合は、SQLセマンティクスに従って00:00:00にデフォルト設定されます。この日付書式は、NLS_DATE_FORMAT環境変数の設定に関係なく常に使用されます。

SDATA演算子の例

たとえば、summerというワードが含まれたフィクション・カテゴリの本を問い合せるとします。CATEGORYという名前のSDATAセクションが宣言されているとの想定で、次のような問合せを実行できます。

SELECT id FROM idx_docs
  WHERE CONTAINS(text, 'summer AND SDATA(category = "fiction")')>0

制限事項

  • セクション名が定義されたSDATAセクションでない場合は、エラーが発生します。セクションのソース(タグか列かなど)は重要ではありません。

  • この構文では、RHS SDATAおよび式は使用できません。

  • SDATA演算子は、WITHININPATHHASPATHまたはNEARの子にできません。

  • 名前が指定されたSDATAセクションのデータ型は、提供されているリテラル(およびLIKEなどの演算子)との互換性が必要です。互換性がない場合は、エラーが発生します。

  • SDATA演算子は、CTXRULEの問合せドキュメントではサポートされていません。

  • SDATA演算子は、ハイライト表示に影響を与えません。

ノート

SDATA演算子は、SDATA以外の子もあるAND演算子の子としてのみ使用することをお薦めします。基本的には、SDATA演算子は2番目の基準(つまり確認や非駆動型)として使用します。たとえば、「評価が> 4のドキュメントの検索」ではなく、「DOGという語句が含まれており、価格が> 5でもあるドキュメントの検索」に使用します。他の使用方法でも正しく処理できますが、適切なパフォーマンスを得ることができない場合があります。

次の例は、推奨する使用方法と同じです。

dog & SDATA(foo = 5)

このSDATAは、SDATA以外の子もあるAND演算子の子です。

dog & (SDATA(foo = 5) | SDATA(x = 1))

このSDATA演算子はORの子ですが、SDATA以外の子を持つAND演算子の子でもあります。

次に、推奨しない使用例を示します。

SDATA(foo = 5)

このSDATAは唯一の基準であるため、駆動型基準です。

dog | SDATA(bar = 9)

この例のSDATAANDではなく、OR演算子の子です。

SDATA(foo = 5) & SDATA(bar = 7)

この例では、両方のSDATA演算子がANDの子ですが、このAND演算子にはSDATA以外の子がありません。

関連項目

ADD_SDATA_COLUMN

ADD_SDATA_SECTION

UPDATE_SDATA

「Oracle Textビュー」「CTX_SECTIONS」

関連項目:

3.25 SOUNDEX(!)

発音が類似したワード(他のワードと似た発音のワード)が含まれるように問合せを拡張するには、SOUNDEX(!)演算子を使用します。この演算子を使用すると、スペルは異なっても英語では同じ発音であるワードを比較できます。

構文

構文 説明

!term

発音が同じすべての語句が、指定した問合せ語句に含まれるように問合せを拡張します(英語のテキストのみ)。

SOUNDEX(!)演算子

SELECT ID, COMMENT FROM EMP_RESUME
WHERE CONTAINS (COMMENT, '!SMYTHE') > 0 ;

ID COMMENT 
-- ------------
23 Smith is a hard worker who..

言語

SOUNDEXは、7ビットのキャラクタ・セットを使用する英語などの言語に最適です。8ビットのキャラクタ・セットを使用する多くの西ヨーロッパの言語でも、多少効果は落ちますが使用できます。

テキスト列に基本文字変換が指定され、問合せ式にSOUNDEX演算子が指定されている場合は、Oracle Textによって問合せの基本文字書式が処理されます。

3.26 STEM($)

問合せ語句と同じ語根を持つ語を検索するには、STEM($)演算子を使用します。

BASIC_LEXERを使用して使用言語を索引付けする場合は、index_stems属性を使用してステミングのパフォーマンスを改善できます。

Oracle Textのステマーは、Xerox社のXSoft Divisionからライセンスを受けています。この機能は、BASIC_LEXERで英語、フランス語、スペイン語、イタリア語、ドイツ語およびオランダ語をサポートしています。

日本語のステミングはJAPANESE_LEXERでサポートされています。

ステミング言語は、BASIC_WORDLISTワードリスト・プリファレンスを使用して指定します。

構文

構文 説明

$term

同じ語幹または語根を持つすべての語句が、指定した問合せ語句に含まれるように問合せを拡張します。

Stem($)演算子の例

入力 拡張結果

$scream

scream screaming screamed

$distinguish

distinguish distinguished distinguishes

$guitars

guitars guitar

$commit

commit committed

$cat

cat cats

$sing

sang sung sing

ストップワードによる動作

STEMがストップワードとして指定したワードを戻す場合、そのストップワードは問合せの中には含まれず、CTX_QUERY.HIGHLIGHTまたはCTX_QUERY.MARKUPでハイライト表示もされません。

関連項目

STEM演算子をBASIC_LEXERで使用可能にする方法の詳細は、「Oracle Text索引付けの要素」「BASIC_LEXER」を参照してください。

3.27 ストアド・クエリー式(SQE)

CTX_QUERY.STORE_SQEプロシージャで作成されたストアド・クエリー式をコールするには、SQE演算子を使用します。

ストアド・クエリー式は、ドキュメントの編成および分類用の事前定義済のBINを作成する場合、または最初の問合せが1つ以上の追加問合せによって詳細化されている反復問合せを実行する場合に使用できます。

構文

構文 説明

SQE(SQE_name)

ストアド・クエリー式SQE_nameの結果を戻します。

SQE演算子の例

disastersという名前のSQEを作成するには、CTX_QUERY.STORE_SQEを次のように使用します。

begin
ctx_query.store_sqe('disasters', 'hurricane or earthquake or blizzard');
end;

このストアド・クエリー式は、hurricaneearthquakeまたはblizzardのいずれかを含むすべてのドキュメントを戻します。

これで、SQEは次のような問合せ式内でコールできます。

SELECT SCORE(1), docid FROM news
WHERE CONTAINS(resume, 'sqe(disasters)', 1)> 0 
ORDER BY SCORE(1);

制限事項

単一のテキスト問合せでは、ストアド・クエリー式(SQE)を100まで格納できます。テキスト問合せに100を超えるSQE(ネストされたSQEを含む)がある場合、その問合せは失敗し、エラーDRG-50949が発生します。

関連項目

「STORE_SQE」

3.28 SYNONYM(SYN)

指定した語句のシノニムとしてシソーラスに定義されているすべての語句が含まれるように問合せを拡張するには、SYNONYM演算子(SYN)を使用します。

構文

構文 説明

SYN(term[,thes])

シソーラスでtermに対するシノニムとして定義されたすべての語句が含まれるように、問合せを拡張します。

term

SYNONYM演算子にオペランドを指定します。term、およびthestermに対して定義されたすべてのシノニムが含まれるように、termが拡張されます。

拡張演算子はterm引数に指定できません。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。このデフォルト値を使用する場合は、シソーラス表にDEFAULTという名前のシソーラスが存在している必要があります。

SYN演算子の例

次の問合せ式は、dogという問合せ語句、またはDEFAULTシソーラスでdogのシノニムとして定義された語句が含まれているすべてのドキュメントを戻します。

'SYN(dog)'

SYNONYM演算子内のコンパウンド句

シノニム問合せで問合せ語句のコンパウンド句の拡張問合せは、AND接続詞によって戻ります。

たとえば、temperature + measurement + instrumentsというコンパウンド句は、thermometerという問合せ語句のシノニムとしてシソーラスに定義されています。thermometerのシノニム問合せは次のように拡張されます。

{thermometer} OR ({temperature}&{measurement}&{instruments})

関連項目

シソーラスのシノニム語句のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.SYN」を参照してください。

3.29 threshold(>)

THRESHOLD演算子(>)は、次の2通りの方法で使用します。

  • 式レベル

  • 問合せ語句レベル

式レベルのTHRESHOLD演算子は、しきい値の数値を下回るスコアのドキュメントを結果セットから排除します。

問合せ語句レベルのTHRESHOLD値演算子は、ある語句がドキュメント内でどのようにスコアを出すかに基づいてドキュメントを選択します。

構文

構文 説明

expression>n

term>n

結果セットでスコアがしきい値nを超えるドキュメントのみを戻します。

式内で、スコアが最低nの問合せ語句が含まれているドキュメントを戻します。

THRESHOLD(>)演算子の例

式レベルで、relational databasesが含まれているドキュメントを検索し、スコアが75よりも大きいドキュメントのみを戻すには、次の式を使用します。

'relational databases > 75'

問合せ語句レベルで、lionのスコアが30以上で、さらにtigerが含まれているドキュメントを選択するには、次の式を使用します。

'(lion > 30) and tiger'

3.30 TRANSLATION TERM(TR)

定義されたすべての外国語の等価語句が含まれるように問合せを拡張するには、TRANSLATION TERM(TR)演算子を使用します。

構文

構文 説明

TR(term[, lang, [thes]])

termに対して定義されたすべての外国語の等価語が含まれるように、termを拡張します。

term

TRANSLATION TERM演算子にオペランドを指定します。termは、thestermに対して定義されたすべての外国語エントリが含まれるように拡張されます。拡張演算子はterm引数に指定できません。

lang

オプションで、拡張によってどの外国語の等価語を戻すかを指定します。指定する言語はthesに定義されている言語と一致している必要があります。(1回に指定できる言語は1つのみです。)このパラメータを省略、またはALLを指定すると、定義されたすべての外国語の語句を使用するように拡張されます。

thes

オプションで、指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数のデフォルト値はDEFAULTです。。したがって、シソーラス演算子を使用するには、DEFAULTという名前のシソーラスがシソーラス表に存在している必要があります

ノート:

thesを指定する場合は、langも指定する必要があります。

TR演算子の例

catに対して次のエントリを持つシソーラスMY_THESがあるとします。

cat 
  SPANISH: gato 
  FRENCH:  chat 

catおよびcatのスペイン語訳を含むすべてのドキュメントを検索するには、次の問合せを入力します。

'tr(cat, spanish, my_thes)'

この問合せは次のように拡張されます。

'{cat}|{gato}'

関連項目

シソーラスの関連語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.TR」を参照してください。

3.31 TRANSLATION TERM SYNONYM(TRSYN)

問合せ語句に対して定義されたすべての外国語の等価語、問合せ語句のシノニム、およびそのシノニムの外国語の等価語が含まれるように問合せを拡張するには、TRANSLATION TERM SYNONYM(TRSYN)演算子を使用します。

構文

構文 説明

TRSYN(term[, lang, [thes]])

termの外国語の等価語、termのシノニム、およびそのシノニムの外国語の等価語が含まれるように、termを拡張します。

term

この演算子にオペランドを指定します。termは、thestermに対して定義されたすべての外国語エントリおよびシノニムが含まれるように拡張されます。拡張演算子はterm引数に指定できません。

lang

オプションで、拡張によってどの外国語の等価語を戻すかを指定します。指定する言語はthesに定義されている言語と一致している必要があります。このパラメータを省略すると、定義されたすべての外国語の語句を使用するように拡張されます。

thes

オプションで、指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数のデフォルト値はDEFAULTです。。したがって、シソーラス演算子を使用するには、DEFAULTという名前のシソーラスがシソーラス表に存在している必要があります

ノート:

thesを指定する場合は、langも指定する必要があります。

TRSYN演算子の例

catに対して次のエントリを持つシソーラスMY_THESがあるとします。

cat 
  SPANISH: gato 
  FRENCH:  chat 
  SYN lion 
    SPANISH: leon 

catcatのスペイン語での等価語、catのシノニム、およびlionのスペイン語での等価語を含むすべてのドキュメントを検索するには、次の問合せを入力します。

'trsyn(cat, spanish, my_thes)'

この問合せは次のように拡張されます。

'{cat}|{gato}|{lion}|{leon}'

関連項目

シソーラスの訳語およびシノニム語句のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.TRSYN」を参照してください。

3.32 TOP TERM(TT)

問合せ語句を、シソーラスの標準階層内(上位語[BT]、下位語[NT])でその問合せ語句について定義されている最上位語と置換するには、問合せ内でTOP TERM演算子(TT)を使用します。最上位語は、問合せ語句に関連する、概念的に最上位の語句です。たとえば、シソーラスでは次のように階層が定義されます。

DOG 
   BT1 CANINE 
     BT2 MAMMAL 
       BT3 VERTEBRATE 
         BT4 ANIMAL

このシソーラスにおけるdogの最上位語はanimalです。

汎用階層(BTGNTG)、部分階層(BTPNTP)およびインスタンス(BTINTI)階層内の最上位語は戻されません。

構文

構文 説明

TT(term[,thes])

問合せで指定されたワードを、termに対する標準的な階層(BTNT)での最上位語で置換します。

term

TOP TERM演算子にオペランドを指定します。termは、指定されたシソーラスで最上位語として定義されているtermに置換されます。ただし、termに対してTTエントリが定義されていない場合は、問合せ式でtermは置換されず、termが拡張の結果となります。

拡張演算子はterm引数に指定できません。

thes

指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULTです。このデフォルト値を使用する場合は、シソーラス表にDEFAULTという名前のシソーラスが存在している必要があります。

TT演算子の例

dogという問合せ語句には、シソーラスの標準階層内にanimalという最上位語があるとします。dogTT問合せは、animalという句が含まれているすべてのドキュメントを戻します。dogというワードが含まれているドキュメントは戻しません。

関連項目

シソーラスの最上位語のブラウズについては、「CTX_THES.TT 」を参照してください。

3.33 WEIGHT(*)

WEIGHT演算子は、指定した係数をスコアに掛けます。スコアが100を超える場合、最高値は100になります。たとえば、問合せcat, dog*2は、catのスコアとdogのスコアの2倍を合計します。スコアが100を超える場合、最高値は100になります。

複数の問合せ語句が含まれている式では、WEIGHT演算子を使用して問合せ語句の相対的なスコアを調整します。1より小さい数とWEIGHT演算子を使用して、問合せ語句のスコアを減らします。1より大きく10より小さい数とWEIGHT演算子を使用して、問合せ語句のスコアを増やします。

WEIGHT演算子は、式に複数の問合せ語句があるACCUMulate(_)問合せ、AND(&)問合せまたはOR(|)問合せで便利です。個々の語句に重みを付けないと、出現回数の最も多い問合せ語句をスコアから判断できません。語句の重み付けにより、語句のスコアを個別に変更でき、関心度の高い語句がドキュメント全体のランク付けに高く反映されるようにできます。

構文

構文 説明

term*n

termが含まれているドキュメントを戻します。termのロー・スコアにnを掛けてスコアを計算します。nは、0.1から10の数値です。

WEIGHT(*)演算子の例

スポーツ記事の収集がある場合を考えます。ブラジルのサッカー(Brazilian soccer)の記事に関心があるとします。soccer or Brazilで通常の問合せをすると、USサッカーに関する多くの記事が高いランクで戻ります。ブラジルのサッカーについての記事のランクを上げるには、次の問合せを入力します。

'soccer or Brazil*3'

表3-3は、WEIGHT演算子によって、サッカーの情報が含まれている3つの架空のドキュメントA、BおよびCのランクが変更できる様子を示しています。表の列は、3つのドキュメントでの異なる4つの問合せ式の合計スコアを示します。

表3-3 スコア・サンプル

ドキュメント soccer Brazil soccer or Brazil soccer or Brazil*3

A

20

10

20

30

B

10

30

30

90

C

50

20

50

60

問合せsoccer or Brazilを含む3列目のスコアが、最も高いスコア付けを行う語句のスコアです。問合せsoccer or Brazil*3を含む4列目のスコアは、1列目のsoccerのスコア、およびBrazilのスコアの3倍(Brazil*3)のスコアのうち、大きい方のスコアです。

最初の問合せsoccer or Brazilでは、ドキュメントはC、B、Aの順にランク付けされます。問合せsoccer or Brazil*3では、ドキュメントはB、C、Aという優先順にランク付けされます。

複数の語句に重み付けすることもできます。Brazil OR (soccer AND Brazil)*3の問合せでは、soccerおよびBrazilが両方とも含まれるドキュメントの相対的なスコアが高くなります。

3.34 ワイルド・カード(% _)

問合せ式でワイルド・カード文字を使用すると、ワード検索をパターン検索に拡張できます。「DOG %」、「.%」、「%」などのワイルド・カードを単独で使用すると、ストップワードとして扱われます。

ワイルドカード文字は次のとおりです。

ワイルド・カード文字 説明

%

ワールド・カードとしてのパーセント記号は、検索語句の任意の位置で何回でも使用できます。検索語句は拡張され、語句の同等化リストになります。リストは、パーセント文字の位置に文字が0以上存在する、ワイルド・カード語句に一致する索引内のすべての語句から構成されます。

_

ワイルド・カードとしてのアンダースコアは、その位置に任意の1文字が現れることを示します。

エスケープされないワイルド・カード文字が含まれる、1つの問合せ内のすべてのワードのワイルド・カード拡張の合計数は、BASIC_WORDLIST属性のWILDCARD_MAXTERMSで指定された拡張の最大数を超えないようにしてください。詳細は、「BASIC_WORDLIST」を参照してください。

ノート:

  • ワイルドカードを単独で使用すると、ストップワードとして扱われます。

  • ワイルド・カード式によってストップワードに変換された場合、そのストップワードは問合せの中には含まれず、CTX_DOC.HIGHLIGHT またはCTX_DOC.MARKUP でハイライト表示もされません。

右側切捨て問合せ

右側切捨てでは、検索文字列の右側にワイルド・カードが置かれます。

たとえば、次の問合せ式では、パターンscalで始まるすべての語句を検索します。

'scal%'

左側切捨て問合せおよび左右切捨て問合せ

左側切捨てでは、検索文字列の左側にワイルド・カードが置かれます。

kingwingsingなどのワードを検索するには、次のように問合せを記述します。

'_ing'

ingで終わるすべてのワードについては、次の問合せを入力します。

'%ing'

左側切捨て検索および右側切捨て検索を組み合せて、左右切捨て検索を作成します。次の問合せでは、サブストリング%benz%を含むワードのあるすべてのドキュメントを検索します。

'%benz%'

ワイルド・カード問合せのパフォーマンス改善

ワイルド・カード問合せのパフォーマンスは、サブストリングまたはプリフィックス索引を追加して改善します。

ワイルド・カード問合せが左側切捨ておよび左右切捨ての場合、サブストリング索引を作成すると、問合せパフォーマンスが向上します。サブストリング索引によって、%ed_ing%benz%などの、あらゆる種類の左側切捨てワイルド・カード検索の問合せパフォーマンスが向上します。

ワイルド・カード問合せが右側切捨ての場合は、プリフィックス索引を作成すると、パフォーマンスが向上します。プリフィックス索引によって、to%などのワイルド・カード検索の問合せパフォーマンスが向上します。

関連項目:

サブストリングおよびプリフィックス索引の作成の詳細は、「Oracle Text索引付けの要素」「BASIC_WORDLIST」を参照してください。

3.35 WITHIN

問合せをドキュメントのセクションに絞り込むには、WITHIN演算子を使用します。ドキュメントのセクションは次のいずれかです。

  • ゾーン・セクション

  • フィールド・セクション

  • 属性セクション

  • 特殊セクション(文または段落)

構文

構文 説明

expression WITHIN section

事前定義済のゾーン、フィールドまたは属性section内でexpressionを検索します。

セクションがゾーンの場合、expressionは、セクションがゾーンまたは特殊セクションであるWITHIN演算子(ネストされたWITHIN)を1つ以上含むことができます。

セクションがフィールドまたは属性セクションの場合、式は他のWITHIN演算子を含むことができません。

expression WITHIN SENTENCE

文中にexpressionを含むドキュメントを検索します。expressionにはANDまたはNOT問合せを指定します。

expressionは、セクションがゾーンまたは特殊セクションであるWITHIN演算子(ネストされたWITHIN)を1つ以上含むことができます。

expression WITHIN PARAGRAPH

段落中にexpressionを含むドキュメントを検索します。expressionにはANDまたはNOT問合せを指定します。

expressionは、セクションがゾーンまたは特殊セクションであるWITHIN演算子(ネストされたWITHIN)を1つ以上含むことができます。

WITHINの制限事項

WITHIN演算子には、次の制限事項があります。

  • WITHIN句を句に埋め込むことはできません。たとえば、term1 WITHIN section term2と記述することはできません。

  • WITHINは予約語であるため、このワードを検索するには中カッコでワードを囲んでエスケープする必要があります。

WITHIN演算子の例

ゾーン・セクション内の問合せ

セクションHeadings内でSan Franciscoという語句が含まれているすべてのドキュメントを検索するには、次のような問合せを記述します。

'San Francisco WITHIN Headings'

セクションHeadings内にsailingおよびSan Franciscoという語句が含まれているすべてのドキュメントを検索するには、次の2つの方法のいずれかで問合せを記述します。

'(San Francisco WITHIN Headings) and sailing'

'sailing and San Francisco WITHIN Headings'

WITHINと複合式

同じセクションHeadings内にdogおよびcatという語句が含まれているすべてのドキュメントを検索するには、次の問合せを記述します。

'(dog and cat) WITHIN Headings'

この問合せと次の問合せは、論理的に異なります。

'dog WITHIN Headings and cat WITHIN Headings'

この問合せは、dogおよびcatという語句がHeadingsセクションにある場合に、dogおよびcatを含むすべてのドキュメントを、これらの語句が同じHeadingsセクションに出現しているか異なるセクションに出現しているかに関係なく、検索します。

WITHINとNEAR

Headingsセクション内で、dogcatの近くにあるすべてのドキュメントを検索するには、次の問合せを記述します。

'dog near cat WITHIN Headings'

ノート:

NEAR演算子はWITHIN演算子よりも優先順位が高いため、この例では中カッコは必要ありません。この問合せは、(dog near cat) WITHIN Headingsと同等です。

ネストされたWITHIN問合せ

WITHIN演算子をネストすると、ゾーン・セクション内のゾーン・セクションを検索できます。

たとえば、あるドキュメント・セットのゾーン・セクションBOOK内に、ゾーン・セクションAUTHORがネストされているとします。ネストされたWITHIN問合せを次のように記述すると、BOOKセクションのAUTHORセクションに出現するscottをすべて検索できます。

'(scott WITHIN AUTHOR) WITHIN BOOK'

フィールド・セクション内の問合せ

フィールド・セクション内の問合せの構文は、ゾーン・セクション内の問合せと同じです。前述の「ゾーン・セクション内の問合せ」で示したほとんどの例の構文は、フィールド・セクションに適用されます。

ただし、フィールド・セクションの動作は、次の点でゾーン・セクションとは異なります。

  • 可視性: フィールド・セクション内のテキストを非表示にします。

  • 反復性: WITHIN問合せは、繰り返されたフィールド・セクションを識別できません。

  • ネスト性: ネストされたWITHIN問合せは、フィールド・セクションで入力できません。

次に、これらの違いについて説明します。

フィールド・セクションのvisibleフラグ

フィールド・セクションが、CTX_DDL.ADD_FIELD_SECTIONFALSEに設定されたvisibleフラグで作成されている場合、そのフィールド・セクション内のテキストは、WITHIN演算子を使用してのみ問合せできます。

たとえば、TITLEフィールド・セクションのvisibleフラグがFALSEに設定されているとします。この場合、WITHIN演算子のないdogの問合せでは、次の内容を含むドキュメントを検索しません

<TITLE>The dog</TITLE> I like my pet.

このようなドキュメントを検索するには、次のようにWITHIN演算子を使用します。

'dog WITHIN TITLE'

また、TITLECTX_DDL.ADD_FIELD_SECTIONでフィールド・セクションとして定義するときは、visibleフラグをTRUEに設定します。

関連項目:

フィールド・セクション作成の詳細は、「CTX_DDLパッケージ」「ADD_FIELD_SECTION」を参照してください。

繰返しフィールド・セクション

WITHIN問合せは、ドキュメント内の繰り返されたフィールド・セクションを識別できません。たとえば、繰返しセクション<author>を持つドキュメントがあるとします。

<author> Charles Dickens </author>
<author> Martin Luther King </author>

<author>がフィールド・セクションとして定義されているとすると、(charles and martin) within authorのような問合せは、これらのワードが別々のタグに出現しても、そのドキュメントを戻します。

WITHIN問合せに繰返しセクションを識別させるには、セクションをゾーン・セクションとして定義します。

ネストされたフィールド・セクション

ネストされたWITHIN問合せは、フィールド・セクションで入力できません。これを行うと、エラーが戻ります。

文または段落内の問合せ

同じ文または段落で出現するワードの組合せを検索するには、文または段落境界内での問合せが有効です。文または段落を問い合せるには、索引付けする前に、特殊セクションをセクション・グループに追加する必要があります。追加するには、CTX_DDL.ADD_SPECIAL_SECTIONを使用します。

同じ文にdogおよびcatを含むドキュメントを検索するには、次のように問い合せます。

'(dog and cat) WITHIN SENTENCE'

同じ段落にdogおよびcatを含むドキュメントを検索するには、次のように問い合せます。

'(dog and cat) WITHIN PARAGRAPH'

ワードdogはあるがcatはない文を含むドキュメントを検索するには、次のように問い合せます。

'(dog not cat) WITHIN SENTENCE'

属性セクション内での問合せ

セクション・グループ型としてXML_SECTION_GROUPまたはAUTO_SECTION_GROUPのいずれかで索引付けする場合は、属性セクション内で問合せを実行します。

次のようなXMLドキュメントがあるとします。

<book title="Tale of Two Cities">It was the best of times.</book>

セクションtitle@bookは、属性セクションtitleになるように定義します。この定義には、CTX_DLL.ADD_ATTR_SECTIONプロシージャを使用するか、またはALTER INDEXで索引付けしてから動的に定義します。

ノート:

AUTO_SECTION_GROUPを使用してXMLドキュメントを索引付けする場合、システムは属性セクションを自動的に作成し、これらをattribute@tag形式でネーミングします。

XML_SECTION_GROUPを使用する場合、属性セクションはCTX_DDL.ADD_ATTR_SECTIONで任意にネーミングできます。

属性セクションtitle内でTaleを検索するには、次の問合せを入力します。

'Tale WITHIN title'

属性セクションの問合せに対する制約

属性セクション内の問合せには、次の制約が適用されます。

  • 属性テキストに通常の問合せを行うと、WITHIN句で修飾されていない場合は、ドキュメントにヒットしません。次のようなXMLドキュメントがあるとします。

<book title="Tale of Two Cities">It was the best of times.</book>

Taleの問合せ自体は、WITHIN title@bookで修飾されていない場合、ドキュメントにヒットしません。(この動作は、visibleフラグをFALSEに設定した場合のフィールド・セクションと似ています。)

  • 属性セクションは、ネストされたWITHIN問合せでは使用できません。

  • 句は属性テキストを無視します。たとえば、元のドキュメントが次のようなものであるとします。

Now is the time for all good <word type="noun"> men </word> to come to the aid.

この場合、このドキュメントは、介入的な属性テキストを無視して、通常の問合せgood menにヒットします。

  • WITHIN問合せは、繰返し属性セクションを識別できます。この動作は、ゾーン・セクションには似ていますが、フィールド・セクションには似ていません。たとえば、次のドキュメントがあるとします。

<book title="Tale of Two Cities">It was the best of times.</book>
<book title="Of Human Bondage">The sky broke dull and gray.</book>

bookはゾーン・セクションで、book@authorは属性セクションであるとします。次の問合せについて考えてみます。

'(Tale and Bondage) WITHIN book@author'

この問合せはドキュメントにヒットしません。これは、taleおよびbondageの出現する属性セクションbook@authorが異なるためです。

ノート

セクション名

WITHIN演算子では、検索するセクション名がわかっている必要があります。定義済セクションのリストは、CTX_SECTIONSビューまたはCTX_USER_SECTIONSビューを使用して取得できます。

セクション境界

特殊セクションおよびゾーン・セクションについては、問合せの語句が、問合せを満たすためにドキュメントの特定のセクション内に出現する必要があります。フィールド・セクションにはこの要件は適用されません。

たとえば、boldがゾーン・セクションである場合、次のような問合せを考えます。

'(dog and cat) WITHIN bold'

この問合せは、次の語句を検索します。

<B>dog cat</B>

ただし、次の語句は検索しません。

<B>dog</B><B>cat</B>

これは、dogおよびcatが同じboldセクション内に存在する必要があるためです。

この動作は、特に特殊セクションに有効です。たとえば、

'(dog and cat) WITHIN sentence'

は、同じ文中にあるdogおよびcatを検索します。

一方、フィールド・セクションは、タイトル・セクションなど、繰返しのない埋込みメタデータ用です。問合せ文字列が存在する各フィールド・セクションは、異なるセクションとして区別できません。すべて同一セクション内に存在する文字列とみなされます。たとえば、次の問合せ

(dog and cat) WITHIN title

は、次のようなドキュメントを検索します。

<TITLE>dog</TITLE><TITLE>cat</TITLE>

このフィールド・セクション制限およびオーバーラップとネスト制限に対して、フィールド・セクション問合せは、特にセクションが各ドキュメントで出現する場合、または検索語句が共通の場合は、通常、ゾーン・セクション問合せよりも高速です。