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演算子およびNEAR2演算子による近接問合せ
NEAR
演算子は、ドキュメント内で互いに近接している語句を検索する場合に使用します。
たとえば、dogがcatの6ワード以内にあるすべてのドキュメントを検索する場合は、次の問合せを入力します。
'near((dog, cat), 6)'
NEAR
演算子が変更され、NESTED NEAR内の句間での距離の測定方法が変わりました。
NEAR2
演算子には、PHRASE
、NEAR
、AND
の各演算子の機能が結合されています。また、NEAR2
演算子では位置情報を使用してそのヒット数のスコアを上げることができます。つまり、1つのドキュメントの先頭で1つの句がヒットし、ドキュメントの終わりに別の句がヒットすると、最初のヒットに2つ目のヒットよりも高い重みが与えられます。
関連項目:
NEAR
および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リファレンス』を参照してください。