演算子の優先順位は、問合せ式のコンポーネントが評価される順序を決定します。テキスト問合せ演算子は、それぞれ独自の評価順を持つ2組の演算子に分けることができます。次に、これら2つのグループをグループ1およびグループ2として説明します。
どのような場合でも、問合せ式は演算子の優先順位に従って、左から右の順に評価されます。優先順位の高い演算子が最初に評価されます。優先順位が等しい演算子は、式の中で現れる順序に従って左から右へ適用されます。
グループ1にもグループ2にもリストされていないその他の演算子は、プロシージャ型演算子です。これらの演算子には優先順位がありません。これらには、SQEおよびシソーラス演算子が含まれます。
表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番目の例では、AND
はOR
よりも優先順位が高いため、問合せはw1を含むすべてのドキュメント、およびw2とw3の両方を含むすべてのドキュメントを戻します。
2番目の例では、問合せはw1とw2の両方を含むすべてのドキュメント、およびw3を含むすべてのドキュメントを戻します。
3番目の例では、最初にFUZZY演算子がw1に適用されます。次にAND
演算子が引数w3およびw4に適用され、その後OR
演算子がw2およびAND
演算子の結果に適用されます。最後に、w1に対するFUZZY演算子のスコアがOR
演算子のスコアに加えられます。
4番目の例は、EQUIVALENCE演算子がAND
演算子より優先順位が高いことを示しています。
5番目の例は、AND
演算子がWITHIN
演算子より優先順位が低いことを示しています。
動作概要
問合せ語句に関連するドキュメントを戻すには、ABOUT
演算子を使用します。英語とフランス語では、ABOUT
によって概念を問い合せることができます。これは、概念が実際に問合せに含まれていなくても可能です。たとえば、heat (熱)に対するABOUT
問合せでは、temperature (温度)という語が問合せに含まれていなくても、温度に関連するドキュメントが戻されます。
その他の言語では、ABOUT
を使用すると、多くの場合は戻されるドキュメントの数が多くなり、結果のソート順序が改善される場合があります。Oracle Textはすべての言語において、ABOUT
問合せの結果に対し、関連性の最も高いドキュメントが最も高いスコアとなるようにスコア付けします。
英語とフランス語での動作
英語とフランス語では、ABOUT
演算子を使用して概念を問い合せます。システムは、索引のテーマ・コンポーネントの概念情報を検索します。索引にテーマ・コンポーネントを作成するには、INDEX_THEMES
BASIC_LEXER属性をYES
に設定します。
注意:
英語およびフランス語でABOUT
問合せを入力する場合、索引にテーマ・コンポーネントは必要ありません。ただし、索引にテーマ・コンポーネントがあると、ABOUT
問合せの結果が最も向上します。
Oracle Textでは、問合せワードまたは句に関連する概念を含むドキュメントを取り出します。たとえば、CaliforniaについてのABOUT
問合せを入力すると、システムによって、Californiaの都市であるLos AngelesとSan Franciscoという語句を含むドキュメントが戻されます。このABOUT
問合せで戻されるドキュメントには、Californiaという語句は必ずしも含まれてはいません。
ABOUT
問合せに指定したワードまたは句が、索引に格納されたテーマと完全に一致する必要はありません。Oracle Textは、索引の検索を実行する前に、ワードまたは句を正規化します。
ABOUT
演算子は、CONTAINS
SQL演算子およびCATSEARCH
SQL演算子と併用できます。CATSEARCH
の場合は、CONTEXT
文法による問合せテンプレートを使用して索引テーマを問い合せる必要があります。「例」の項の「CATSEARCHによるABOUT問合せ」を参照してください。
構文
構文 | 説明 |
---|---|
about(phrase) |
すべての言語において、 英語およびフランス語では、索引付け時に 戻されたスコアは関連性スコアです。 Oracle Textでは、phraseに組み込まれた問合せ演算子は無視されます。 索引にテーマ情報のみが含まれている場合、 指定するphraseは、4000文字以内です。 |
大/小文字の区別
問合せを適切な文字で表すと、ABOUT
問合せの結果が最も向上します。これは、問合せの正規化が、大/小文字が区別されるナレッジ・カタログに基づくためです。
ただし、ABOUT
問合せの結果を取得するために、大/小文字を正確に区別して問合せを入力する必要はありません。システムが、最適な方法で問合せを解釈します。たとえば、CISCOという文字で問合せを入力し、これがナレッジ・カタログで検出されない場合、システムでは検索用の関連概念としてCiscoを使用する場合があります。
ABOUT結果の改善
ABOUT
演算子は、英語とフランス語では、提供されているナレッジ・ベースを使用して入力された句を解析します。したがって、ABOUT
問合せは、ナレッジ・ベースにある概念の認識と解析に制限されています。
使用しているアプリケーション固有の用語をナレッジ・ベースに追加すると、ABOUT
問合せの結果が改善されます。
制限事項
ABOUT
問合せで指定する句は、4000文字以内です。
ABOUT演算子の例
単一のワード
サッカー(soccer)についてのドキュメントを検索するには、次の構文を使用します。
'about(soccer)'
句
句を問合せ語句として入力することで、問合せをさらに詳細化し、国際大会のサッカー・ルール(soccer rules in international competition)についてのドキュメントを含めます。
'about(soccer rules in international competition)'
この英語の例では、soccer、rulesまたはinternational competitionのテーマを持つすべてのドキュメントがOracle Textにより戻されます。
通常、スコア付けの点では、これら3つのテーマをすべて含むドキュメントの方が、これらのテーマのうちの1つまたは2つのみを含むドキュメントより高いスコアを示します。
構成されていない句
次の例のように、構成されていない句で問い合せることもできます。
'about(japanese banking investments in indonesia)'
結合された問合せ
AND
やNOT
など、他の演算子を使用して、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;
問合せ語句のいずれかが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
関連項目
各問合せ語句が1つ以上含まれるドキュメントを検索するには、AND
演算子を使用します。AND
演算子は、すべての問合せ語句が含まれるドキュメントを戻しますが、OR
演算子は、いずれかの問合せ語句が含まれるドキュメントを戻します。
構文
構文 | 説明 |
---|---|
term1&term2 term1 and term2 |
term1およびterm2が両方含まれているドキュメントを戻します。そのオペランドの最小スコアを戻します。すべての問合せ語句が存在する必要があり、スコアの低い方が選択されます。 |
AND演算子の例
blue、blackおよびredという語句が含まれているすべてのドキュメントを取得するには、次の問合せを入力します。
'blue & black & red'
AND
問合せでは、各問合せ語句のスコアのうち最も低いスコアが戻ります。この例では、ドキュメント内のblue、black および redの3つの語句のスコアがそれぞれ10、20および30の場合、ドキュメントのスコアは10になります。
関連項目
"OR (|)"
指定された問合せ語句の上位語としてシソーラスで定義されている語句が含まれるように問合せを拡張するには、BROADER TERM演算子(BT
、BTG
、BTP
、BTI
)を使用します。上位語の上位語、さらにその上位語、というようにシソーラス階層を上がるように問合せを拡張できます。
構文
構文 | 説明 |
---|---|
BT(term[(qualifier)][,level][,thes]) |
シソーラスで |
BTG(term[(qualifier)][,level][,thes]) |
シソーラスで |
BTP(term[(qualifier)][,level][,thes]) |
シソーラスで |
BTI(term[(qualifier)][,level][,thes]) |
シソーラスで |
BROADER TERM演算子にオペランドを指定します。termは、thesによって指定されたシソーラスで、語句に対して定義された上位語のエントリが含まれるようにOracle Textによって拡張されます。たとえば、BTG(dog)と指定すると、拡張には、dogに対する上位汎用語として定義されている語句のみが含まれます。拡張演算子はterm
引数に指定できません。
この拡張に含まれる上位語の数は、level
の値によって決定されます。
term
がthes
の同じ階層分岐で2つ以上のノードに現れる同形異義語(同じスペルで複数の意味を持つワードまたは句)の場合は、term
に修飾子を指定します。
BROADER TERM問合せで同形異義語に修飾子が指定されていない場合は、すべての同形異義語の上位語が含まれるように問合せが拡張されます。
指定された語句に対する上位語を戻すために、シソーラス階層内を横断するレベル数を指定します。たとえば、BTのレベル1問合せは、上位語が定義されている場合、指定した問合せ語句の上位語エントリを戻します。レベル2問合せは、指定した問合せ語句の上位語エントリ、さらにそれらの上位語の上位語エントリを戻します。
level引数はオプションで、デフォルト値は(1)です。level引数に0(ゼロ)または負の値を設定すると、元の問合せ語句のみを戻します。
指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULT
です。このデフォルト値を使用する場合は、シソーラス表にDEFAULT
という名前のシソーラスが存在している必要があります。
注意:
thes
を指定する場合は、level
も指定する必要があります。
BROADER TERM演算子の例
次の問合せは、tutorialという問合せ語句、またはDEFAULT
シソーラスでtutorialのBT
語として定義された語句が含まれているすべてのドキュメントを戻します。
'BT(tutorial)'
シソーラス名を指定する場合は、次のようにlevel
も指定する必要があります。
'BT(tutorial, 2, mythes)'
machineがcrane(building equipment)の上位語で、birdがcrane(waterfowl)の上位語であり、上位語問合せに修飾子が指定されていない場合、問合せ
BT(crane)
は、次のように拡張されます。
'{crane} or {machine} or {bird}'
上位語問合せでwaterfowlがcraneの修飾子として指定されている場合、問合せ
BT(crane{(waterfowl)})
は、次のように拡張されます。
'{crane} or {bird}'
注意:
BROADER TERMまたはNARROWER TERM問合せで修飾子を指定する場合、修飾子およびその表記法(カッコ付け)はこの例のようにエスケープする必要があります。
関連項目
シソーラスの上位語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.BT」を参照してください。
Oracle Textには、問合せ結果のキャッシュに使用できる、問合せフィルタ・キャッシュというキャッシュ・レイヤーがあります。問合せフィルタ・キャッシュは、問合せ間で共有が可能です。そのため、キャッシュされた問合せ結果を複数の問合せで再利用でき、問合せの応答時間が短縮されます。問合せフィルタ・キャッシュでどの問合せ結果、または問合せ結果の一部をキャッシュするかを指定するには、CTXFILTERCACHE
演算子を使用します。
CTXFILTERCACHE
は、CONTEXT文法問合せのみサポートしています。テンプレート問合せなどのCONTAINER問合せは、サポートされません。テンプレート問合せに対して実行すると、エラーが発生します。
注意:
CTXFILTERCACHE
を使用する前に、次のようにPURGE
recyclebin
を実行する必要があります。
SQL> PURGE recylebin;
ごみ箱のオブジェクトのパージの詳細は、『Oracle Database管理者ガイド』を参照してください。
構文
ctxfiltercache((query_text) [, save_score] [, topN])
結果をキャッシュに格納する必要がある問合せを指定します。
すべての問合せ結果を、そのスコアとともにキャッシュに格納する場合は、TRUE
を指定します。
デフォルトはFALSE
です。この場合、問合せ結果ごとに戻されるスコアは100で、このスコアはキャッシュに格納されません。問合せ結果のみキャッシュに格納されます。
問合せ結果は再利用し、そのスコアは他の問合せで再利用しない場合は、FALSE
を指定します。これは、問合せテキストをセキュリティ・フィルタなどのフィルタとして使用する場合に特に便利です。キャッシュされた問合せの一部の関連性が、問合せ全体の関連性に影響しないような場合です。そのため、AND演算子(そのオペランドの低いスコアを戻す)とともに使用する場合、スコア100は問合せ全体のスコアに影響しません。
上位スコアの問合せ結果のみをキャッシュに格納する場合は、TRUE
を指定します。上位どのくらいのスコアの問合せ結果がキャッシュに格納されるかは、Oracle Textによって内部的に決定されます。これによって、キャッシュのメモリー消費量が抑えられます。
注意:
topN
にTRUE
を指定する場合は、save_score
もTRUE
に設定する必要があります。
CTXFILTERCACHEの例
ストアド・クエリー結果およびTopNの例
次の例は、common_predicate
問合せの問合せ結果をキャッシュに格納します。
select * from docs where contains(txt, 'ctxfiltercache((common_predicate), FALSE)')>0;
ここで、save_score
はFALSE
です。したがって問合せ結果ごとに戻されるスコアは100であり、このスコアはキャッシュに格納されません。
次の例では、common_predicate
問合せの結果がキャッシュされ、new_query
問合せによって再利用されます。
select * from docs where contains(txt, 'new_query & ctxfiltercache((common_predicate), FALSE)')>0;
common_predicate
問合せの結果をすべて、実際のスコアとともにキャッシュに格納するには、次の例のようにsave_score
をTRUE
に設定します。
select * from docs where contains(txt, 'ctxfiltercache((common_predicate), TRUE)')>0;
common_predicate
問合せで上位スコアの結果のみをキャッシュに格納する場合は、次の例で説明しているように、topN
をTRUE
に設定します。
select id, score(1) from docs where contains(txt, 'ctxfiltercache((common_predicate), TRUE, TRUE)', 1)>0 order by score(1) desc;
スコアが問合せの主要部分にのみ関連する場合、問合せの主要部分についてはtopN
をTRUE
に設定し、フィルタ部分については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
およびSDATA
のsyncindex
の後の最初の問合せ
topN
がFALSE
の場合、CTXFILTERCACHE
演算子は最上位の演算子か、次の演算子の子です。
AND
ACCUM
NOT
または
THRESHOLD
(左辺の演算子のみ)
WEIGHT
(左辺の演算子のみ)
topN
がTRUE
の場合は、次のようになります。
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」を参照してください。
AND
およびOR
の子ノードのスコアをマージする方法を定義するには、DEFINEMERGE
演算子を使用します。DEFINEMERGE
演算子は、オペランドにAND
またはOR
を使用できる演算子のオペランドとして使用できます。スコアは3つの方法でマージできます。最小値を選択する方法、最大値を選択する方法、またはすべての子ノードの平均スコアを計算する方法です。
DEFINESCOREは、DEFINEMERGE
を使用する前に使用してください。
構文
DEFINEMERGE ( ( (text_query1), (text_query2), … ) , operator, merge_method )
構文 | 説明 |
---|---|
text_query1,2 ... |
検索基準を定義します。これらのパラメータには、ANDまたはOR演算子に対して有効な値を設定できます。 |
operator |
2つの |
merge_method |
text_queryのスコアのマージ方法を定義します。有効な値: |
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」の語句は、両方の語句の平均関連性スコアを、マージしたスコアとして使用して問い合せます。
関連項目
語句、句または一連のEQUIVALENCE語句のスコア付け方法を定義するには、DEFINESCORE
演算子を使用します。スコアリング式の定義は、事前定義済のスコアリング・コンポーネントと数値リテラルの算術式で構成できます。
DEFINEMERGEは、DEFINESCORE
の後に使用できます。
構文
DEFINESCORE (query_term, scoring_expression)
query_term
のスコア付け方法を示す算術式。このオペランドは、次のコンポーネントを含む文字列です。
算術演算子: + - * /
。優先順位は、乗算および除算(*、/)が加算および減算(+、-)よりも高くなります。
グループ化演算子: ()
。カッコを使用すると、算術演算子の優先順位を変更できます。
絶対値関数: ABS(n)
はn
の絶対値を戻します。n
は数値を戻す式です。
対数関数: LOG(n)
は、n
の基数10の対数値を戻します。n
は数値を戻す式です。
事前定義済のスコアリング・コンポーネント: 次の各スコアリング・コンポーネントは、様々な基準に応じて0から100の値を戻します。
名前 | 説明 |
---|---|
|
ドキュメントに語句が存在する場合はscore = 100を戻します。存在しない場合はscore = 0を戻します。 |
|
出現回数に基づいてスコア付けします。 |
|
ドキュメントの関連性に基づいてスコア付けします。 |
|
対象範囲に基づいてスコア付けします。セクションで一致語句数とすべての語句数(ストップワード数を含む)間の比率が高いほど、ドキュメントのスコアは高くなります。 |
|
語句に対するスコア付けを無視します。このコンポーネントは単独で使用する必要があります。単独で使用しない場合は、問合せで構文エラーが戻されます。問合せで唯一の語句のスコア付けが |
注意:
数値リテラルの場合は、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
で使用されている場合、OCCURRENCE
とCOMPLETION
のスコア付けは適用できません。使用されている場合は、問合せで構文エラーが戻されます。
IGNORE
スコアは、MINUS演算子の右側で使用できません。使用した場合は、構文エラーが発生します。
COMPLETION
スコアを適用できるのは、DEFINESCORE
をWITHIN
演算子とともに使用してゾーン・セクションを検索する場合のみです。次に例を示します。
'DEFINESCORE (dog, COMPLETION) within zonesection'
それ以外の場合は、問合せで構文エラーが戻されます。
WITHIN
の左側のオペランドの制限事項は、次のとおりです。
すべてのノードで、同じ事前定義済のスコアリング・コンポーネントを使用する必要があります。(指定しない場合、事前定義済のスコア付けはRELEVANCE
になります。)
ノードでDISCRETE
またはCOMPLETION
を使用する場合、WITHIN
の左側の子として使用できる演算子はAND
およびOR
演算子のみです。
ノードでDISCRETE
またはCOMPLETION
を使用する場合、WITHIN
では、すべてのセクション・インスタンスの最大スコアをスコアとして使用します。
ノードでRELEVANCE
またはOCCURRENCE
を使用する場合、WITHIN
では、すべてのセクション・インスタンスのスコアの合計をスコアとして使用します。
一度にscoring_expression
で使用できる事前定義済のスコアリング・コンポーネントは1つのみです。複数の事前定義済のスコアリング・コンポーネントを使用した場合は、構文エラーが発生します。
関連項目:
『Oracle Database SQL言語リファレンス』
注意
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
に基づいてスコア付けします。
関連項目
問合せ時に条件を満たすワードの置換を指定するには、EQUIV
演算子を使用します。
構文
構文 | 説明 |
---|---|
term1=term2 term1 equiv term2 |
term2がterm1の条件を満たす置換語であることを指定します。スコアは、両方の語句の出現回数の合計として計算されます。 |
EQUIV演算子の例
次の例は、句alsatians are big dogsまたはlabradors are big dogsのいずれかを含むすべてのドキュメントを戻します。
'labradors=alsatians are big dogs'
指定された語句に類似するスペルのワードが含まれるように問合せを拡張するには、fuzzy
演算子を使用します。この拡張タイプは、ドキュメント・セットにスペル・ミスが多い場合に、より正確な結果を検索するために有効です。
fuzzy
構文を使用すると、結果セットのランク付けができます。このランク付けによって、問合せワードに対する類似度が高いワードを含むドキュメントには、類似度の低いワードを含むドキュメントより高いスコアが割り当てられます。また、拡張する語句の数も制限できます。
STEM拡張とは異なり、fuzzy
拡張によって生成されるワード数は、索引内のワードによって異なります。したがって、結果は、索引の内容によって大幅に変わってきます。
サポート対象言語
Oracle Textでは、英語、フランス語、ドイツ語、イタリア語、オランダ語、スペイン語、ポルトガル語、日本語、OCRおよび自動言語識別のfuzzy
定義をサポートしています。
ストップワード
fuzzy
拡張がストップワードを戻す場合、そのストップワードは問合せの中には含まれず、CTX_DOC.HIGHLIGHT
またはCTX_DOC.MARKUP
でハイライト表示もされません。
基本文字変換
テキスト列に基本文字変換を使用でき、問合せ式にfuzzy
演算子が指定されている場合は、Oracle Textによって問合せの基本文字書式が処理されます。
構文
fuzzy(term, score, numresults, weight)
パラメータ | 説明 |
---|---|
term |
|
score |
類似度スコアを指定します。この数値未満のスコアを割り当てられた拡張内の語句は、排除されます。1から80の数を指定します。デフォルトは60です。 |
numresults |
termの拡張に使用する語句の最大数を指定します。1から5000の数を指定します。デフォルトは100です。 |
WEIGHT |
結果に対して、それぞれの類似度スコアに応じて重みを付ける場合は、 結果に重みを付けない場合は、 |
FUZZY演算子の例
次のCONTAINS
問合せについて考えます。
...CONTAINS(TEXT, 'fuzzy(government, 70, 6, weight)', 1) > 0;
この問合せは、類似度スコアが70を超える、索引にあるgovernmentの最初の6つのfuzzy
バリエーションに拡張されます。
さらに、結果セットのドキュメントには、governmentに対するそれぞれの類似度に応じて重み付けが行われます。governmentに最も類似しているワードが含まれているドキュメントに、最も高いスコアが割り当てられます。
不要なパラメータは、適切な数のカンマを使用してスキップします。次に例を示します。
'fuzzy(government,,,weight)'
下位互換性のための構文
前のリリースの古いfuzzy
構文も引き続きサポートされています。この構文は、次のとおりです。
パラメータ | 説明 |
---|---|
?term |
スペルが似ているすべての語句が、指定した問合せ語句に含まれるように問合せtermを拡張します。 |
指定したセクション・パスを含むすべての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としてレクサー処理されます。円記号を使用して、BとTEXTの間の二重引用符をエスケープする必要があります。そうしないと、解析エラーが戻されます。
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
この問合せは、次のドキュメントを検索します。
<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;
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が含まれているドキュメントを戻します。 たとえば、次のドキュメント
が戻されます。 |
単一レベルのワイルド・カード検索
構文 | 説明 |
---|---|
term INPATH (A/*/B) |
トップレベルの要素Aの孫(2レベル下位)である要素Bにtermが含まれているドキュメントを戻します。 たとえば、次のドキュメント
が戻されます。 |
マルチレベルのワイルド・カード検索
構文 | 説明 |
---|---|
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>
これは、デフォルトでは、アンダースコアが結合文字ではないためです。
MDATA
セクションが含まれるドキュメントを問い合せるには、MDATA
演算子を使用します。MDATA
セクションは、複合問合せを高速化するためにドキュメントに追加されたメタデータです。
MDATA
はリテラルとして処理されます。たとえば、次の問合せ
MDATA(price, $1.24)
では、$はSTEM演算子として解釈されません。また、. (ピリオド)も空白に変換されません。MDATA
演算子の範囲は右(閉じ)カッコまでであるため、右カッコを持つMDATA
値は検索されません。
構文
MDATA(sectionname, value)
検索するMDATA
セクションの名前。sectionname
パラメータがDATE
のFILTER
BY
列または一部の数値型にマップされている場合、MDATA
はDATE
または数値等価も検索します。
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)
不要なノイズ語句が含まれているドキュメントのスコアを低くするには、MINUS
演算子を使用します。MINUS
は、特定の問合せ語句が含まれているドキュメントを検索し、2番目の問合せ語句が存在するドキュメントのランクを低くする場合に有効です。
構文
構文 | 説明 |
---|---|
term1-term2 term1 minus term2 |
term1が含まれているドキュメントを戻します。term1のスコアからterm2のスコアを引いて、スコアを計算します。正数のスコアを持つドキュメントのみが戻されます。 |
MINUS演算子の例
たとえばcarsという語句についての問合せが、常にFord carsについてのドキュメントに高いスコアを戻すとします。次の式を使用して、Fordに関するドキュメントのスコアを低くできます。
'cars - Ford'
この式は語句carsを含むドキュメントを戻しますが、Ford も含まれている可能性があります。ただし、戻されたドキュメントのスコアは、carsのスコアからFordのスコアを差し引いた値になります。
関連項目
"NOT (~)"
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 (~)"
指定された問合せ語句の下位語としてシソーラスで定義されているすべての語句が含まれるように問合せを拡張するには、NARROWER TERM演算子(NT
、NTG
、NTP
、NTI
)を使用します。また、下位語の下位語、さらにその下位語、というようにシソーラス階層を下がるように問合せを拡張できます。
構文
構文 | 説明 |
---|---|
NT(term[(qualifier)][,level][,thes]) |
シソーラスでtermに対する下位語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。 |
NTG(term[(qualifier)][,level][,thes]) |
シソーラスでtermに対する下位汎用語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。 |
NTP(term[(qualifier)][,level][,thes]) |
シソーラスでtermに対する下位部分語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。 |
NTI(term[(qualifier)][,level][,thes]) |
シソーラスでtermに対する下位インスタンス語として定義されたすべての下位レベルの語句が含まれるように、問合せを拡張します。 |
NARROWER TERM演算子にオペランドを指定します。term
は、thes
によって指定されたシソーラスで、語句に対して定義された下位語のエントリが含まれるように拡張されます。この拡張に含まれる下位語の数は、level
の値によって決定されます。拡張演算子はterm
引数に指定できません。
term
がthes
の同じ階層分岐で2つ以上のノードに現れる同形異義語(同じスペルで複数の意味を持つワードまたは句)の場合は、term
に修飾子を指定します。
NARROWER TERM問合せで同形異義語に修飾子が指定されていない場合は、すべての同形異義語の下位語が含まれるように問合せが拡張されます。
指定された語句に対する下位語を戻すために、シソーラス階層内を横断するレベル数を指定します。たとえば、NT
のレベル1問合せは、下位語が定義されている場合、指定した問合せ語句のすべての下位語エントリを戻します。レベル2問合せは、指定した問合せ語句の下位語エントリ、さらにそれらの下位語の下位語エントリを戻します。
level引数はオプションで、デフォルト値は(1)です。level引数に0(ゼロ)または負の値を設定すると、元の問合せ語句のみを戻します。
指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes引数はオプションで、デフォルト値はDEFAULT
です。このデフォルト値を使用する場合は、シソーラス表にDEFAULT
という名前のシソーラスが存在している必要があります。
注意:
thes
を指定する場合は、level
も指定する必要があります。
NARROWER TERM演算子の例
次の問合せは、catという問合せ語句、またはDEFAULT
シソーラスでcatのNT
語として定義された語句のいずれかが含まれているすべてのドキュメントを戻します。
'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」を参照してください。
同じようなスペルの一致を検索する場合または指定された句の語句の再配置が役立つ場合に、NDATA
演算子を使用します。ドキュメント・セットの名前データにスペルミス(不正確な順序付け)が頻出する場合に、より正確な結果を検出する上で有用です。定義されたNDATA
セクションにのみ、この演算子を使用できます。NDATA
構文を使用すると、結果セットのランク付けができます。このランク付けによって、表記の類似度が高いワードを含むドキュメントには、類似度の低いワードを含むドキュメントより高いスコアが割り当てられます。
正規化
レクサーは、NDATA
問合せ句を処理しません。ただし、ユーザーは、NDATA
セクションを含む特定のセクション・グループの基本文字属性および代替スペル属性を設定できます。問合せが正規化され、文字以外のデータ(空白を除く)が削除されます(数値や句読点など)。
構文
ndata(sectionname, phrase [,order][,proximity])
パラメータ名 | デフォルト値 | パラメータの説明 |
---|---|---|
|
問合せに使用する定義された |
|
|
名前データ問合せの句を指定します。 phraseパラメータは、1つのワード、句またはフリー・テキスト・フォーマットのワード文字列です。 戻されたスコアは関連性スコアです。 Oracle Textでは、 句の文字長には少なくとも2文字を指定し、4000文字を超えないようにしてください。 |
|
|
|
問合せの個々のトークン(語句)が順序どおりまたは任意の順序で一致するかどうかを指定します。orderパラメータは、候補ドキュメントと一致する1次フィルタを提供します。
|
|
|
語句の出現位置の近さが一致候補の類似度スコアに影響するかどうかを指定します。つまり、proximityパラメータが有効な場合、一致語句の間の一致しない追加語句が一致候補の類似度スコアを低くします。
|
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
問合せ演算子は、オフセット情報を提供しません。つまり、WITHIN
、NEAR(;)
またはEQUIV(=)
の子として使用できません。NDATA
セクションはCTX_DOC.HIGHLIGHT
、CTX_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を使用しようとすると、サポートされていないことを示すエラーが戻ります。
2つ以上の問合せ語句の出現位置の近さを基準にしてスコアを戻すには、NEAR
演算子を使用します。Oracle Textにより、ドキュメント内で互いに近接した語句には高いスコアが、互いに離れた語句には低いスコアが戻されます。単語または項目がNEAR
問合せで複数回出現する場合、一致するにはその単語がドキュメントで複数回出現する必要があります。
注意:
NEAR
演算子はワード問合せのみで機能します。ABOUT
問合せではNEAR
を使用できません。
構文
NEAR((word1,word2,...,wordn) [, max_span [, order [, maxreqd]]])
下位互換性のための構文:
word1;word2
問合せ語句をカンマで区切って指定します。問合せ語句は、1つのワードまたは句の場合もあり、他の問合せ演算子を使用する場合もあります(「NEARおよびその他の演算子」を参照)。
オプションで、最大クランプのサイズを指定します。デフォルトは100です。100より大きい数を指定すると、Oracle Textからエラーが戻されます。
クランプはすべての問合せ語句が出現する最小のワード・グループです。すべてのクランプは問合せ語句で始まり、問合せ語句で終わります。
2つの問合せ語句を持つNEAR問合せでは、max_span
がこの2つの語句間の最大距離になります。たとえば、dogがcatの6ワード以内にある場合、dogおよびcatについて問い合せるには、次の問合せを入力します。
'near((dog, cat), 6)'
Oracle Textを使用して、指定した順序で語句を検索するには、TRUE
を指定します。デフォルトはFALSE
です。
たとえば、最大クランプ・サイズを20にして、monday、tuesdayおよび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)'
NEARスコア付け
NEAR
演算子のスコア付けは、語句の出現頻度および語句の出現位置の近さを組み合せて行われます。問合せに適合する各ドキュメントに対して、ドキュメント内のクランプの数に比例し、そのクランプの平均サイズに反比例する1から100までのスコアがOracle Textにより戻されます。小さなクランプは問合せ語句が近接していることを示すため、ドキュメントに小さなクランプが多く存在するほど高いスコアになります。
問合せ語句の数もスコアに影響を与えます。多くの語句(7個程度)で問い合せると、少ない語句(2個程度)で問い合せたときよりも、通常100のスコアを得るために必要なドキュメントのクランプ数が少なくなります。
クランプはすべての問合せ語句が出現する最小のワード・グループです。すべてのクランプは問合せ語句で始まり、問合せ語句で終わります。この項で説明するとおり、クランプ・サイズはmax_span
パラメータで定義します。
クランプのサイズに問合せ語句そのものは含まれません。そのため、問合せNEAR((DOG, CAT), 1)
にdog catとdog ate catは一致しますが、dog sat on catは一致しません。
NEARおよびその他の演算子
AND
やOR
など他の演算子とともにNEAR
演算子を使用できます。スコアは通常の方法で計算されます。
たとえば、語句lionおよびtigerが互いに10ワード以内のところに位置する場合、語句tiger、lionおよび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
機能により、ユーザーはネストされた近接問合せを使用できます。ユーザーは、次のような問合せを実行できます。
SELECT * FROM docs WHERE CONTAINS(txt, 'near((near((term1, term2),5), term3), 100)')>0
term1、term2、および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です。
たとえば、lionがtigerの近くに出現するすべてのドキュメントを検索するには、次のように記述します。
'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 carmel 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 carmel syrup.
関連項目:
ハイライト表示用プロシージャの詳細は、「CTX_DOCパッケージ」を参照してください。
セクション検索およびNEAR
セクションの検索には、次のように、WITHIN
演算子とNEAR
演算子を併用します。
'near((dog, cat), 10) WITHIN Headings'
このような式を評価する場合は、Oracle Textにより、指定されたセクション内全体にあるクランプが検索されます。
この例では、セクションHeadings内全体にあるdogおよびcatを含むクランプのみがカウントされます。つまり、語句dogがHeadings内にあり、語句catがdogから5ワードのところにあるがHeadingsの外にある場合、これら2つのワードは式を満たさず、カウントされません。
1つの問合せ語句が含まれているが、もう1つの問合せ語句が含まれていないドキュメントを検索するには、NOT
演算子(~)を使用します。
構文
構文 | 説明 |
---|---|
term1~term2 term1 not term2 |
term1が含まれるが、term2が含まれていないドキュメントを戻します。 |
NOT演算子の例
たとえば、animalsという語句が含まれていて、dogsという語句は含まれていないドキュメントを取得するには、次の式を使用します。
'animals ~ dogs'
同様に、 transportationという語句が含まれていて、automobiles または trainsという語句は含まれていないドキュメントを取得するには、次の式を使用します。
'transportation not (automobiles or trains)'
注意:
NOT
演算子は、他の論理演算子が作成したスコアには影響を与えません。
関連項目
いずれかの問合せ語句が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 (&)"
問合せ内の問合せ語句を、その問合せ語句の優先語としてシソーラスで定義された語句に置換するには、PREFERRED TERM演算子(PT
)を使用します。
構文
構文 | 説明 |
---|---|
PT(term[,thes]) |
問合せで指定されたワードをtermに対する優先語で置換します。 |
PT演算子の例
automobileはシソーラスにcarという優先語があるとします。automobileのPT
問合せを行うと、 carというワードが含まれているすべてのドキュメントが戻ります。 automobileというワードが含まれているドキュメントは戻りません。
関連項目
シソーラスの優先語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.PT」を参照してください。
問合せ語句の関連語としてシソーラスに定義されたすべての語句が含まれるように問合せを拡張するには、RELATED TERM演算子(RT
)を使用します。
構文
構文 | 説明 |
---|---|
RT(term[,thes]) |
シソーラスで |
RT演算子の例
dogという語句には、wolfという関連語があるとします。dogに対してRT問合せを行うと、dogおよびwolfというワードを含むすべてのドキュメントが戻ります。
関連項目
シソーラスの関連語のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.RT」を参照してください。
構造化データの値が含まれる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 "'" |
検索してテストを実行したり、チェックする対象のSDATA
セクションの名前。
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
制限事項
INDEXED_COLUMN
、FILTER
BY
列およびORDER
BY
列の合計数は99以内です。
セクション名が定義されたSDATA
セクションでない場合は、エラーが発生します。セクションのソース(タグか列かなど)は重要ではありません。
この構文では、RHS
SDATA
および式は使用できません。
SDATA
演算子は、WITHIN
、INPATH
、HASPATH
または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)
この例のSDATA
はAND
ではなく、OR
演算子の子です。
SDATA(foo = 5) & SDATA(bar = 7)
この例では、両方のSDATA
演算子がAND
の子ですが、このAND
演算子にはSDATA
以外の子がありません。
関連項目
「Oracle Textビュー」の「CTX_SECTIONS」
関連項目:
『Oracle Database SQL言語リファレンス』
『Oracle Textアプリケーション開発者ガイド』の第8章「Oracle Textでのドキュメント・セクションの検索」
発音が類似したワード(他のワードと似た発音のワード)が含まれるように問合せを拡張するには、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によって問合せの基本文字書式が処理されます。
問合せ語句と同じ語根を持つ語を検索するには、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」を参照してください。
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;
このストアド・クエリー式は、hurricane、earthquakeまたは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が発生します。
関連項目
指定した語句のシノニムとしてシソーラスに定義されているすべての語句が含まれるように問合せを拡張するには、SYNONYM演算子(SYN
)を使用します。
構文
構文 | 説明 |
---|---|
SYN(term[,thes]) |
シソーラスで |
SYN演算子の例
次の問合せ式は、dogという問合せ語句、またはDEFAULT
シソーラスでdogのシノニムとして定義された語句が含まれているすべてのドキュメントを戻します。
'SYN(dog)'
SYNONYM演算子内のコンパウンド句
シノニム問合せで問合せ語句のコンパウンド句の拡張問合せは、AND
接続詞によって戻ります。
たとえば、 temperature + measurement + instrumentsというコンパウンド句は、thermometerという問合せ語句のシノニムとしてシソーラスに定義されています。thermometerのシノニム問合せは次のように拡張されます。
{thermometer} OR ({temperature}&{measurement}&{instruments})
関連項目
シソーラスのシノニム語句のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.SYN」を参照してください。
THRESHOLD演算子(>)は、次の2通りの方法で使用します。
式レベル
問合せ語句レベル
式レベルのTHRESHOLD演算子は、しきい値の数値を下回るスコアのドキュメントを結果セットから排除します。
問合せ語句レベルのTHRESHOLD値演算子は、ある語句がドキュメント内でどのようにスコアを出すかに基づいてドキュメントを選択します。
構文
構文 | 説明 |
---|---|
expression>n term>n |
結果セットでスコアがしきい値nを超えるドキュメントのみを戻します。 式内で、スコアが最低nの問合せ語句が含まれているドキュメントを戻します。 |
THRESHOLD(>)演算子の例
式レベルで、 relational databasesが含まれているドキュメントを検索し、スコアが75よりも大きいドキュメントのみを戻すには、次の式を使用します。
'relational databases > 75'
問合せ語句レベルで、lionのスコアが30以上で、さらにtiger が含まれているドキュメントを選択するには、次の式を使用します。
'(lion > 30) and tiger'
定義されたすべての外国語の等価語句が含まれるように問合せを拡張するには、TRANSLATION TERM(TR
)演算子を使用します。
構文
構文 | 説明 |
---|---|
TR(term[, lang, [thes]]) |
termに対して定義されたすべての外国語の等価語が含まれるように、termを拡張します。 |
TRANSLATION TERM演算子にオペランドを指定します。term
は、thes
でterm
に対して定義されたすべての外国語エントリが含まれるように拡張されます。拡張演算子はterm
引数に指定できません。
オプションで、拡張によってどの外国語の等価語を戻すかを指定します。指定する言語はthes
に定義されている言語と一致している必要があります。(1回に指定できる言語は1つのみです。)このパラメータを省略、またはALL
を指定すると、定義されたすべての外国語の語句を使用するように拡張されます。
オプションで、指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。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」を参照してください。
問合せ語句に対して定義されたすべての外国語の等価語、問合せ語句のシノニム、およびそのシノニムの外国語の等価語が含まれるように問合せを拡張するには、TRANSLATION TERM SYNONYM(TRSYN
)演算子を使用します。
構文
構文 | 説明 |
---|---|
TRSYN(term[, lang, [thes]]) |
|
この演算子にオペランドを指定します。term
は、thes
でterm
に対して定義されたすべての外国語エントリおよびシノニムが含まれるように拡張されます。拡張演算子はterm
引数に指定できません。
オプションで、拡張によってどの外国語の等価語を戻すかを指定します。指定する言語はthes
に定義されている言語と一致している必要があります。このパラメータを省略すると、定義されたすべての外国語の語句を使用するように拡張されます。
オプションで、指定された問合せ語句の拡張問合せを戻すために使用するシソーラス名を指定します。thes
引数のデフォルト値はDEFAULT
です。。したがって、シソーラス演算子を使用するには、DEFAULT
という名前のシソーラスがシソーラス表に存在している必要があります。
注意:
thes
を指定する場合は、lang
も指定する必要があります。
TRSYN演算子の例
catに対して次のエントリを持つシソーラスMY_THES
があるとします。
cat SPANISH: gato FRENCH: chat SYN lion SPANISH: leon
cat、catのスペイン語での等価語、catのシノニム、およびlionのスペイン語での等価語を含むすべてのドキュメントを検索するには、次の問合せを入力します。
'trsyn(cat, spanish, my_thes)'
この問合せは次のように拡張されます。
'{cat}|{gato}|{lion}|{leon}'
関連項目
シソーラスの訳語およびシノニム語句のブラウズについては、「CTX_THESパッケージ」の「CTX_THES.TRSYN」を参照してください。
問合せ語句を、シソーラスの標準階層内(上位語[BT
]、下位語[NT
])でその問合せ語句について定義されている最上位語と置換するには、問合せ内でTOP TERM演算子(TT
)を使用します。最上位語は、問合せ語句に関連する、概念的に最上位の語句です。たとえば、シソーラスでは次のように階層が定義されます。
DOG BT1 CANINE BT2 MAMMAL BT3 VERTEBRATE BT4 ANIMAL
このシソーラスにおけるdogの最上位語はanimalです。
汎用階層(BTG
、NTG
)、部分階層(BTP
、NTP
)およびインスタンス(BTI
、NTI
)階層内の最上位語は戻されません。
構文
構文 | 説明 |
---|---|
TT(term[,thes]) |
問合せで指定されたワードを、termに対する標準的な階層( |
TT演算子の例
dogという問合せ語句には、シソーラスの標準階層内にanimalという最上位語があるとします。dogのTT
問合せは、 animalという句が含まれているすべてのドキュメントを戻します。 dogというワードが含まれているドキュメントは戻しません。
関連項目
シソーラスの最上位語のブラウズについては、「CTX_THES.TT 」を参照してください。
WEIGHT演算子は、指定した係数をスコアに掛けます。スコアが100を超える場合、最高値は100になります。たとえば、問合せ cat, dog*2 は、catのスコアとdogのスコアの2倍を合計します。スコアが100を超える場合、最高値は100になります。
複数の問合せ語句が含まれている式では、WEIGHT演算子を使用して問合せ語句の相対的なスコアを調整します。1より小さい数とWEIGHT演算子を使用して、問合せ語句のスコアを減らします。1より大きく10より小さい数とWEIGHT演算子を使用して、問合せ語句のスコアを増やします。
WEIGHT演算子は、式に複数の問合せ語句があるACCUMulate(_)問合せ、AND(&)問合せまたはOR(|)問合せで便利です。個々の語句に重みを付けないと、出現回数の最も多い問合せ語句をスコアから判断できません。語句の重み付けにより、語句のスコアを個別に変更でき、関心度の高い語句がドキュメント全体のランク付けに高く反映されるようにできます。
構文
構文 | 説明 |
---|---|
term*n |
|
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が両方とも含まれるドキュメントの相対的なスコアが高くなります。
問合せ式でワイルド・カード文字を使用すると、ワード検索をパターン検索に拡張できます。「DOG %」、「.%」、「%」などのワイルド・カードを単独で使用すると、ストップワードとして扱われます。
ワイルドカード文字は次のとおりです。
ワイルド・カード文字 | 説明 |
---|---|
% |
ワールド・カードとしてのパーセント記号は、検索語句の任意の位置で何回でも使用できます。検索語句は拡張され、語句の同等化リストになります。リストは、パーセント文字の位置に文字が0以上存在する、ワイルド・カード語句に一致する索引内のすべての語句から構成されます。 |
_ |
ワイルド・カードとしてのアンダースコアは、その位置に任意の1文字が現れることを示します。 |
エスケープされないワイルド・カード文字が含まれる、1つの問合せ内のすべてのワードのワイルド・カード拡張の合計数は、BASIC_WORDLIST
属性のWILDCARD_MAXTERMS
で指定された拡張の最大数を超えないようにしてください。詳細については「BASIC_WORDLIST」を参照してください。
右側切捨て問合せ
右側切捨てでは、検索文字列の右側にワイルド・カードが置かれます。
たとえば、次の問合せ式では、パターンscalで始まるすべての語句を検索します。
'scal%'
左側切捨て問合せおよび左右切捨て問合せ
左側切捨てでは、検索文字列の左側にワイルド・カードが置かれます。
king、wing、singなどのワードを検索するには、次のように問合せを記述します。
'_ing'
ingで終わるすべてのワードについては、次の問合せを入力します。
'%ing'
左側切捨て検索および右側切捨て検索を組み合せて、左右切捨て検索を作成します。次の問合せでは、サブストリング%benz%を含むワードのあるすべてのドキュメントを検索します。
'%benz%'
ワイルド・カード問合せのパフォーマンス改善
ワイルド・カード問合せのパフォーマンスは、サブストリングまたはプリフィックス索引を追加して改善します。
ワイルド・カード問合せが左側切捨ておよび左右切捨ての場合、サブストリング索引を作成すると、問合せパフォーマンスが向上します。サブストリング索引によって、%ed、_ing、%benz%などの、あらゆる種類の左側切捨てワイルド・カード検索の問合せパフォーマンスが向上します。
ワイルド・カード問合せが右側切捨ての場合は、プリフィックス索引を作成すると、パフォーマンスが向上します。プリフィックス索引によって、to%などのワイルド・カード検索の問合せパフォーマンスが向上します。
関連項目:
サブストリングおよびプリフィックス索引の作成の詳細は、「Oracle Text索引付けの要素」の「BASIC_WORDLIST」を参照してください。
問合せをドキュメントのセクションに絞り込むには、WITHIN
演算子を使用します。ドキュメントのセクションは次のいずれかです。
ゾーン・セクション
フィールド・セクション
属性セクション
特殊セクション(文または段落)
構文
構文 | 説明 |
---|---|
expression WITHIN section |
事前定義済のゾーン、フィールドまたは属性section内でexpressionを検索します。 セクションがゾーンの場合、expressionは、セクションがゾーンまたは特殊セクションである セクションがフィールドまたは属性セクションの場合、式は他の |
expression WITHIN SENTENCE |
文中にexpressionを含むドキュメントを検索します。expressionには expressionは、セクションがゾーンまたは特殊セクションである |
expression WITHIN PARAGRAPH |
段落中にexpressionを含むドキュメントを検索します。expressionには expressionは、セクションがゾーンまたは特殊セクションである |
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セクション内で、dogがcatの近くにあるすべてのドキュメントを検索するには、次の問合せを記述します。
'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_SECTION
でFALSE
に設定されたvisibleフラグで作成されている場合、そのフィールド・セクション内のテキストは、WITHIN
演算子を使用してのみ問合せできます。
たとえば、TITLE
フィールド・セクションのvisibleフラグがFALSE
に設定されているとします。この場合、WITHIN
演算子のないdog の問合せでは、次の内容を含むドキュメントを検索しません。
<TITLE>The dog</TITLE> I like my pet.
このようなドキュメントを検索するには、次のようにWITHIN
演算子を使用します。
'dog WITHIN TITLE'
また、TITLE
をCTX_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>
このフィールド・セクション制限およびオーバーラップとネスト制限に対して、フィールド・セクション問合せは、特にセクションが各ドキュメントで出現する場合、または検索語句が共通の場合は、通常、ゾーン・セクション問合せよりも高速です。