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
文法を使用することがあります。