7 Oracle TextでのCONTEXT構文およびCTXCAT構文の使用
7.1 CONTEXT構文
CONTEXT文法は、CONTAINSのデフォルトの文法です。この文法では、演算子を使用してさらに複雑な検索を行うことができます。問合せ演算子は問合せ式で使用します。たとえば、AND論理演算子を使用すると、2つの異なるワードを含むすべてのドキュメントを検索できます。ABOUT演算子を使用すると、概念を検索できます。
また、セクション検索にはWITHIN演算子を、近接検索にはNEAR演算子を使用できます。さらに、STEM演算子、FUZZY演算子およびシソーラス演算子を使用して問合せ式を拡張できます。
CONTAINS,では、問合せテンプレート機能を使用してCTXCAT構文を使用できます。
次の各項では、Oracle Textの演算子について説明します。
7.1.1 ABOUT問合せ
英語またはフランス語での概念の問合せには、ABOUT演算子を使用します。通常、問合せ文字列は、検索する内容を表す概念またはテーマになります。Oracle Textでは、そのテーマを含むドキュメントを戻します。
ワード情報とテーマ情報は、単一の索引に結合されます。索引にテーマ問合せを入力するには、デフォルトでは英語およびフランス語で作成されるものを含める必要があります。
テーマ問合せは、問合せ式内でABOUT演算子を使用して入力します。たとえば、politicsに関するすべてのドキュメントを取り出すには、次のように問合せを記述します。
SELECT SCORE(1), title FROM news
WHERE CONTAINS(text, 'about(politics)', 1) > 0
ORDER BY SCORE(1) DESC;
7.1.2 論理演算子
様々な方法で検索基準を制限するには、論理演算子を使用します。表7-1では、論理演算子について説明します。
表7-1 論理演算子
| 演算子 | 記号 | 説明 | 式の例 |
|---|---|---|---|
|
|
& |
各問合せ語句が1つ以上出現するドキュメントを検索する場合に使用します。 オペランドの最小値がスコアとして戻ります。 |
'cats AND dogs' 'cats & dogs' |
|
|
| |
いずれかの問合せ語句が1つ以上出現するドキュメントを検索する場合に使用します。 オペランドの最大値がスコアとして戻ります。 |
'cats | dogs' 'cats OR dogs' |
|
|
~ |
1つの問合せ語句が含まれているが、もう1つの問合せ語句が含まれていないドキュメントを検索する場合に使用します。 |
たとえば、animalsという語句が含まれていて、dogsという語句は含まれていないドキュメントを取得するには、次の式を使用します。 'animals ~ dogs' |
|
|
, |
いずれかの問合せ語句が1つ以上出現するドキュメントを検索する場合に使用します。ACCUM演算子は、ドキュメントを語句の合計の重みによってランク付けします。 |
次の問合せは、dogs、cats,およびpuppies,という語句を含むすべてのドキュメントを検出し、3つの語句をすべて含むドキュメントに最も高いスコアを割り当てます。 'dogs, cats, puppies' |
|
|
= |
問合せ時に条件を満たすワードの置換を指定する場合に使用します。 |
次の例は、句alsatians are big dogsまたはGerman shepherds are big dogsのいずれかを含むすべてのドキュメントを検出します。 'German shepherds=alsatians are big dogs' |
7.1.3 セクション検索とHTMLおよびXML
7.1.4 NEAR、NEAR_ACCUMおよびNEAR2演算子による近接問合せ
NEAR演算子は、ドキュメント内で互いに近接している語句を検索する場合に使用します。
たとえば、dogがcatの6ワード以内にあるすべてのドキュメントを検索する場合は、次の問合せを入力します。
'near((dog, cat), 6)'
NEAR演算子が変更され、NESTED NEAR内の句間での距離の測定方法が変わりました。
NEAR_ACCUM演算子は、NEAR演算子の機能とACCUM演算子の機能を結合します。これは、NEAR,と同様に、互いに指定の範囲内に近接した語句を戻します。ただし、一方の語句が見つからなかった場合、見つかった方の語句が出現する頻度に従って、ドキュメントがランク付けされます。
NEAR2演算子には、PHRASE、NEAR、ANDの各演算子の機能が結合されています。また、NEAR2演算子では位置情報を使用してそのヒット数のスコアを上げることができます。つまり、1つのドキュメントの先頭で1つの句がヒットし、ドキュメントの終わりに別の句がヒットすると、最初のヒットに2つ目のヒットよりも高い重みが与えられます。
関連項目:
NEAR、NEAR_ACCUMおよびNEAR2演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照
7.1.5 FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算子
ワイルドカード、FUZZY、STEM、SOUNDEX、シソーラスなどの演算子を使用して、問合せを長いワード・リストに拡張します。
関連項目:
7.1.7 定義済のストアド・クエリー式
問合せの結果を保存せずに、問合せの定義を格納するには、CTX_QUERY.STORE_SQEプロシージャを使用します。
CONTAINSのSQL演算子によって、その問合せの定義を参照します。このようにして、ストアド・クエリー式を使用して、長いまたは頻繁に使用される問合せ式を定義できます。
ストアド・クエリー式は索引に連結されません。CTX_QUERY.STORE_SQE,をコールする場合、指定するのはストアド・クエリー式の名前と問合せ式のみです。
問合せの定義は、テキスト・データ・ディクショナリに格納されます。ストアド・クエリー式は、すべてのユーザーが参照できます。
関連トピック
7.1.7.2 SQEの例
次の例では、disasterというストアド・クエリー式を作成します。この式は、tornado、hurricaneまたはearthquakeのいずれかのワードを含むドキュメントを検索します。
begin
ctx_query.store_sqe('disaster', 'tornado | hurricane | earthquake');
end;
この問合せを1つの式で実行するには、次のように問合せを記述します。
SELECT SCORE(1), title from news WHERE CONTAINS(text, 'SQE(disaster)', 1) > 0 ORDER BY SCORE(1);
7.1.8 CONTAINSでのPL/SQLファンクションのコール
ユーザー定義ファンクションは、SQL文で指定されるための要件を満たしていれば、CONTAINS句内で直接コールできます。コール側には、そのファンクションに対するEXECUTE権限も必要です。
たとえば、frenchファンクションが英語のワードに相当するフランス語を戻した場合、次の問合せを記述して、catに相当するフランス語のワードを検索できます。
SELECT SCORE(1), title from news
WHERE CONTAINS(text, french('cat'), 1) > 0
ORDER BY SCORE(1);
7.1.9 応答時間短縮のための最適化
CONTAINS問合せを応答時間短縮のために最適化すると、ヒットリストの最もスコアの高いドキュメントが必要な場合に、高速なソリューションとなります。
次の例では、出力として最初の20個のヒットを戻します。この例では、FIRST_ROWS(n)ヒントとカーソルを使用します。
declare
cursor c is
select /*+ FIRST_ROWS(20) */ title, score(1) score
from news where contains(txt_col, 'dog', 1) > 0 order by score(1) desc;
begin
for c1 in c
loop
dbms_output.put_line(c1.score||':'||substr(c1.title,1,50));
exit when c%rowcount = 21;
end loop;
end;
/
また、問合せの応答時間に影響を与える要因として、次のものが考えられます。
-
表統計の収集
-
メモリー割当て
-
ソート
-
元表に存在するラージ・オブジェクト列
-
パーティション化
-
並列性
-
問合せで語句を拡張する回数
関連項目:
7.1.10 ヒット数のカウント
CONTAINS述語のみを含む問合せから戻されたヒット数をカウントするには、PL/SQLでCTX_QUERY.COUNT_HITSを使用するか、またはSQL SELECT文でCOUNT(*)を使用します。
おおまかなヒット件数が必要な場合は、CTX_QUERY.COUNT_HITSを予測モード(EXACTパラメータをFALSEに設定)で使用します。応答時間の点では、これが最も高速なカウント方法です。
構造化述語を含む問合せから戻されたヒット数をカウントするには、SELECT文でCOUNT(*)ファンクションを使用します。
ワードoracleを含むドキュメント数を検索するには、SQLのCOUNTファンクションによる問合せを入力します。
SELECT count(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0;
構造化述語による問合せで戻されるドキュメント数を検索するには、COUNT(*)を使用します。
SELECT COUNT(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0 and author = 'jones';
ワードoracleを含むドキュメント数を検索するには、COUNT_HITSを使用します。
declare count number;
begin
count := ctx_query.count_hits(index_name => my_index, text_query => 'oracle', exact => TRUE);
dbms_output.put_line('Number of docs with oracle:');
dbms_output.put_line(count);
end;
7.1.11 ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用
語句または句のスコアの計算方法を定義するには、DEFINESCORE演算子を使用します。DEFINEMERGE演算子では、AND演算子およびOR演算子の子要素のスコアのマージ方法を定義します。また、SDATAとともに代替スコアリング・テンプレートを使用して、ドキュメントの最終スコアリングに影響を与えることができます。
関連項目:
-
代替スコアリング・テンプレートの詳細は、「代替スコアリングおよびユーザー定義スコアリング」を参照してください
-
DEFINESCOREおよびDEFINEMERGEの構文についてさらに学習するには、『Oracle Textリファレンス』を参照してください。
7.2 CTXCAT構文
CTXCAT文法は、CATSEARCHのデフォルトの文法です。この文法は、句問合せの他に、ANDやORなどの論理操作もサポートしています。
CATSEARCHの問合せ演算子は、次の構文です。
表7-2 CATSEARCH問合せ演算子の構文
| 演算 | 構文 | 演算子の説明 |
|---|---|---|
|
論理積 |
a b c |
a、bおよびcを含む行を戻します。 |
|
論理 |
a | b | c |
a、bまたはcを含む行を戻します。 |
|
論理 |
a - b |
aを含み、bを含まない行を戻します。 |
|
空白なしのハイフン |
a-b |
通常の文字として処理されるハイフンです。 たとえば、ハイフンをskipjoinとして定義した場合、vice-presidentなどのワードは、単一の問合せ語句vicepresidentとして処理されます。 同様に、ハイフンをprintjoinとして定義した場合、vice-presidentなどのワードは、 |
|
" " |
"a b c" |
句"a b c"を含む行を戻します。 たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。 |
|
( ) |
(A B) | C |
カッコは演算をグループ化します。この問合せは、 |
CATSEARCH問合せでCONTEXT構文を使用するには、text_queryパラメータで問合せテンプレート指定を使用します。
CTXCAT索引で近接問合せ、シソーラス問合せまたはABOUT問合せを入力する必要がある場合に、CONTAINS文法を使用することがあります。