プライマリ・コンテンツに移動
Oracle® Textリファレンス
11gリリース2(11.2)
B61357-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracle TextのSQL文と演算子

この章では、Oracle Text索引の作成と管理およびOracle Text問合せの実行に使用する、SQL文とOracle Text演算子について説明します。

この章で説明する文は、次のとおりです。

ALTER INDEX


注意:

この項では、Oracle Textドメイン索引の管理に関連するALTER INDEX文について説明します。

ALTER INDEX文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


用途

ALTER INDEXを使用して、CONTEXTCTXCATまたはCTXRULE索引を変更するか、またはメンテナンス作業を実行します。

すべての索引タイプ

ALTER INDEXを使用すると、Oracle Textのすべての索引タイプで次のタスクを実行できます。

CONTEXTおよびCTXRULE索引タイプ

ALTER INDEXを使用すると、CONTEXTおよびCTXRULE索引タイプで次のタスクを実行できます。

  • 失敗した索引処理(作成/最適化)の再開。

  • セクションおよび停止セクションの索引の追加。

  • 索引メタデータの置換。


    関連項目:

    これらのタスクを実行する方法の詳細は、「ALTER INDEX REBUILD構文」を参照してください。

ALTER INDEX構文

ALTER INDEXの構文はかなり複雑です。次の各項では主要な部分について説明します。

  • ALTER INDEX MODIFY PARTITION構文: 索引パーティションのメタデータの変更に使用します。

  • ALTER INDEX PARAMETERS構文: 索引を再構築することなく、非パーティション索引のパラメータ、またはローカル・パーティション索引のすべてのパーティションを変更できます。

  • ALTER INDEX RENAME構文: 索引または索引パーティションの名前の変更に使用します。

  • ALTER INDEX REBUILD構文: 索引または索引パーティションの再構築に使用します。この文で、索引メタデータの置換、ストップワード、セクションおよび停止セクションの索引の追加、失敗した操作の再開も実行できます。

    ALTER INDEX REBUILDのパラメータには独自の構文があります。これは、ALTER INDEXの構文のサブセットです。たとえば、ALTER INDEX REBUILD PARAMETERS文で引数としてREPLACEまたはRESUMEのいずれかを取ることができ、ALTER INDEX REBUILD PARAMETERS ('REPLACE')で複数の引数から取ることができます。有効なALTER INDEX REBUILD文の例は次のとおりです。

    ALTER INDEX REBUILD PARALLEL n
    ALTER INDEX REBUILD PARAMETERS ('SYNC memsize')
    ALTER INDEX REBUILD PARAMETERS ('REPLACE DATASTORE datastore_pref')
    ALTER INDEX REBUILD PARAMETERS ('REPLACE WORDLIST wordlist_pref')
    

ALTER INDEX MODIFY PARTITION構文

次の構文は、索引パーティションのメタデータの変更に使用します。

ALTER INDEX index_name MODIFY PARTITION partition_name PARAMETER (paramstring)
index_name

パーティション・メタデータを変更する索引の名前を指定します。

partition_name

メタデータを変更する索引パーティションの名前を指定します。

paramstring

有効な引数はREPLACE METADATAのみです。これはALTER INDEX REBUILD PARTITION PARAMETERS ('REPLACE METADATA')と同じ構文を取ります。詳細は、「ALTER INDEX REBUILD構文」の「REPLACE METADATA」の項を参照してください。(2つの文は同等です。ALTER INDEX MODIFY PARTITIONの方が使用方法が簡単で、推奨されている構文です。)

ALTER INDEX PARAMETERS構文

非パーティション索引またはローカル・パーティション索引のパラメータを、索引の再構築を行わずに変更する場合に、次の構文を使用します。パーティション索引の場合、この文は(パーティション・レベルではなく)索引レベルで有効です。すべてのパーティションを含めて索引全体の情報を変更します。

ALTER INDEX index_name PARAMETERS (paramstring)
paramstring

ALTER INDEX PARAMETERSでは、paramstringに対して次の引数を使用します。

  • 'REPLACE METADATA'

    現在のメタデータを置換します。詳細は、「ALTER INDEX REBUILD構文」の「REPLACE METADATA」の項を参照してください。

  • 'ADD STOPWORD'

    索引にストップワードを動的に追加します。詳細は、「ALTER INDEX REBUILD構文」の「ADD STOPWORD」の項を参照してください。

  • 'ADD FIELD SECTION'

    索引にフィールド・セクションを動的に追加します。詳細は、「ALTER INDEX REBUILD構文」の「ADD FIELD」の項を参照してください。

  • 'ADD ZONE SECTION'

    索引にゾーン・セクションを動的に追加します。詳細は、「ALTER INDEX REBUILD構文」の「ADD ZONE」の項を参照してください。

  • 'ADD ATTR SECTION'

    索引に属性セクションを動的に追加します。詳細は、「ALTER INDEX REBUILD構文」の「ADD ATTR」の項を参照してください。

前述の各文は、ALTER INDEX REBUILD PARAMETERSバージョンと同等です。たとえば、ALTER INDEX PARAMETERS ('REPLACE METADATA')は、ALTER INDEX REBUILD PARAMETERS ('REPLACE METADATA')と同等です。ただし、ALTER INDEX PARAMETERSバージョンがパーティション索引または非パーティション索引のいずれかに機能するのに対し、ALTER INDEX REBUILD PARAMETERSは非パーティション索引にのみ機能します。

ALTER INDEX RENAME構文

次の構文は、索引または索引パーティションの名前変更に使用します。

ALTER INDEX [schema.]index_name RENAME TO new_index_name;  

ALTER INDEX [schema.]index_name RENAME PARTITION part_name TO new_part_name;
[schema.]index_name

名前変更する索引名を指定します。

new_index_name

schema.indexの新しい名前を指定します。new_index_nameパラメータは25バイト以内で設定し、パーティション索引は21バイト以内にします。26バイト以上の名前(またはパーティション索引に22バイト以上)を指定するとエラーが戻され、名前変更した索引は無効になります。


注意:

new_index_nameが26バイト以上(ローカル・パーティション索引が22バイト以上)で30バイト未満の場合は、システムによりエラーが戻されても、索引の名前が変更されます。索引およびそれに関連する表を削除するには、DROP INDEX文でnew_index_nameを削除した後、index_nameを再作成し、削除してください。

part_name

名前変更する索引パーティション名を指定します。

new_part_name

パーティションに新しい名前を指定します。

ALTER INDEX REBUILD構文

ALTER INDEX REBUILDを使用して、索引および索引パーティションの再構築、失敗した操作の再開、索引メタデータの置換、ストップワード、セクションおよび停止セクションの索引の追加を実行します。

ALTER INDEX REBUILDには独自の副構文があります。つまり、構文のパラメータが独自の構文を備えています。たとえば、ALTER INDEX REBUILD PARAMETERS文で引数としてREPLACEまたはRESUMEのいずれかを取ることができ、ALTER INDEX REBUILD PARAMETERS ('REPLACE')で複数の引数から取ることができます。

有効なALTER INDEX REBUILD文の例は次のとおりです。

ALTER INDEX REBUILD PARALLEL n
ALTER INDEX REBUILD PARAMETERS (SYNC memsize)
ALTER INDEX REBUILD PARAMETERS (REPLACE DATASTORE datastore_pref)
ALTER INDEX REBUILD PARAMETERS (REPLACE WORDLIST wordlist_pref)

ALTER INDEX REBUILDの構文は次のとおりです。

ALTER INDEX [schema.]index [REBUILD] [PARTITION partname] [ONLINE] [PARAMETERS
(paramstring)][PARALLEL N];
PARTITION partname

索引パーティションpartnameを再構築します。一度に構築できる索引パーティションは1つのみです。

パーティションの再構築時にparamstringに指定できるのは、RESUMEまたはREPLACEのみです。この操作は、指定したpartnameに対してのみ実行されます。

REPLACE操作で指定できるのは、各索引パーティションに対するMEMORYSTORAGEのみです。

パーティションの追加: 元表にパーティションを追加するには、SQLのALTER TABLE文を使用します。索引表にパーティションを追加すると、新しい索引パーティションのメタデータが自動的に作成されます。新しい索引パーティションの名前と新しい表パーティションの名前は同じです。索引パーティション名は、ALTER INDEX RENAMEで変更します。

パーティションの分割とマージ: ALTER TABLEによって表パーティションを分割またはマージすると、その索引パーティションは無効になります。したがって、ALTER INDEX REBUILDを使用してその索引パーティションを再構築する必要があります。

[ONLINE]

元表での更新、挿入および削除を続行できます。元表を問い合せることはできません。


注意:

索引または索引パーティションをONLINEで再構築する場合は、REPLACEまたはRESUMEを指定できます。

PARAMETERS(paramstring)

オプションでparamstringを指定します。paramstringを指定しない場合、既存のプリファレンス設定で索引が再構築されます。

paramstringの構文は、次のとおりです。

paramstring = 
'REPLACE 
     [DATASTORE datastore_pref] 
     [FILTER filter_pref] 
     [LEXER lexer_pref] 
     [WORDLIST wordlist_pref] 
     [STORAGE storage_pref] 
     [STOPLIST stoplist] 
     [SECTION GROUP section_group]
     [MEMORY memsize
     [[POPULATE | NOPOPULATE]
     [INDEX SET index_set]
 
     [METADATA preference new_preference]
     [METADATA FORMAT COLUMN format_column_name]
     [[METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
     [[METADATA] TRANSACTIONAL|NONTRANSACTIONAL

| RESUME [memory memsize]
| OPTIMIZE [token index_token | fast | full [maxtime (time | unlimited)]
| SYNC [memory memsize]
| ADD STOPWORD word [language language]
| ADD ZONE SECTION section_name tag tag
| ADD FIELD SECTION section_name tag tag [(VISIBLE | INVISIBLE)]
| ADD ATTR SECTION section_name tag tag@attr
| ADD STOP SECTION tag'
REPLACE [optional_preference_list]

索引を再構築します。オプションで、ユーザー独自またはシステム定義のプリファレンスを指定できます。

置換できるプリファレンスは、その索引タイプのサポート対象となっているプリファレンスのみです。たとえば、CONTEXT索引またはCTXRULE索引の場合、索引セットは置換できません。同様に、CTXCAT索引タイプの場合は、レクサー、ワードリスト、記憶域索引セットおよびメモリー・プリファレンスを置換できます。

POPULATEパラメータはデフォルトであり、指定する必要はありません。その内容の索引を空にする場合は、NOPOPULATEを指定します。索引を追加的に再構築する必要がある場合は、その内容の索引を消去します。NOPOPULATEは、索引の特定のパーティションに対して指定でき、索引全体に対しては指定できません。

REPLACEパラメータを使用してパーティション索引を再構築している場合は、STORAGEMEMORYおよびNOPOPULATEのみ指定できます。


関連項目:

システム定義のプリファレンスの詳細、およびプリファレンスの作成と設定の詳細は、第2章「Oracle Text索引付けの要素」を参照してください。

REPLACE METADATA preference new_preference

SYNCパラメータを含む、索引の既存のpreferenceクラス設定を、new_preferenceの設定に置換します。索引プリファレンスおよび属性のみが置換されます。索引は再構築されません。

この文は、索引の構築後に、すべてのデータを再索引付けせずに、プリファレンスおよび属性設定を置換する場合に便利です。データの再索引付けは、非常に時間がかかり、コンピューティング資源を消費します。

この文は、SYNCのタイプ(AUTOMATIC、MANUALまたはON-COMMIT)を変更する場合にも便利です。

ALTER INDEX REBUILD PARAMETER ('REPLACE METADATA')文は、索引のグローバル・レベルのローカル・パーティション索引には機能しません。たとえば、索引を再構築せずにフィルタまたはレクサー型などのグローバル・プリファレンスを変更する場合は、この構文を使用できません。かわりにALTER INDEX PARAMETERSを使用し、すべてのパーティションを含む、グローバル・レベルで索引のメタデータを変更します。「ALTER INDEX PARAMETERS構文」を参照してください。

METADATAキーワードを使用する必要がある場合REPLACE METADATAは、索引メタデータを変更しても、索引の一貫性が失われない場合のみ使用する必要があります。一貫性のない索引では、問合せ結果が不適切になる可能性があります。

たとえば、次の場合にこの文を使用します。

これらの変更は安全で、索引の一貫性が失われることはありません。一貫性のない索引は、問合せ結果に悪影響を及ぼすことがあります。


注意:

REPLACE METADATA文を使用すると、索引データの一貫性が失われることがあります。これにより、問合せ結果が不適切になる可能性があります。したがって、索引データおよびその後の問合せの一貫性に与える影響を慎重に検討した場合を除いて、この文を使用することはお薦めできません。


メタデータの変更により、索引データの一貫性が失われる場合には、様々な例があります。たとえば、次の処理を行った後にMETADATAキーワードを使用しないことをお薦めします。

  • USER_DATASTOREプロシージャを、出力が異なる新規のPL/SQLストアド・プロシージャに変更した場合。

  • 既存のドキュメントに対してプリフィックスが生成されていないため、BASIC_WORDLIST属性PREFIX_INDEXNOからYESに変更した場合。YESからNOへの変更は安全です。

  • printjoinおよびskipjoin文字を使用した新規の問合せが、索引付け時にこれらの文字がレクサー処理されたのと異なる方法でレクサー処理されたため、BASIC_LEXER printjoinおよびskipjoin文字を追加または変更した場合。

このように危険な場合は、索引を再構築することをお薦めします。

REPLACE [METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)

元表に対するDML変更が発生した場合は、CONTEXT索引の自動同期化を行うためにSYNCを指定します。表1-1に示すSYNCメソッドのいずれかを指定できます。

表1-1 ALTER INDEXのSYNCメソッド

SYNCタイプ 説明

MANUAL

自動同期化は行われません。これはデフォルトです。CTX_DDL.SYNC_INDEXを使用して、索引を手動で同期化する必要があります。

ON COMMITおよびEVERY同期化を無効にするには、MANUALを使用します。

EVERY interval-string

スケジューラ・ジョブの場合と同じ構文をとるinterval-stringの値で指定された一定の間隔で、索引を自動的に同期化します。EVERYを使用した自動同期化の場合、索引作成者にCREATE JOB権限が必要です。

interval-stringが、前の同期化ジョブを完了できる十分な長さの期間に設定されていることを確認してください。長さが十分でないと、同期化ジョブがハングする可能性があります。interval-string引数は、二重引用符('' '')で囲む必要があります。

自動同期化構文の例は、「自動索引同期化の有効化」を参照してください。

ON COMMIT

コミットの直後に索引を同期化します。コミットは、同期化が完了するまで戻りません。(同期化は個別のトランザクションとして実行されるため、データがコミットされて索引変更がコミットされない場合でも、ある程度の時間(通常は短い)がかかります。)

この操作は、memoryパラメータで指定されたメモリーを使用します。

同期化操作には、独自のトランザクション・コンテキストがあります。この操作が失敗しても、データ・トランザクションはコミットされます。CTX_USER_INDEX_ERRORSビューに、索引同期化エラーが記録されます。CREATE INDEX「索引エラーの表示」を参照してください。

ON COMMIT構文の例は、「自動索引同期化の有効化」を参照してください。


ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(ON COMMITEVERYまたはMANUAL)が設定されます。マスター・パラメータ文字列に指定されたSYNCのタイプは、パーティションが独自のタイプを指定した場合を除いて、すべての索引パーティションに適用されます。

自動(EVERY)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。構文は次のとおりです。

... EVERY interval_string MEMORY mem_size PARALLEL paradegree ...

ON COMMIT同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズで実行されます。


注意:

このコマンドは、索引を再構築します。索引を再構築せずにSYNC設定を変更する場合は、REBUILD REPLACE METADATA SYNC (MANUAL | ON COMMIT)操作を使用します。

REPLACE [METADATA] TRANSACTIONAL | NONTRANSACTIONAL

このパラメータを使用すると、TRANSACTIONALプロパティをオンまたはオフにできます。詳細は、「TRANSACTIONAL」を参照してください。

DML保留キューに行がない場合のみ、このパラメータの使用は成功します。したがって、このコマンドを発行する前に索引を同期化する必要があります。

TRANSACTIONAL索引プロパティをオンにする手順は、次のとおりです。

ALTER INDEX myidx REBUILD PARAMETERS('replace metadata transactional');

または

ALTER INDEX myidx REBUILD PARAMETERS('replace  transactional');

TRANSACTIONAL索引プロパティをオフにする手順は、次のとおりです。

ALTER INDEX myidx REBUILD PARAMETERS('replace metadata nontransactional');

または

ALTER INDEX myidx REBUILD PARAMETERS('replace  nontransactional');
RESUME [MEMORY memsize]

失敗した索引操作を再開します。オプションで、使用するメモリー量をmemsizeで指定できます。


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。

OPTIMIZE [token index_token | fast | full [maxtime (time │ unlimited)]

注意:

このALTER INDEX操作は、将来のリリースではサポートされません。

索引を最適化するには、CTX_DDL.OPTIMIZE_INDEXを使用してください。


索引を最適化します。token(トークン)、fast(高速)またはfull(完全)の最適化を指定します。通常は、索引を同期化した後で最適化を行います。

tokenモードで最適化を行うと、index_tokenのみが最適化されます。この最適化方法を使用すると、特定ワードの索引情報が迅速に最適化されます。

fastモードで最適化を行うと、索引全体が最適化され、断片化した行が圧縮されます。ただし、fastモードでは、古いデータは削除されません。

fullモードで最適化を行うと、索引全体または索引の一部を最適化できます。この方法では行が圧縮され、古いデータ(削除済の行)が削除されます。


注意:

fullモードでの最適化は、削除済ドキュメントの行が存在しない場合でも実行されます。この方法は、maxtimeパラメータで制限時間が設定されているバッチの最適化が必要な場合に便利です。

maxtimeパラメータを使用して、最適化操作に費やす時間を分単位で指定します。最適化は、実行された場所から始まり、操作が完了するまで、または制限時間に達するまでのいずれか早い方までに行われます。制限時間を指定すると、索引最適化を自動化し、定期的に指定した時間、索引を最適化するように設定できます。

maxtime unlimitedを指定すると、索引全体が最適化されます。これはデフォルトです。maxtimeを0(ゼロ)に指定すると、最小限の最適化が行われます。

定期的な進行状況をCTX_OUTPUTログに書き込むことで、最適化の進行状況を記録できます。CTX_OUTPUT.ADD_EVENTのイベントはCTX_OUTPUT.EVENT_OPT_PRINT_TOKENと呼ばれ、最適化されている各トークンを出力します。


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。

SYNC [MEMORY memsize]

注意:

このALTER INDEX操作は、将来のリリースではサポートされません。

索引を同期化するには、CTX_DDL.SYNC_INDEXを使用してください。


索引を同期化します。オプションで、使用するランタイム・メモリー量をmemsizeで指定できます。元表でDML操作を実行すると索引が同期化されます。


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。

メモリーに関する考慮点 memoryパラメータmemsizeは、ALTER INDEX操作に使用するメモリー量を指定します。この量を超えると索引がディスクにフラッシュされます。メモリー容量に大きい値を指定すると、I/Oが減少するため索引付けパフォーマンスが向上します。また、フラグメンテーションも減少するため、問合せパフォーマンスおよびメンテナンスも向上します。

小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、索引付けの処理過程を追跡する場合、またはランタイム・メモリーが不足している場合に有効なことがあります。

ADD STOPWORD word [language language]

索引にストップワードのwordを動的に追加します。

この操作の前に存在したwordの索引エントリは、削除されません。ただし、wordに対する後続の問合せは、常にストップワードであるかのように処理されます。

使用しているストップリストがマルチ言語のストップリストの場合は、languageを指定する必要があります。

この文によって索引が再構築されることはありません

ADD ZONE SECTION section_name tag tag

tagで識別されるゾーン・セクションsection_nameを、既存の索引に動的に追加します。

追加されたセクションsection_nameは、この操作の後に索引付けされるドキュメントのみに適用されます。変更を有効にするためには、このタグを含むすべての既存のドキュメントを、手動で再索引付けする必要があります。

この文によって索引が再構築されることはありません


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。


関連項目:

「注意」

ADD FIELD SECTION section_name tag tag [(VISIBLE | INVISIBLE)]

tagで識別されるフィールド・セクションsection_nameを、既存の索引に動的に追加します。

オプションでVISIBLEを指定すると、フィールド・セクションを参照できます。デフォルトはINVISIBLEです。


関連項目:

参照できるフィールド・セクションおよび表示されないフィールド・セクションの詳細は、「CTX_DDL.ADD_FIELD_SECTION」を参照してください。

追加されたセクションsection_nameは、この操作の後に索引付けされるドキュメントのみに適用されます。すでに索引付けされているドキュメントに対してこの変更を有効にするためには、このタグを含むすべてのドキュメントを、明示的に再索引付けする必要があります。

この文によって索引が再構築されることはありません。


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。


関連項目:

「注意」

ADD ATTR SECTION section_name tag tag@attr

属性セクションsection_nameを、既存の索引に動的に追加します。XMLタグおよび属性を、tag@attrという形式で指定する必要があります。属性セクションは、XMLセクション・グループにのみ追加できます。

追加された属性セクションsection_nameは、この操作の後に索引付けされるドキュメントのみに適用されます。変更を有効にするためには、このタグを含むすべての既存のドキュメントを、手動で再索引付けする必要があります。

この文によって索引が再構築されることはありません


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引とCTXRULE索引のみです。CTXCAT索引には適用されません。


関連項目:

「注意」

ADD STOP SECTION tag

tagで識別される停止セクションを、既存の索引に動的に追加します。停止セクションはXMLドキュメントの自動セクション処理のみに適用されるため、索引にはAUTO_SECTION_GROUPセクション・グループを使用する必要があります。定するタグは、自動セクション・グループ内で一意で、大/小文字を区別する必要があります。これに従わない場合、ALTER INDEXはエラーを戻します。

追加された停止セクションtagは、この操作の後に索引付けされるドキュメントのみに適用されます。すでに索引付けされているドキュメントに対してこの変更を有効にするためには、このタグを含むすべてのドキュメントを、明示的に再索引付けする必要があります。

停止セクション内のテキストは常に検索可能です。

追加できる停止セクションの数は無制限です。

この文によって索引が再構築されることはありません


関連項目:

「注意」


注意:

このALTER INDEX操作が適用されるのは、CONTEXT索引のみです。CTXCAT索引には適用されません。

PARALLEL n

nを使用すると、パラレル索引付けに対する並列度をオプションで指定できます。このパラメータがサポートされるのは、SYNCREPLACEおよびRESUMEparamstringに使用した場合のみです。実際の並列度は、リソースによっては多少低くなります。

パラレル索引付けによって、索引付けするデータが大量にある場合およびオペレーティング・システムが複数のCPUをサポートしている場合は、索引付けを高速化できます。

ALTER INDEXの例

失敗した索引付けの再開

次の文は、2MBのメモリーでnewsindexの索引付け操作を再開します。

ALTER INDEX newsindex REBUILD PARAMETERS('resume memory 2M');

索引の再構築

次の文は、索引を再構築し、ストップリスト・プリファレンスをnew_stopで置換します。

ALTER INDEX newsindex REBUILD PARAMETERS('replace stoplist new_stop');

パーティション索引の再構築

次の例では、パーティション化されたテキスト表を作成し、それを移入してパーティション索引を作成します。次に、その表に新しいパーティションを追加し、次のようにALTER INDEXを使用して索引を再構築します。

PROMPT create partitioned table and populate it

create table part_tab (a int, b varchar2(40)) partition by range(a)
(partition p_tab1 values less than (10),
 partition p_tab2 values less than (20),
 partition p_tab3 values less than (30));

insert into part_tab values (1,'Actinidia deliciosa');
insert into part_tab values (8,'Distictis buccinatoria');
insert into part_tab values (12,'Actinidia quinata');
insert into part_tab values (18,'Distictis Rivers');
insert into part_tab values (21,'pandorea jasminoides Lady Di');
insert into part_tab values (28,'pandorea rosea');

commit;

PROMPT create partitioned index
create index part_idx on part_tab(b) indextype is ctxsys.context
local (partition p_idx1, partition p_idx2, partition p_idx3);
PROMPT add a partition and populate it
alter table part_tab add partition p_tab4 values less than (40);
insert into part_tab values (32, 'passiflora citrina');
insert into part_tab values (33, 'passiflora alatocaerulea');
commit;

次の文は、新しく移入されたパーティションに索引を再構築します。通常、新しく追加されたパーティションの索引パーティション名は、その名前がすでに使用済でないかぎり、表パーティションの名前と同じになります。使用済の場合は、新しい名前が生成されます。

alter index part_idx rebuild partition p_tab4;

次の文は、表を問い合せ、新しく追加されたパーティション内の2つのヒットを取り出します。

select * from part_tab where contains(b,'passiflora') >0;

次の文は、新しく追加されたパーティションに直接問い合せます。

select * from part_tab partition (p_tab4) where contains(b,'passiflora') >;

索引メタデータの置換: 単一レクサーからマルチレクサーへの変更

次の例は、レクサーの索引メタデータを置換することで、アプリケーションが単一言語のドキュメント(英語)からマルチ言語のドキュメント(英語およびスペイン語)に移行する方法を示しています。

REM creates a simple table, which stores only English (American) text

create table simple (text varchar2(80));
insert into simple values ('the quick brown fox');
commit;

REM create a simple lexer to lex this English text

begin
  ctx_ddl.create_preference('us_lexer','basic_lexer');
end;
/

REM create a text index on the simple table
create index simple_idx on simple(text)
indextype is ctxsys.context parameters ('lexer us_lexer');

REM we can query easily
select * from simple where contains(text, 'fox')>0;

REM now suppose we want to start accepting Spanish documents.
REM first we have to extend the table with a language column
alter table simple add (lang varchar2(10) default 'us');

REM now let's create a Spanish lexer, 
begin
  ctx_ddl.create_preference('e_lexer','basic_lexer');
  ctx_ddl.set_attribute('e_lexer','base_letter','yes');
end;
/
REM Then create a multilexer incorporating our English and Spanish lexers.
REM Note that the DEFAULT lexer is the exact same lexer, with which we have
REM have already indexed all the documents.
begin
  ctx_ddl.create_preference('m_lexer','multi_lexer');
  ctx_ddl.add_sub_lexer('m_lexer','default','us_lexer');
  ctx_ddl.add_sub_lexer('m_lexer','spanish','e_lexer');
end;
/
REM next replace our metadata
alter index simple_idx rebuild
parameters ('replace metadata language column lang lexer m_lexer');

REM We are ready for some Spanish data.  Note that we could have inserted
REM this BEFORE the alter index, as long as we did not SYNC.
insert into simple values ('el zorro marrón rápido', 'e');
commit;
exec ctx_ddl.sync_index('simple_idx');
REM now query the Spanish data with base lettering:
select * from simple where contains(text, 'rapido')>0;

索引の最適化

索引を最適化するには、CTX_DDL.OPTIMIZE_INDEXを使用してください。

索引の同期化

索引を同期化するには、CTX_DDL.SYNC_INDEXを使用してください。

ゾーン・セクションの追加

タグ<author>で識別されるゾーン・セクションauthorを索引に追加するには、次の文を入力します。

ALTER INDEX myindex REBUILD PARAMETERS('add zone section author tag author');

停止セクションの追加

タグ<fluff>で識別される停止セクションを、AUTO_SECTION_GROUPを使用する索引に追加するには、次の文を入力します。

ALTER INDEX myindex REBUILD PARAMETERS('add stop section fluff');

属性セクションの追加

次のテキストがXMLドキュメントで使用されているとします。

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

タイトル属性ごとに別のセクションを作成し、その新しい属性セクションにbooktitleという名前を付けるとします。そのためには、次の文を入力します。

ALTER INDEX myindex REBUILD PARAMETERS('add attr section booktitle tag
title@book');

フラッシュバック問合せの使用

テキスト問合せのフラッシュバックが、問合せ対象のテキスト索引に対するALTER INDEX文の発行よりも前の時点になる場合は、次のように処理されます。

  • 問合せオプティマイザでは、指定した索引の索引アクセス・パスは選択されません。これは、索引がALTER INDEXによる索引作成時間を基準に処理されるためです。この結果、問合せオプティマイザでは、索引は存在していないとみなされます。

  • ALTER INDEX文にDR$索引表の再作成が含まれている場合、テキスト演算子の機能処理は、ORA-01466またはORA-08176エラーで失敗します。

この問題を回避するには、DBMS_FLASHBACKパッケージを使用します。次に例を示します。

EXEC dbms_flashback.enable_at_system_change_number(:scn);
SELECT id from documents WHERE CONTAINS(text, 'oracle')>0;
EXEC dbms_flashback.disable;

注意:

以前のリリースでは、AS OF述語をCONTAINSCATSEARCHなどのテキスト演算子とともに使用したフラッシュバック・テキスト問合せはサポートされていません。


関連項目:

『Oracle Database開発ガイド』の「DBMS_FLASHBACKパッケージの使用」を参照してください

注意

セクション追加時の制約

Oracle Textでは、索引セクション情報を変更する前に、すべての妥当性制約が満たされていることを確認するために、新しいセクションが既存のセクションに対してチェックされます。PL/SQLパッケージCTX_DDLを使用してセクションをセクション・グループに追加するときにも同じ制約が適用されます。制約は次のとおりです。

  • ゾーン、フィールドまたは停止セクションをNULL_SECTION_GROUPに追加することはできません。

  • ゾーン、フィールドまたは属性セクションを自動セクション・グループに追加することはできません。

  • 属性セクションをXMLセクション・グループ以外に追加することはできません。

  • 2つの異なるセクションに同じタグを含めることはできません。

  • ゾーン、フィールドおよび属性セクションのセクション名に、同じ名前を付けることはできません。

  • セクションごとのフィールドの数は、64を超えることはできません。

  • 停止セクションを基本、HTML、XMLまたは新しいセクション・グループに追加することはできません。

  • SENTENCEおよびPARAGRAPHは、予約セクション名です。

ALTER TABLE: サポートされるパーティション化文


注意:

この項では、CONTEXTドメイン索引を持つパーティション化されたテキスト表の追加と変更に関連するALTER TABLE文について説明します。

ALTER TABLE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


用途

ALTER TABLE文を使用して、CONTEXTドメイン索引を持つパーティション化されたテキスト表を追加、変更、分割、マージ、交換または削除します。次の項では、ALTER TABLE操作をいくつか説明します。

MODIFY PARTITION構文

UNUSABLE LOCAL INDEXES

ALTER TABLE  [schema.]table MODIFY PARTITION partition UNUSABLE LOCAL INDEXES

指定した表パーティションに対応する索引パーティションにUNUSABLEのマークを付けます。「UNUSABLEのローカル索引の再構築」で説明するように、索引パーティションを再構築する前に、索引パーティションにUNUSABLEのマークを付けることができます。

索引パーティションにUNUSABLEのマークが付いていない場合、実際にはローカル索引パーティションの再構築を行わずに戻ります。

UNUSABLEのローカル索引の再構築

ALTER TABLE  [schema.]table MODIFY PARTITION partition REBUILD UNUSABLE LOCAL
INDEXES

指定したUNUSABLEステータスの表パーティションに対応する索引パーティションを再構築します。


注意:

索引パーティションのステータスが、この文の入力前にすでにVALIDになっている場合、その索引パーティションは再構築されません。この文は、ステータスがUNUSABLEでない索引パーティションの再構築には使用できません。

ADD PARTITION構文

ALTER TABLE [schema.]table ADD PARTITION [partition] 
VALUES LESS THAN (value_list) [partition_description]

新しいパーティションをレンジ・パーティション化表の最後に追加します。

表の先頭または中間にパーティションを追加する場合は、ALTER TABLE SPLIT PARTITION文を使用します。

新しく追加された表パーティションは常に空で、このパーティションのCONTEXTドメイン索引(ある場合)のステータスは、常にVALIDになります。DMLの発行後に、新しく追加された索引パーティションを同期化または最適化する場合は、索引パーティション名を検索して、ALTER INDEX REBUILD PARTITION文を入力する必要があります。通常、新しく追加されたパーティションの索引パーティション名は、表パーティション名と同じになります。ただし、その表パーティション名がすでに別の索引パーティションの名前に使用されている場合は、SYS_Pnの形式で名前が割り当てられます。

USER_IND_PARTITIONSビューを問い合せてHIGH_VALUEフィールドを照合することで、新しく追加されたパーティションの索引パーティション名を確認できます。

MERGE PARTITION構文

ALTER TABLE [schema.]table 
MERGE PARTITIONS partition1, partition2 
[INTO PARTITION [new_partition] [partition_description]]
[UPDATE GLOBAL INDEXES]

レンジ・パーティションのみに適用されます。この文は、隣接する2つのパーティションの内容を新しいパーティションにマージした後、元の2つのパーティションを削除します。生成されたパーティションが空でない場合は、対応するローカル・ドメイン索引パーティションにUNUSABLEのマークが付けられます。ALTER TABLE MODIFY PARTITIONを使用して、パーティション索引を再構築できます。

グローバル非パーティション索引の場合、UPDATE GLOBAL INDEXES句を使用せずにマージ操作を実行すると、作成される索引(NULL以外の場合)は無効になり、再構築が必要です。操作の終了後にUPDATE GLOBAL INDEXES句を指定し、SYNCタイプがMANUALの場合、索引は有効になりますが、索引をCTX_DDL.SYNC_INDEXで同期化して、更新を有効にする必要があります。

生成された索引パーティションのネーミング規則は、ALTER TABLE ADD PARTITION文のネーミング規則と同じです。

SPLIT PARTITION構文

ALTER TABLE [schema.]table
SPLIT PARTITION partition_name_old 
AT (value_list)
[into (partition_description, partition_description)]
[prallel_clause]
[UPDATE GLOBAL INDEXES]

レンジ・パーティションのみに適用されます。この文は、1つの表パーティションを2つのパーティションに分割することによって、新しいパーティションを表に追加します。対応する表パーティションが空でない場合は、対応するローカル索引パーティションにUNUSABLEのマークが付けられます。ALTER TABLE MODIFY PARTITION文を使用して、パーティション索引を再構築します。

グローバル非パーティション索引の場合、UPDATE GLOBAL INDEXES句を使用せずに分割操作を実行すると、作成される索引(NULL以外の場合)は無効になり、再構築が必要です。操作の終了後にUPDATE GLOBAL INDEXES句を指定し、SYNCタイプがMANUALの場合、索引は有効になりますが、索引をCTX_DDL.SYNC_INDEXで同期化して、更新を有効にする必要があります。

生成された2つの索引パーティションのネーミング規則は、ALTER TABLE ADD PARTITION文のネーミング規則と同じです。

EXCHANGE PARTITION構文

ALTER TABLE [schema.]table EXCHANGE PARTITION partition WITH TABLE table
[INCLUDING|EXCLUDING INDEXES}
[WITH|WITHOUT VALIDATION]
[EXCEPTIONS INTO [schema.]table]
[UPDATE GLOBAL INDEXES]

それぞれのデータ・セグメントを交換することによって、パーティションを非パーティション表に、および表をパーティション表のパーティションに変換します。ROWIDは保持されます。

EXCLUDING INDEXESが指定されている場合は、パーティションに対応するすべてのCONTEXT索引と、交換された表のすべての索引にUNUSABLEのマークが付けられます。新しい索引パーティションの再構築には、ALTER TABLE MODIFY PARTITION文を発行します。

INCLUDING INDEXESが指定されている場合は、パーティション表の各ローカル・ドメイン索引に対して、非パーティション表の非パーティション・ドメイン索引が存在している必要があります。ローカル索引パーティションは、対応する通常の索引と交換されます。

グローバル非パーティション索引の場合、UPDATE GLOBAL INDEXES句を使用せずに交換操作を実行すると、作成される索引(NULL以外の場合)は無効になり、再構築が必要です。操作の終了後にUPDATE GLOBAL INDEXES句を指定し、SYNCタイプがMANUALの場合、索引は有効になりますが、索引をCTX_DDL.SYNC_INDEXで同期化して、更新を有効にする必要があります。

フィールド・セクション

非パーティション索引とローカル索引で、同じフィールド・セクションに対して異なるセクションIDが使用されている場合、フィールド・セクション問合せは同じように機能しません。

記憶域

記憶域は変更されません。したがって、非パーティション表の$I表の索引が表領域XYZに存在していた場合、その索引はEXCHANGE PARTITIONの実行後も表領域XYZに存在しますが、今度は索引パーティションに対する$I表になります。

記憶域プリファレンスの切替えはありません。このため、切り替えた後で索引を再構築しても、異なる場所に表が作成されます。

制限事項

両方の索引が等価であることが必要です。索引に同じオブジェクトが使用され、各オブジェクトに同一の設定が使用されている必要があります。Oracle Textでチェックされるのは索引での同一のオブジェクトの使用のみであることに注意してください。実際は、使用されるものがすべて厳密に同じである必要があります。

ユーザーが$I表または$N表のパーティション化に記憶域オブジェクトを使用した場合、索引オブジェクトはパーティション化できません。

索引または索引パーティションが、これらいずれかの制限事項に違反している場合はすべてエラーが発生し、その索引および索引パーティションはINVALIDになります。ALTER INDEX REBUILD文を使用して、索引と索引パーティションをそれぞれ手動で再構築する必要があります。

TRUNCATE PARTITION構文

ALTER TABLE [schema.]table TRUNCATE PARTITION [DROP|REUSE STORAGE] [UPDATE GLOBAL
INDEXES]

表内のパーティションからすべての行を削除します。対応するCONTEXT索引パーティションも削除されます。

グローバル非パーティション索引の場合、UPDATE GLOBAL INDEXES句を使用せずに切捨て操作を実行すると、作成される索引(NULL以外の場合)は無効になり、再構築が必要です。操作の終了後にUPDATE GLOBAL INDEXES句を指定すると、索引が有効になります。

ALTER TABLEの例

パーティション表のグローバル索引の例

次の例では、3つのパーティションを持つレンジ・パーティション表を作成します。各パーティションには2つの行が移入されます。その後、グローバル非パーティションCONTEXT索引が作成されます。UPDATE GLOBAL INDEXES句を示すために、索引同期化によってパーティションが分割およびマージされます。

create table tdrexglb_part(a int, b varchar2(40)) partition by range(a)
(partition p1 values less than (10),
 partition p2 values less than (20),
 partition p3 values less than (30));

insert into tdrexglb_part values (1,'row1');
insert into tdrexglb_part values (8,'row2');
insert into tdrexglb_part values (11,'row11');
insert into tdrexglb_part values (18,'row18');
insert into tdrexglb_part values (21,'row21');
insert into tdrexglb_part values (28,'row28');

commit;
create index tdrexglb_parti on tdrexglb_part(b) indextype is ctxsys.context;

create table tdrexglb(a int, b varchar2(40));

insert into tdrexglb values(20,'newrow20');
commit;


PROMPT make sure query works
select * from tdrexglb_part where contains(b,'row18') >0;

PROMPT split partition
alter table tdrexglb_part split partition p2 at (15) into
(partition p21, partition p22) update global indexes;

PROMPT before sync
select * from tdrexglb_part where contains(b,'row11') >0;
select * from tdrexglb_part where contains(b,'row18') >0;

exec ctx_ddl.sync_index('tdrexglb_parti')

PROMPT after sync
select * from tdrexglb_part where contains(b,'row11') >0;
select * from tdrexglb_part where contains(b,'row18') >0;

PROMPT merge partition
alter table tdrexglb_part merge partitions p22, p3 
into partition pnew3 update global indexes;

PROMPT before sync
select * from tdrexglb_part where contains(b,'row18') >0;
select * from tdrexglb_part where contains(b,'row28') >0;
exec ctx_ddl.sync_index('tdrexglb_parti');

PROMPT after sync
select * from tdrexglb_part where contains(b,'row18') >0;
select * from tdrexglb_part where contains(b,'row28') >0;

PROMPT drop partition 
alter table tdrexglb_part drop partition p1 update global indexes;

PROMPT before sync
select * from tdrexglb_part where contains(b,'row1') >0;
exec ctx_ddl.sync_index('tdrexglb_parti');

PROMPT after sync
select * from tdrexglb_part where contains(b,'row1') >0;

PROMPT exchange partition
alter table tdrexglb_part exchange partition pnew3 with table
tdrexglb update global indexes;

PROMPT before sync
select * from tdrexglb_part where contains(b,'newrow20') >0;
select * from tdrexglb_part where contains(b,'row28') >0;

exec ctx_ddl.sync_index('tdrexglb_parti');
PROMPT after sync
select * from tdrexglb_part where contains(b,'newrow20') >0;
select * from tdrexglb_part where contains(b,'row28') >0;

PROMPT move table partition
alter table tdrexglb_part move partition p21 update global indexes;
PROMPT before sync
select * from tdrexglb_part where contains(b,'row11') >0;

exec ctx_ddl.sync_index('tdrexglb_parti');
PROMPT after sync
select * from tdrexglb_part where contains(b,'row11') >0;

PROMPT truncate table partition
alter table tdrexglb_part truncate partition p21 update global indexes;

update global indexes;

CATSEARCH

CTXCAT索引を検索するには、CATSEARCH演算子を使用します。この演算子は、SELECT文のWHERE句で使用します。

CATSEARCH演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblinkを追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblinkは、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの索引付けはサポートされていません。)

この演算子の文法は、CTXCATと呼ばれます。シソーラス、ファジー・マッチング、近接検索またはステミングなど、検索基準に特殊な機能が必要な場合は、CONTEXT文法を使用することもできます。CONTEXT文法を利用する場合は、この項で説明するtext_queryパラメータに問合せテンプレートを指定します。

パフォーマンス

CATSEARCH演算子をCTXCAT索引で使用すると、主に複合問合せのパフォーマンスを向上させることができます。テキスト問合せ条件の指定にはtext_query引数を使用し、構造化条件の指定にはstructured_queryを使用します。

内部的には、テキスト列および構造化列に対して結合Bツリー索引が使用され、問合せを満たす結果が迅速に生成されます。

制限事項

オプティマイザが機能問合せ呼出しの使用を選択すると、問合せは失敗します。構造化句の選択性が高い場合、オプティマイザは機能呼出しを選択する可能性があります。

CATSEARCH演算子のstructured_query引数は、CREATE INDEXセットで使用される列を参照する必要があります。それ以外の場合は、エラーDRG-10845が発生します。たとえば、CTXCAT索引が設定されている表の上に作成されたビューに対してCATSEARCH問合せを発行するとき、ビューの論理列名が物理表の実際の列名と異なる場合は、エラーが発生します。CATSEARCH演算子のstructured_query引数で参照される列は、ビューの論理列ではなく、CREATE INDEXセットで使用される物理列名であることが必要です。

構文

CATSEARCH(
[schema.]column,
text_query       [VARCHAR2|CLOB],
structured_query VARCHAR2,
RETURN NUMBER;
[schema.]column

検索するテキスト列を指定します。検索する列には、対応付けられたCTXCAT索引が必要です。

text_query

次のいずれかを指定して、columnの検索を定義します。

CATSEARCH問合せ演算子

CATSEARCH演算子では、次の問合せ操作のみがサポートされます。

  • 論理積(AND)

  • 論理OR(|)

  • 論理NOT (-)

  • " "(引用符で囲んだ句)

  • ワイルド・カード

表1-2に、これらの演算子の構文を示します。

表1-2 CATSEARCH問合せ演算子

操作 構文 操作の説明

論理積(AND)

a b c

a、bおよびcを含む行を戻します。

論理OR

a | b | c

a、bまたはcを含む行を戻します。

論理NOT

a - b

aを含み、bを含まない行を戻します。

空白なしのハイフン

a-b

通常の文字として処理されるハイフンです。

たとえば、ハイフンがskipjoinとして定義されている場合、web-siteなどのワードは、単一の問合せ語句websiteとして処理されます。

同様に、ハイフンがprintjoinとして定義されている場合、web-siteなどのワードは、CTXCAT問合せ言語ではweb-siteとして処理されます。

" "

"a b c"

句"a b c"を含む行を戻します。

たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。

( )

(A B) | C

グループ設定をカッコで囲みます。この問合せは、CONTAINS問合せ(A &B) | Cに相当します。

ワイルド・カード

(右側切捨ておよび左右切捨て)

term*

a*b

ワイルド・カード文字は、0(ゼロ)個以上の文字と一致します。

たとえば、do*は、dogに一致し、gl*sは、glassに一致します。

左側切捨ては、サポートされていません。

注意: アプリケーションでワイルド・カード検索を使用する場合は、プリフィックス索引を作成することをお薦めします。プリフィックス索引付けは、BASIC_WORDLISTプリファレンスを使用して設定します。


前述の演算子には、次の制限事項が適用されます。

  • 左側(列名)は、索引セットの少なくとも1つの索引でネーミングされた列である必要があります。

  • 左側は明白な列名である必要があります。関数と式を置くことはできません。

  • 右側はリテラル値で構成される必要があります。関数、式、他の列およびサブ選択肢を置くことはできません。

  • 複数の基準をANDで結合できます。ORはサポートされていないことに注意してください。

  • データベース・リンクを使用してリモート表を問い合せる場合、データベース・リンクは、問合せ対象の表に対してのみでなく、CATSEARCHに対しても指定されている必要があります。

たとえば、次の式がサポートされています。

catsearch(text, 'dog', 'foo > 15')
catsearch(text, 'dog', 'bar = ''SMITH''')
catsearch(text, 'dog', 'foo between 1 and 15')
catsearch(text, 'dog', 'foo = 1 and abc = 123')
catsearch@remote(text, 'dog', 'foo = 1 and abc = 123')

次の式はサポートされていません。

catsearch(text, 'dog', 'upper(bar) = ''A''')
catsearch(text, 'dog', 'bar LIKE ''A%''')
catsearch(text, 'dog', 'foo = abc')
catsearch(text, 'dog', 'foo = 1 or abc = 3')

問合せテンプレート

問合せテンプレートを指定するマークアップ文字列を指定します。次のテンプレートのいずれかを指定します。

  • クエリー・リライト。問合せ文字列を別のバージョンに拡張するために使用されます。

  • 漸進的緩和。再コールを増やすために、制限が緩和されたバージョンの問合せを漸進的に入力するために使用されます。

  • 代替文法。CONTAINS演算子を指定するために使用されます(「CONTEXT問合せ文法の例」を参照)。

  • 代替言語。代替問合せ言語を指定するために使用されます。

  • 代替スコアリング。代替スコアリング・アルゴリズムを指定するために使用されます。


    関連項目:

    これらの問合せテンプレートの構文の詳細は、「CONTAINS」の「text_query」パラメータの説明を参照してください。

structured_query

構造化条件とORDER BY句を指定します。指定するすべての列に索引が存在している必要があります。たとえば、'category_id=1 order by bid_close'を指定するとします。CTX_DDL.ADD_INDEXパッケージで指定した場合と同様に、'category_id, bid_close'に索引が存在している必要があります。

structured_queryでは、標準SQL構文と併用できるのは次の演算子のみです。

  • =

  • <=

  • >=

  • >

  • <

  • IN

  • BETWEEN

  • AND(2つ以上の句を結合)


    注意:

    structured_queryパラメータにカッコ'()'は使用できません。

  1. 表を作成します。

次の文では、索引付けする表を作成します。

CREATE TABLE auction (category_id number primary key, title varchar2(20), 
bid_close date);

次の表では、値を表に挿入します。

INSERT INTO auction values(1, 'Sony CD Player', '20-FEB-2000');
INSERT INTO auction values(2, 'Sony CD Player', '24-FEB-2000');
INSERT INTO auction values(3, 'Pioneer DVD Player', '25-FEB-2000');
INSERT INTO auction values(4, 'Sony CD Player', '25-FEB-2000');
INSERT INTO auction values(5, 'Bose Speaker', '22-FEB-2000');
INSERT INTO auction values(6, 'Tascam CD Burner', '25-FEB-2000');
INSERT INTO auction values(7, 'Nikon digital camera', '22-FEB-2000');
INSERT INTO auction values(8, 'Canon digital camera', '26-FEB-2000');
  1. CTXCAT索引を作成します。

次の文では、CTXCAT索引を作成します。

begin
ctx_ddl.create_index_set('auction_iset');
ctx_ddl.add_index('auction_iset','bid_close'); 
end;
/
CREATE INDEX auction_titlex ON auction(title) INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('index set auction_iset');
  1. 表を問い合せます。

CATSEARCHによる一般的な問合せには、次のように、bid_closeによって順序付けられたワードcameraを含むすべての行を検索する構造化句が組み込まれています。

SELECT * FROM auction WHERE CATSEARCH(title, 'camera', 'order by bid_close desc')>
0;

CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
          8 Canon digital camera 26-FEB-00
          7 Nikon digital camera 22-FEB-00

次の問合せでは、語句Sony CD Playerを含み、入札終了日が2000年2月20日のすべての行を検索します。

SELECT * FROM auction WHERE CATSEARCH(title, '"Sony CD Player"',
'bid_close=''20-FEB-00''')> 0;

CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
          1 Sony CD Player       20-FEB-00

次の問合せでは、語句SonyCDおよびPlayerを含むすべての行を検索します。

SELECT * FROM auction WHERE CATSEARCH(title, 'Sony CD Player', 'order by bid_close
desc')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
          4 Sony CD Player       25-FEB-00
          2 Sony CD Player       24-FEB-00
          1 Sony CD Player       20-FEB-00

次の問合せでは、語句CDは含まれているがPlayerは含まれていないすべての行を検索します。

SELECT * FROM auction WHERE CATSEARCH(title, 'CD - Player', 'order by bid_close
desc')> 0;

CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
          6 Tascam CD Burner     25-FEB-00

次の問合せでは、語句CDまたはDVDまたはSpeakerを含むすべての行を検索します。

SELECT * FROM auction WHERE CATSEARCH(title, 'CD | DVD | Speaker', 'order by
bid_close desc')> 0;

CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
          3 Pioneer DVD Player   25-FEB-00
          4 Sony CD Player       25-FEB-00
          6 Tascam CD Burner     25-FEB-00
          2 Sony CD Player       24-FEB-00
          5 Bose Speaker         22-FEB-00
          1 Sony CD Player       20-FEB-00

次の問合せは、audio equipmentに関連するすべての行を検索します。

SELECT * FROM auction WHERE CATSEARCH(title, 'ABOUT(audio equipment)', NULL)> 0;

CONTEXT問合せ文法の例

次の例は、テンプレート機能を使用してCATSEARCH問合せでCONTEXT文法を指定する方法を示します。

PROMPT
PROMPT fuzzy: query = ?test
PROMPT should match all fuzzy variations of test (for example, text)
select pk||' ==> '||text from test 
where catsearch(text,
'<query> 
  <textquery grammar="context">
     ?test
  </textquery>
</query>','')>0
order by pk; 

PROMPT
PROMPT fuzzy: query = !sail
PROMPT should match all soundex variations of bot (for example, sell)
select pk||' ==> '||text from test 
where catsearch(text,
'<query> 
  <textquery grammar="context">
     !sail
  </textquery>
</query>','')>0
order by pk; 

PROMPT
PROMPT theme (ABOUT) query
PROMPT query: about(California)
select pk||' ==> '||text from test 
where catsearch(text,
'<query> 
  <textquery grammar="context">
     about(California)
  </textquery>
</query>','')>0
order by pk; 

次の例は、CATSEARCH問合せの問合せテンプレートによる、CONTEXT文法を使用したCTXCAT索引に対するフィールド・セクション検索を示します。

-- Create and populate table
create table BOOKS (ID number, INFO varchar2(200), PUBDATE DATE);
 
insert into BOOKS values(1, '<author>NOAM CHOMSKY</author><subject>CIVIL
   RIGHTS</subject><language>ENGLISH</language><publisher>MIT
  PRESS</publisher>', '01-NOV-2003');
 
insert into BOOKS values(2, '<author>NICANOR PARRA</author><subject>POEMS 
  AND ANTIPOEMS</subject><language>SPANISH</language>
  <publisher>VASQUEZ</publisher>', '01-JAN-2001');
 
insert into BOOKS values(1, '<author>LUC SANTE</author><subject>XML
  DATABASE</subject><language>FRENCH</language><publisher>FREE
  PRESS</publisher>', '15-MAY-2002');
 
commit;
 
-- Create index set and section group
exec ctx_ddl.create_index_set('BOOK_INDEX_SET');
exec ctx_ddl.add_index('BOOKSET','PUBDATE');
 
exec ctx_ddl.create_section_group('BOOK_SECTION_GROUP',
      'BASIC_SECTION_GROUP');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','AUTHOR','AUTHOR');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','SUBJECT','SUBJECT');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','LANGUAGE','LANGUAGE');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','PUBLISHER','PUBLISHER'); 
  
-- Create index
create index books_index on books(info) indextype is ctxsys.ctxcat
  parameters('index set book_index_set section group book_section_group');
 
-- Use the index
-- Note that: even though CTXCAT index can be created with field sections, it
-- cannot be accessed using CTXCAT grammar (default for CATSEARCH).
-- We need to use query template with CONTEXT grammar to access field 
-- sections with CATSEARCH.
 
select  id, info from books
where catsearch(info,
'<query>
      <textquery grammar="context">
              NOAM within author and english within language
      </textquery>
 </query>',
'order by pubdate')>0; 

関連項目

「CTXCAT索引タイプの構文」

『Oracle Textアプリケーション開発者ガイド』

CONTAINS

SELECT文のWHERE句でCONTAINS演算子を使用して、テキスト問合せの問合せ式を指定します。

CONTAINS演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblinkを追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblinkは、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)

CONTAINSは、選択されたすべての行に対して関連性スコアを戻します。関連性スコアは、SCORE演算子で取得します。

この演算子の文法は、CONTEXT文法と呼ばれます。単純な構文の方が効率的に動作するアプリケーションの場合は、CTXCAT文法を使用することもできます。その場合は、この項で説明するtext_queryパラメータに問合せテンプレートを指定します。


関連項目:

『Oracle Textアプリケーション開発者ガイド』のCONTEXT文法に関する項

構文

CONTAINS(
         [schema.]column,
         text_query    [VARCHAR2|CLOB]
         [,label       NUMBER])
RETURN NUMBER;
[schema.]column

検索するテキスト列を指定します。検索する列は、対応付けられたテキスト索引を持っている必要があります。

text_query

次のいずれかを指定します。

  • 列の検索を定義する問合せ式。

  • 問合せテンプレートを指定するマークアップ・ドキュメント。次のテンプレートのいずれかを使用します。

クエリー・リライト・テンプレート

このテンプレートを使用して、Oracle Textに問合せを発行する前に、様々なバージョンの問合せを自動的に書き換えます。これは、ユーザー問合せの再コールを最大化する必要がある場合に便利です。たとえば、単一の句問合せ'cat dog'を次の問合せに拡張するように、アプリケーションをプログラミングできます。

{cat} {dog}
{cat} ; {dog}
{cat} AND {dog}
{cat} ACCUM {dog}

これらの問合せは1つの問合せとして発行され、重複なしで結果が戻されます。この例では、問合せは、句cat dogを含むドキュメント、catdogの近くにあるドキュメント、およびcatdogを含むドキュメントを戻します。

これは、次のテンプレートを使用して実行されます。

 <query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> cat dog
     <progression>
       <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", " ; "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
     </progression>
   </textquery>
  <score datatype="INTEGER" algorithm="COUNT"/>
</query>

演算子TRANSFORMは、書換えルールを指定するために使用され、次の構文を使用します(二重カッコを使用することに注意してください)。表1-3に、パラメータを示します。

TRANSFORM((terms, prefix, suffix, connector))

表1-3 TRANSFORMパラメータ

パラメータ 説明

term

元の問合せから生成される語句のタイプを指定します。TOKENSまたはTHEMESのいずれかを指定します。

THEMESを指定するには、ナレッジ・ベースがインストールされている必要があります。ナレッジ・ベースは、Oracle Textとともにインストールされていない場合があります。詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

prefix

すべての語句の先頭に付加するリテラル文字列を指定します。

suffix

すべての語句の末尾に付加するリテラル文字列を指定します。

connector

プリフィックスおよびサフィックスを適用した後、すべての語句に接続するリテラル文字列を指定します。



注意:

TRANSFORMルールを使用したクエリー・リライト・テンプレートで指定されるテキスト問合せの入力文字列にOracle Text問合せ演算子(ANDORSOUNDEXなど)が含まれる場合、エラーが発生します。また、テキスト問合せの入力文字列に特殊文字(%$など)を使用する場合、エスケープ文字の後に指定する必要があります。そうしないと、エラーが発生します。

問合せ緩和テンプレート

このテンプレートを使用して、問合せを漸進的に緩和します。漸進的緩和は、制限が緩和されたバージョンの問合せを漸進的に発行することで、再コールを増やすために使用されます。これにより、アプリケーションは適切なヒット数をユーザーに戻します。

たとえば、問合せblack penは次のように漸進的に緩和されます。

black pen
black NEAR pen
black AND pen
black ACCUM pen

これは、次のテンプレートを使用して実行されます。

<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <progression>
       <seq>black pen</seq>
       <seq>black NEAR pen</seq>
       <seq>black AND pen</seq>
       <seq>black ACCUM pen</seq>
     </progression>
   </textquery>
   <score datatype="INTEGER" algorithm="COUNT"/>
</query>

代替文法テンプレート

このテンプレートを使用して、CONTEXTまたはCATSEARCHなどの代替文法を指定します。代替文法を指定すると、様々な構文や演算子を使用して問合せを入力できます。

たとえば、CATSEARCHを使用する場合、CONTEXT文法を使用してABOUT問合せを入力します。同様に、CONTAINSを使用する場合、簡略化されたCATSEARCH構文を使用して論理問合せを入力します。

'dog cat mouse'は、CONTAINSの句として解釈されます。ただし、CATSEARCHを使用すると、これはAND問合せ'dog AND cat AND mouse'と同等になります。CONTAINSが次のテンプレートで代替文法を使用するように指定します。

<query> 
  <textquery grammar="CTXCAT">dog cat mouse</textquery>
  <score datatype="integer"/>
</query>

代替言語テンプレート

このテンプレートを使用して、代替言語を指定します。

<query><textquery lang="french">bon soir</textquery></query>

代替スコアリング・テンプレート

このテンプレートを使用して、代替スコアリング・アルゴリズムを指定します。

次の例は、問合せがCONTEXT文法を使用し、COUNTアルゴリズムを使用して整数のスコアを戻すことを指定します。このアルゴリズムは、ドキュメント内に問合せが出現する回数としてスコアを戻します。

<query>        
     <textquery grammar="CONTEXT" lang="english"> mustang  
     </textquery>     
     <score datatype="INTEGER" algorithm="COUNT"/>     
</query>

次の例は、normalization_expr属性を使用して、問合せで戻されたスコアにSDATA(price)を追加し、それを最終スコアとして使用します。

<query>
    <textquery grammar="CONTEXT" lang="english">
        DEFINESCORE(dog, RELEVANCE) and  cat
    </textquery>
    <score  algorithm="COUNT"  normalization_expr ="doc_score+ SDATA(price)"/>
</query>

normalization_expr属性は代替スコアリング・テンプレートでのみ使用されます。次の項目で構成される算術式です。

  • 算術演算子: +、-、*、/。演算子の優先順位は、SQL演算子の優先順位と同じです。

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

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

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

  • 事前定義済のコンポーネント: doc_score事前定義済のコンポーネントを使用すると、特定のドキュメントの最初の問合せスコアを戻すことができます。

  • SDATAコンポーネント: SDATA(name)は、指定した名前をスコアとしてSDATAの値を戻します。

    • NUMBERまたはDATEデータ型のSDATAのみ使用できます。これ以外のデータ型の場合はエラーが発生します。

    • sdata文字列とSDATA名は、大/小文字が区別されません。

    • SDATAセクションの値にNULLを使用できるため、NULL SDATAセクションの値を使用した式は、0として評価されます。たとえば、指定されたドキュメントのSDATA(price)NULL値が含まれる場合、normalization_expr "doc_score + SDATA(price)"は0として評価されます。

  • 数値リテラル: SQLのNUMBERリテラルのパターンに準拠し、倍精度浮動小数点(-3.4e38から3.4e38)の範囲内にある数値リテラルが存在します。

  • 日付リテラル: 日付リテラルはDATE ()で囲む必要があります。使用できる形式は、YYYY-MM-DDまたはYYYY-MM-DD HH24:MI:SSのみです。たとえば、DATE(2005-11-08)です。

    SQLと同様に、時間を指定しない場合は、00:00:00とみなされます。

normalization_expr属性は、アルゴリズム属性よりも優先されます。つまり、アルゴリズムにCOUNTが設定されていても、ユーザーがnormalization_exprを指定すると、スコアはカウントされませんが、normalization_exprに基づいて計算されます。

スコア(式はalgorithm = COUNTまたはnormalization_expr = ...)が内部的に計算されて100を超える場合、100に設定されます。

問合せ緩和テンプレートを使用すると、高い優先順位から戻されるドキュメントは常に低い優先順位から戻されるドキュメントよりも高いスコアになるので、さらにスコアが正規化されます。

DATEリテラルに関する制限事項

日付型データ(DATEリテラルと日付型のSDATA)の間で使用できるのは、マイナス(-)演算子のみです。他の演算子を使用するとエラーになります。2つの日付型のデータを減算すると、2つの日付の間の日数差違を表す数値(浮動)が生成されます。たとえば、次のような式を使用できます。

SDATA(dob) –  DATE(2005-11-08)

次のような式は使用できません。

SDATA(dob) +  DATE(2005-11-08)

数値データと日付型のデータ間では、プラス(+)演算子とマイナス(-)演算子を使用できます。数値オペランドは、日数または日数の端数として解釈されます。たとえば、次のような式を使用できます。

DATE(2005-11-08) + 1        = 9 NOV 2005

次のような式は使用できません。

DATE(2005-11-08)* 3          = ERROR

テンプレート属性の値

表1-4に、テンプレート属性の有効な値を示します。

表1-4 テンプレート属性の値

タグ属性 説明 有効な値 意味

grammar=

問合せの文法を指定します。

CONTEXT

CTXCAT

問合せの文法。

datatype=

スコアとして戻す数値の型を指定します。

INTEGER

FLOAT

0から100の整数としてスコアを戻します。

0から100の高精度浮動小数点数としてスコアを戻します。

algorithm=

使用するスコアリング・アルゴリズムを指定します。

DEFAULT

COUNT

デフォルトを戻します。

ドキュメント内の出現回数としてスコアを戻します。

lang=

言語の名前を指定します。

Oracle Databaseでサポートされるすべての言語。『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

言語の名前。


テンプレート文法の定義

問合せテンプレートのインタフェースは、XML文書です。テンプレートの文法は、次のXML DTDを使用して定義されます。

<!ELEMENT query (textquery, score?)> 
<!ELEMENT textquery (#PCDATA|progression)*> 
<!ELEMENT progression (seq)+> 
<!ELEMENT seq (#PCDATA|rewrite)*> 
<!ELEMENT rewrite (#PCDATA)> 
<!ELEMENT score EMPTY> 
<!ATTLIST textquery grammar (context | ctxcat) #IMPLIED>
<!ATTLIST textquery language CDATA #IMPLIED>
<!ATTLIST score datatype (integer | float) "integer">
<!ATTLIST score algorithm (default | count) "default">

タグと属性値はすべて、大/小文字が区別されます。


関連項目:

問合せ式の演算子の詳細は、第3章「Oracle Text CONTAINS問合せ演算子」を参照してください。

label

オプションで、CONTAINS演算子で生成されたスコアを識別するラベルを指定します。

戻り値

CONTAINS演算子は、選択された各行に対して0から100の数値を戻し、そのドキュメントの行が問合せに対してどれだけ適合しているかを示します。0(ゼロ)は、その行に一致する検索結果がないことを示します。


注意:

この数値を取得するには、labelを付けてSCORE演算子を使用してください。

次の例では、oracleというワードを含むtext列のドキュメントをすべて検索します。各行のスコアは、ラベル1を使用してSCORE演算子で選択されます。

SELECT SCORE(1), title from newsindex 
    WHERE CONTAINS(text, 'oracle', 1) > 0;

CONTAINS演算子の後には、必ず>0という式を付けてください。これによって、CONTAINS演算子で計算されたスコア値が、選択された行では0(ゼロ)より大きくなる必要があることを指定します。

SCORE演算子を(SELECT句などで)コールする場合は、次のように、CONTAINS句がSCOREラベル値を参照するように指定します。

SELECT SCORE(1), title from newsindex 
     WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC;

次の例では、CATSEARCH文法を使用して解析する問合せを指定します。

SELECT id FROM test WHERE CONTAINS (text,
 '<query>
   <textquery lang="ENGLISH" grammar="CATSEARCH">
      cheap pokemon
   </textquery>
   <score datatype="INTEGER"/>
  </query>' ) > 0;

文法テンプレートの例

次の例は、CONTAINS問合せでのCTXCAT文法の使用方法を示しています。この例では、CTXCAT索引とCONTEXT索引を同じ表に作成し、問合せ結果を比較しています。

PROMPT create context and ctxcat indexes, both using theme indexing
PROMPT
create index tdrbqcq101x on test(text) indextype is ctxsys.context
parameters ('lexer theme_lexer');

create index tdrbqcq101cx on test(text) indextype is ctxsys.ctxcat
parameters ('lexer theme_lexer');

PROMPT *****  San Diego             ***********
PROMPT *****  CONTEXT grammar       ***********
PROMPT ** should be interpreted as phrase query **
select pk||' ==> '||text from test 
where contains(text,'San Diego')>0
order by pk;

PROMPT *****  San Diego      ***********
PROMPT *****  CTXCAT grammar ***********
PROMPT ** should be interpreted as AND query  ***
select pk||' ==> '||text from test 
where contains(text,
'<query> 
  <textquery grammar="CTXCAT">San Diego</textquery>
  <score datatype="integer"/>
</query>')>0
order by pk;

PROMPT *****  Hitlist from CTXCAT index ***********
select pk||' ==> '||text from test 
where catsearch(text,'San Diego','')>0
order by pk;

代替スコアリング問合せテンプレートの例

次の問合せテンプレートは、price SDATAセクション(SDATAのフィルタ列)値を問合せで戻されたスコアに追加し、それを最終スコアとして使用します。

<query>
      <textquery grammar="CONTEXT" lang="english">
             DEFINESCORE(dog, RELEVANCE) and cat
      </textquery>
      <score algorithm="COUNT" normalization_expr ="doc_score+SDATA(price)"/>
</query>

問合せ緩和テンプレートの例

次の問合せテンプレートは、問合せ緩和の順序を定義します。問合せblack penは、black penblack NEAR penblack AND penblack ACCUM penとして順に入力されます。アプリケーションが結果を必要とするかぎり、この順序で問合せヒット数が戻されます(重複なし)。

select id from docs where CONTAINS (text, '
<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <progression>
       <seq>black pen</seq>
       <seq>black NEAR pen</seq>
       <seq>black AND pen</seq>
       <seq>black ACCUM pen</seq>
     </progression>
   </textquery>
   <score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

アプリケーションが問合せの上位n個のヒット数を必要とする場合、問合せ緩和が最も効率的です。このヒット数は、DOMAIN_INDEX_SORTまたは非推奨となっているFIRST_ROWSヒントを使用して、またはPL/SQLカーソルで取得できます。

クエリー・リライトの例

次のテンプレートは、クエリー・リライトの順序を定義します。問合せkukui nutは次のように書き換えられます。

{kukui} {nut}

{kukui} ; {nut}

{kukui} AND {nut}

{kukui} ACCUM {nut}

select id from docs where CONTAINS (text, '
 <query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> kukui nut
     <progression>
       <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
       <seq><rewrite>transform((TOKENS, "{", "}", " ; "))</rewrite>/seq>
       <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite><seq/>
       <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite><seq/>
     </progression>
   </textquery>
  <score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

注意

マルチ言語表の問合せ

マルチレクサー・プリファレンスを使用して、マルチ言語表から索引を作成できます。問合せ時に、マルチレクサー・プリファレンスはセッションの言語設定を調べ、その言語に対してサブレクサー・プリファレンスを使用して問合せを解析します。言語設定がマップされていない場合は、デフォルト・レクサーが使用されます。

言語設定がマップされている場合は、問合せが解析され、通常に実行されます。索引には複数言語からのトークンが含まれているため、このような問合せはドキュメントを複数の言語で戻すことができます。

指定した言語のドキュメントのみを戻すように問合せを制限する場合は、言語列に構造化句を使用します。

パーティション索引による問合せパフォーマンスの制限

Oracle Textでは、パーティション化されたテキスト表のCONTEXT索引付けと問合せをサポートしています。

ただし、ORDER BY SCORE句を使用してパーティション表を問い合せる場合は、問合せパフォーマンスを最適化するために、パーティションを問い合せます。表全体を問い合せるためにORDER BY SCORE句を使用する場合は、問合せを1つのパーティションに制限できる範囲述語を組み込まないかぎり、最適な問合せは実行されません。

たとえば、次の文はp_tab4パーティションを直接問い合せます。

select * from part_tab partition (p_tab4) where contains(b,'oracle') > 0 ORDER BY
SCORE DESC;

関連項目

「CONTEXT索引タイプの構文」

第3章「Oracle Text CONTAINS問合せ演算子」

『Oracle Textアプリケーション開発者ガイド』のCONTEXT文法に関する項

「SCORE」

CREATE INDEX

この項では、Oracle Textドメイン索引およびコンポジット・ドメイン索引の作成に関連する部分でのCREATE INDEX文について説明します。


関連項目:

CREATE INDEX文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

用途

CREATE INDEXを使用して、Oracle Textの索引を作成します。Oracle Textの索引は、CONTEXTCTXCATCTXRULEまたはCTXXPATH型のOracle Databaseドメイン索引またはコンポジット・ドメイン索引です。ドメイン索引はアプリケーション固有の索引です。コンポジット・ドメイン索引(CDI)は、指定したテキスト列に索引付けをして処理するのみでなく、索引作成時に指定されるFILTER BYおよびORDER BY構造化列も索引付けをして処理します。

CONTAINSCATSEARCHまたはMATCHES問合せを入力するには、適切なOracle Textの索引を作成する必要があります。

索引構成表にはOracle Text索引を作成できません。

次の型のOracle Textの索引を作成できます。

CONTEXT

CONTEXT索引は、Oracle Text索引の基本タイプです。1つのテキスト列に対する索引です。CONTEXT索引は、ソース・テキストが、大規模な多数の一貫性のあるドキュメントで構成される場合に有効です。この索引は、SELECT文のWHERE句でCONTAINS演算子を使用して問い合せます。この索引は、DML操作後に手動で同期化する必要があります。「CONTEXT索引タイプの構文」を参照してください。

CTXCAT

CTXCAT索引は、1つのテキスト列と1つ以上の他の列に対する結合された索引です。CTXCATタイプは通常、カタログ内の品目名、名前、価格、説明など、小規模なドキュメントまたはテキストの断片を索引付けするために使用されます。SELECT文のWHERE句でCATSEARCH演算子を使用して、この索引を問い合せます。この型の索引は、複合問合せのために最適化されます。この索引はトランザクション型です。元表に対するDML操作によって、索引自体が自動的に更新されます。「CTXCAT索引タイプの構文」を参照してください。

CTXRULE

CTXRULE索引は、ドキュメント分類アプリケーションを作成するために使用されます。CTXRULE索引は、問合せの表、または問合せの集合を含む列に作成される索引です。問合せは、分類基準を定義するルールとして機能します。この索引は、SELECT文のWHERE句でMATCHES演算子を使用して問い合せます。「CTXRULE索引タイプの構文」を参照してください。

CTXXPATH

CTXPATH索引を使用して、XMLType列に対するexistsNode()問合せを高速化します。「CTXXPATH索引タイプの構文」を参照してください。

必要な権限

Oracle Textの索引の作成には、CTXAPPロールは不要です。テキスト列にBツリー索引を作成するOracle権限を持っていれば、そのユーザーにはテキスト索引を作成する権限があります。発行所有者、表所有者および索引所有者がすべて異なるユーザーである場合もあります。これは、通常のBツリー索引の作成時のOracle標準と一貫性があります。

CONTEXT索引タイプの構文

CONTEXT索引を使用して、テキスト列に索引を作成します。この索引は、SELECT文のWHERE句でCONTAINS演算子を使用して問い合せます。この索引は、DML操作後に手動で同期化する必要があります。

CREATE INDEX [schema.]index ON [schema.]table(txt_column)
  INDEXTYPE IS ctxsys.context [ONLINE]
  [FILTER BY filter_column[, filter_column]...]
  [ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...]
  [LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
  [, PARTITION [partition] [PARAMETERS('paramstring')]])]
  [PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE]];
[schema.]index

作成するテキスト索引の名前を指定します。

[schema.]table(txt_column)

索引付けする表および列の名前を指定します。txt_columnは、CONTAINS()演算子が起動されるドメイン索引列の名前です。

CTX_DOCのプロシージャを使用して行を識別する場合は、必要に応じてその表に主キーを格納できます。表に主キーがない場合、ドキュメント・サービスでは、ROWIDによってドキュメントを識別します。

指定する列は、CHARVARCHARVARCHAR2BLOBCLOBBFILEXMLTypeまたはURITypeのうちいずれかの型であることが必要です。

パーティション表を指定できます。LOCAL句を指定しない場合は、グローバルの非パーティション索引が作成されます。

DATE列、NUMBER列およびNESTED TABLE列は、索引付けできません。また、Object列にも索引付けできませんが、属性が基本データ型であれば、Object列の属性に索引付けできます。

仮想プライベート・データベース(VPD)保護表で索引を作成しようとすると、次のいずれかの基準に該当しないかぎり失敗します。

  • VPDポリシーが作成され、INDEX文タイプに適用されない場合

  • ポリシー関数が現在のユーザーに対してNULL条件を戻す場合

  • ユーザー(索引所有者)がSYSの場合

  • ユーザーにEXEMPT ACCESS POLICY権限がある場合

CONTEXT索引タイプでは、複数列に対する索引はサポートされていません。列リスト内の1つの列のみを指定する必要があります。


注意:

CTXCAT索引タイプを使用すると、テキスト列と構造化列の索引を作成できます。「CTXCAT索引タイプの構文」を参照してください。


注意:

透過的なデータ暗号化の可能な列ではドメイン索引はサポートされないため、Oracle Textで使用することはできません。ただし、TDEを使用できる表領域に格納される表の列にOracle Text索引を作成できます。

ONLINE

索引の作成時に、元表に対するDML挿入/更新/削除を実行できます。

索引付け中、DML要求は保留キューにエンキューされます。索引の作成が完了すると、元表はロックされます。その間、DMLはブロックされています。DML変更を有効にするには、索引を同期化する必要があります。

制限事項

ONLINEを使用する場合は、次の制限事項が適用されます。

  • ONLINEプロセスの最初または最後に、DMLが失敗する可能性があります。

  • ONLINEがサポートされているのは、CONTEXT索引のみです。

FILTER BY filter_column

複合問合せのWHERE句の範囲述語または等価述語の対象となる、構造化された索引列です。filter_columnに対して1つ以上の構造化列を指定できます。この列に対して、問合せでCONTAINS()述語とともに関係述語を指定できます。

コストベース・オプティマイザ(CBO)は、これらのFILTER BY列の構造化述語を、関係演算子(<<==>=>betweenおよびLIKE(VARCHAR2の場合))とともにプッシュ・ダウンしようとします。

これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2またはRAWのみです。また、最大長が249以内に指定されている場合、サポートされる型はVARCHAR2RAWのみです。サポートされている型(CHARNUMBERDATEVARCHAR2またはRAW)のADT属性も使用できます。これ以外のデータ型の場合はエラーが発生します。たとえば、式func(cola)および仮想列は使用できません。

FILTER BY列リストでtxt_columnを使用できます。

FILTER BY列のDML操作は常にトランザクション型です。

ORDER BY oby_column

構造化ORDER BY複合問合せの基準となる構造化された索引列です。構造化されたoby_columnのリストを、CONTAINS()問合せのORDER BY句に指定できます。

これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2またはRAWのみです。また、最大長が249以内に指定されている場合、サポートされる型はVARCHAR2RAWのみです。たとえば、式func(cola)および仮想列は使用できません。

指定した列の順序が重要です。コストベース・オプティマイザは、テキスト問合せのORDER BY句に次の項目のいずれかが含まれている場合にのみ、コンポジット・ドメイン索引にsortをプッシュしようとします。

  • CREATE INDEX時にORDER BY句によって宣言された、全体が順序付けされたORDER BY

  • CBOは、テキスト問合せのORDER BY句に次の項目のいずれかが含まれている場合にのみ、CDIにsortをプッシュしようとします。

    • CREATE INDEX文のORDER BY句によって宣言されるORDER BY列を並べ替えた全体

    • CREATE INDEX文のORDER BY句によって宣言されるORDER BY列を並べ替えた接頭辞のみ

    • CREATE INDEX文の実行時にORDER BY句によって宣言され順序付けされたORDER BY列のプリフィックスが後に続くscore

    • CREATE INDEX文の ORDER BY句によって宣言されるORDER BY列を並べ替えた接頭辞に続くスコア

    次の例は、ORDER BY列に関するCBO動作を示しています。

    CREATE INDEX foox ON foo(D) INDEXTYPE IS CTXSYS.CONTEXT
    FILTER BY B, C
    ORDER BY A, B desc;
    

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

    SELECT A, SCORE(1) FROM foo WHERE CONTAINS(D, 'oracle',1)>0 
    AND C>100 ORDER BY col_list;
    

    注意:

    NLS_SORTまたはNLS_COMPパラメータ(つまり、alter session set NLS_SORT = <some lang>;)を設定している場合、CBOはsortまたは関連構造化述語をCDIにプッシュしません。この動作は、通常のBツリー索引と一貫性があります。

    CBOは、col_listが次のような値の場合、CDIにsortをプッシュしようとします。

    A
    A, B desc
    SCORE(1), A
    SCORE(1), A, B desc
    A, SCORE(1)
    A, B desc, SCORE(1)
    

    CBOは、col_listが次のような値の場合、CDIにsortをプッシュしようとしません。

    B
    B,A
    SCORE(1), B
    B, SCORE(1)
    A, B, C
    A, B asc (or simply A, B)
    

    (またはA, B)

  • CREATE INDEX文の実行時にORDER BY句によって宣言され順序付けされたORDER BY列のプリフィックスが後に続くscore

  • CREATE INDEX文の実行時にORDER BY句によって宣言され順序付けされたORDER BY列のプリフィックスの後に続くscore

たとえば、式func(cola)は使用できません。

ORDER BY列リストでtxt_columnを使用できます。

ORDER BY列のDML操作は常にトランザクション型です。

制限事項

FILTER BYおよびORDER BYを使用する場合は、次の制限事項が適用されます。

  • FILTER BY句およびORDER BY句では、構造化列を使用できます。ただし、FILTER BY句のMDATAにマップされている列を、ORDER BY句でも使用することはできません。この場合はエラーが発生します。

  • CHARVARCHAR2およびRAW列の最大長は249以内です。また、VARCHAR2またはRAW列がMDATA列にマップされている場合、指定可能な最大長はそれぞれ64バイトと32バイトです。(MDATAではCHARデータ型がサポートされていないことに注意してください。CHARデータ型のFILTER BY列がMDATAセクションにマップされている場合は、CREATE INDEX時にエラーが発生します。)

  • INDEXED_COLUMNFILTER BY列およびORDER BY列の合計数は32以内です。


注意:

  • 連結されたBツリー索引またはビットマップ索引の場合と同様に、FILTER BY列およびORDER BY列の数が増加すると、DMLのパフォーマンスが低下する可能性があります。

  • FILTER BY列のMDATAへのマッピングは、FILTER BY列にシーケンシャル値が含まれている場合、またはカーディナリティが非常に高い場合はお薦めしません。このようなマッピングは、非常に時間がかかり、$I表の範囲が限定され、$Xのパフォーマンスが低下する可能性があります。この例には、DATE型の列があります。この型の列については、SDATAへのマッピングをお薦めします。



注意:

SDATAセクションにマップされるFILTER BY列およびORDER BY列を格納するために、DR$indextable$Sという名前の索引表が作成されます。SDATAセクションに何もマップされない場合、$S表は作成されません。

$S表に含まれる列は、次のとおりです。

  • SDATA_ID number。内部SDATAセクションID。

  • SDATA_LAST number。最後のドキュメントID。token_lastと同じです。

  • SDATA_DATA RAW(2000)。圧縮されたSDATA値。データベース・ブロック・サイズが4Kの表領域に$Sが作成される場合は、RAW(1500)で定義されます。

制限事項: パフォーマンス上の理由から、$S表は、データベース・ブロック・サイズが4KB以上の表領域に、オーバーフロー・セグメントとPCTTHRESHOLD句を指定せずに作成する必要があります。$Sをデータベース・ブロック・サイズが4KB未満の表領域に作成するか、オーバーフロー・セグメントまたはPCTTHRESHOLD句を指定して作成した場合は、CREATE INDEX文の実行時にエラーが発生します。


FILTER BY句またはORDER BY句(あるいはその両方)を指定してコンポジット・ドメイン索引が作成されているテキスト表のエクスポートとインポートに関する制限事項は、次のとおりです。

  • 通常のexpおよびimpでは、コンポジット・ドメイン索引のエクスポートおよびインポートはサポートされません。実行を試行すると、「EXP-00113: 機能コンポジット・ドメイン索引はサポートされていません。」というエラーが発生します。

  • コンポジット・ドメイン索引が作成されているテキスト表をエクスポートするには、データ・ポンプ・エクスポートおよびインポート・ユーティリティ(それぞれexpdpおよびimpdpコマンドで起動)、またはDBMS_DATAPUMP PL/SQLパッケージを使用する必要があります。

コンポジット・ドメイン索引のFILTER BY列およびORDER BY列でのALTER INDEXALTER TABLEの使用に関する制限事項(Oracle Databaseの拡張索引作成機能フレームワークによって適用):

(これらの制限事項は、Oracle Databaseの拡張索引作成機能フレームワークによって適用されます。)

  • ALTER INDEXを使用したFILTER BYおよびORDER BY列の追加または削除は、現在サポートされていません。FILTER BY列またはORDER BY列を追加または削除するには、索引を再作成する必要があります。

  • ALTER TABLE MODIFY COLUMNを使用して、コンポジット・ドメイン索引が作成されている列のデータ型を変更する場合は、列の変更前にコンポジット・ドメイン索引を削除する必要があります。

  • ALTER TABLE DROP COLUMNを使用してコンポジット・ドメイン索引の一部である列を削除するには、索引列の削除前にコンポジット・ドメイン索引を削除する必要があります。

PL/SQLパッケージでFILTER BYおよびORDER BYを使用する場合は、次の制限事項が適用されます。

  • FILTER BY列のセクションへのマッピングはオプションです。FILTER BY列にセクション・マッピングが存在しない場合は、デフォルトでSDATAセクションにマップされます。セクション名は、FILTER BY列の名前になります。

  • コンポジット・ドメイン索引のCREATE INDEX句の実行時にセクション・グループを指定しない場合は、デフォルトのセクション・グループ設定が使用されます。FILTER BY列およびORDER BY列ごとに、1つのSDATAセクションが作成されます。


    注意:

    セクション名では特定の特殊文字が使用できず、大/小文字が区別されないため、列名で大/小文字が区別されているかまたは特殊文字が使用されている場合は、エラーが発生します。この問題を回避するには、索引を作成する前に、列をMDATAまたはSDATAセクションにマップする必要があります。「CTX_DDL.ADD_MDATA_COLUMN」または「CTX_DDL.ADD_SDATA_COLUMN」を参照してください。

  • MDATAセクションにマップされている列がORDER BY列句でも使用されている場合は、エラーが発生します。

  • 列セクション名は、セクション・グループ内で一意です。つまり、FOOというMDATA列セクションがすでにある場合、MDATA列セクション名にFOOを指定することはできません。同様に、FOOというSDATA列セクションがすでにある場合、フィールド・セクションにFOOを使用することはできません。このルールは、列セクションの作成方法が暗黙的(FILTER BYまたはORDER BY句のCREATE INDEXで作成)か、明示的(CTX_DDL.ADD_SDATA_COLUMNで作成)かに関係なく適用されます。

  • 1つのFILTER BY列にマップできるのは1つのセクション名のみで、その逆もまた同様です。1つのセクションを複数の列にマップしたり、1つの列を複数のセクションにマップすることはできません。

  • 列セクションは、NULLのセクション・グループも含めて、あらゆるタイプのセクション・グループに追加できます。

  • CTX_DDL.ADD_MDATA_COLUMNまたはCTX_DDL.ADD_SDATA_COLUMNパッケージによって追加されたセクションがあるセクション・グループが、FILTER BY句のないCREATE INDEX文に指定されている場合、マップされた列セクションは無視されます。ただし、これらの列セクションなしでも索引は作成されます。これは、マップされた列が指定したセクション・グループに含まれていないFILTER BY句の場合も同じです。


関連項目:

「CTX_DDL.ADD_SDATA_COLUMN

LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]

パーティション表にローカル・パーティションCONTEXT索引を指定します。パーティション表は、レンジ・パーティション化する必要があります。ハッシュ・パーティション、コンポジット・パーティションおよびリスト・パーティションは、サポートされていません。

索引パーティション名のリストは、partition_nameで指定できます。パーティション名を指定しない場合は、システムによって割り当てられます。索引パーティション・リストの順序は、表パーティションの順序に対応している必要があります。

各パーティションに関連付けられたPARAMETERS句によって、そのパーティション固有のパラメータ文字列が指定されます。各索引パーティションのsync (manual|every |on commit)memoryおよびstorageのみを指定することもできます。

PARAMETERS句では、POPULATEおよびNOPOPULATE引数もサポートされます。「POPULATE | NOPOPULATE」を参照してください。

索引パーティション名、索引パーティション・ステータスなどの索引パーティション情報を検索するには、ビューCTX_INDEX_PARTITIONSまたはCTX_USER_INDEX_PARTITIONSを問い合せます。

パーティション索引による問合せパフォーマンスの制限

ORDER BY SCORE句を使用してパーティション索引を問い合せる場合は、問合せパフォーマンスを最適化するために、パーティションを問い合せます。表全体を問い合せるためにORDER BY SCORE句を使用する場合は、問合せを1つのパーティションに制限できる範囲述語を組み込まないかぎり、最適な問合せは実行されません。

PARALLEL n

オプションで、パラレル索引付けに対する並列度を指定します。実際の並列度は、リソースによっては多少低くなります。このパラメータは、非パーティション表に使用できます。ただし、パラレルで作成された非パーティション索引の場合、パラレル問合せ処理は実行されません。ローカル・パーティション索引を作成するために、パラレル索引付けがサポートされるようになりました。

パラメータ句に指定される索引付けのメモリー・サイズは、各パラレル・スレーブに適用されます。たとえば、パラメータ句に指定された索引付けのメモリー・サイズが500MBで、並列度が2の場合は、索引付けのための少なくとも1GBのメモリーを使用できるようにする必要があります。


関連項目:


パフォーマンス

パラレル索引付けによって、索引付けするデータが大量にある場合およびオペレーティング・システムが複数のCPUをサポートしている場合は、索引付けを高速化できます。


注意:

ローカル・パーティション索引の作成にPARALLELを使用すると、パラレル問合せを実行できます。(非パーティション索引をパラレルに作成しても、問合せはパラレルに処理されません。)

パラレル問合せは、特に負荷の大きいシステムに対して実行すると、問合せのスループットが低下します。このため、ローカル索引の作成後に、パラレル問合せを使用禁止にすることをお薦めします。使用禁止にするには、ALTER INDEX NOPARALLEL文を使用します。

パラレル問合せの詳細は、『Oracle Textアプリケーション開発者ガイド』の「パフォーマンス・チューニング」を参照してください。


制限事項

パラレル索引付けがサポートされているのは、CONTEXT索引タイプのみです。

UNUSABLE

UNUSABLEの索引を作成します。このパラメータによって、索引メタデータのみが作成され、即時に終了します。

UNUSABLEの索引は、ローカル・パーティション索引をパラレルで作成する必要がある場合に作成します。

PARAMETERS(paramstring)

オプションで、paramstringに索引付けパラメータを指定します。user.preference表記法を使用して、他のユーザーが所有するプリファレンスを指定できます。

paramstringの構文は、次のとおりです。

paramstring = 
'[DATASTORE datastore_pref] 
 [FILTER filter_pref] 
 [CHARSET COLUMN charset_column_name]  
 [FORMAT COLUMN format_column_name]

 [LEXER lexer_pref]
 [LANGUAGE COLUMN language_column_name] 

 [WORDLIST wordlist_pref] 
 [STORAGE storage_pref] 
 [STOPLIST stoplist] 
 [SECTION GROUP section_group]
 [MEMORY memsize]
 [POPULATE | NOPOPULATE]
 [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
 [TRANSACTIONAL]'

CTX_DDL.CREATE_PREFERENCEでデータストア、フィルタ、レクサー、ワードリストおよび記憶域プリファレンスを作成します。作成後、それらをparamstringに指定します。


注意:

paramstringを指定しない場合は、システムのデフォルト値が使用されます。

これらのデフォルト値の詳細は、「デフォルトの索引付けパラメータ」を参照してください。


DATASTORE datastore_pref

データストア・プリファレンスの名前を指定します。データストア・プリファレンスを使用して、テキストの格納場所を指定します。「データストア型」を参照してください。

FILTER filter_pref

フィルタ・プリファレンスの名前を指定します。フィルタ・プリファレンスを使用して、書式化されたドキュメントのフィルタ処理方法をプレーン・テキストまたはHTMLに指定します。「フィルタ型」を参照してください。

CHARSET COLUMN charset_column_name

キャラクタ・セット列の名前を指定します。キャラクタ・セット列は、テキスト列と同じ表内にある必要があり、CHARVARCHARまたはVARCHAR2型である必要があります。この列を使用して、データベースのキャラクタ・セットに変換するドキュメントのキャラクタ・セットを指定します。この値には大/小文字区別はありません。JA16EUCなどのグローバリゼーション・サポート・キャラクタ・セット文字列を指定する必要があります。

ドキュメントがプレーン・テキストまたはHTMLである場合、AUTO_FILTERおよびCHARSETフィルタはこの列を使用して、索引付けのためにドキュメントのキャラクタ・セットをデータベースのキャラクタ・セットに変換します。

プレーン・テキストまたはHTMLドキュメントが、異なる複数のキャラクタ・セットを持つ、またはデータベースのキャラクタ・セットとは異なるキャラクタ・セットである場合は、この列を使用してください。

NLS_LENGTH_SEMANTICSパラメータのCHAR設定はデータベース・レベルではサポートされていません。このパラメータは、次の列に対してサポートされます。

  • CHARSET COLUMN。次に例を示します。

    VARCHAR2 <size> CHAR
    CHAR <size> CHAR
    
  • VARCHAR2およびCHAR列で作成される索引

  • CREATE INDEXFILTER BY句およびORDER BY句に対するVARCHAR2およびCHAR

  • FORMAT COLUMN


注意:

  • キャラクタ・セット列のみが変更された場合、ドキュメントは再索引付け用にマークされません。索引付けされた列が再索引付けにフラグされるには、その列を更新する必要があります。

  • NLS_LENGTH_SEMANTICS = CHARパラメータは、この項で説明したように、列レベルでのみサポートされ、データベース・レベルではサポートされません。


FORMAT COLUMN format_column_name

フォーマット列の名前を指定します。フォーマット列は、テキスト列と同じ表内にある必要があり、CHARVARCHARまたはVARCHAR2型である必要があります。

FORMAT COLUMNにより、ドキュメントのフィルタ処理の方法、あるいはIGNORE値の場合は、索引付けされるかどうかが決定されます。

AUTO_FILTERは、ドキュメントのフィルタ時にフォーマット列を使用します。プレーン・テキストまたはHTMLドキュメントに対するフィルタ処理をオプションでバイパスするために、この列を異機種間ドキュメント・セットとともに使用してください。

フォーマット列には、次のオプションのいずれかを指定できます。

  • TEXT

  • BINARY

  • IGNORE

TEXTオプションは、ドキュメントがプレーン・テキストまたはHTMLのいずれかであることを示します。TEXTを指定すると、ドキュメントはフィルタされませんが、キャラクタ・セットが変換される場合があります。

BINARYオプションは、ドキュメントがPDFのような、プレーン・テキストまたはHTML以外のAUTO_FILTERオブジェクトがサポートする形式であることを示します。フォーマット列のエントリをマップできない場合は、BINARYがデフォルトです。

IGNOREオプションは、索引付けの実行時に行が無視されることを示します。テキストへの索引付けで互換性のないイメージ・データなどのデータが含まれた行、または処理しない言語の行をバイパスするには、この値を使用します。フォーマット列タイプがTEXTのドキュメントとIGNOREのドキュメントとの相違は、前者が索引付けされてもフィルタには無視されるのに対し、後者はまったく索引付けされない点です。したがって、IGNOREはどのフィルタ・タイプにも使用できます。


注意:

フォーマット列のみが変更された場合、ドキュメントは再索引付け用にマークされません。索引付けされた列が再索引付けにフラグされるには、その列を更新する必要があります。

LEXER lexer_pref

レクサー・プリファレンスまたはマルチレクサー・プリファレンスの名前を指定します。レクサー・プリファレンスを使用して、テキストの言語およびテキストを索引付け用にトークン化する方法を識別します。「レクサー型」を参照してください。

LANGUAGE COLUMN language_column_name

マルチレクサー・プリファレンスを使用する場合は、言語列の名前を指定します。「MULTI_LEXER」を参照してください。

この列は、元表内にある必要があります。この列は、索引付けされた列とは別の列である必要があります。言語列の最初の30バイトのみが、言語を識別するために調べられます。


注意:

言語列のみが変更された場合、ドキュメントは再索引付け用にマークされません。索引付けされた列が再索引付けにフラグされるには、その列を更新する必要があります。

WORDLIST wordlist_pref

ワードリスト・プリファレンスの名前を指定します。ワードリスト・プリファレンスを使用して、ファジー、ステミングおよびプリフィックス索引付けなどの機能を有効化すると、ワイルド・カード検索のパフォーマンスが向上します。「ワードリスト型」を参照してください。

STORAGE storage_pref

テキスト索引用の記憶域プリファレンスの名前を指定します。記憶域プリファレンスを使用して、索引表の格納方法を指定します。「記憶域型」を参照してください。

STOPLIST stoplist

ストップリストの名前を指定します。ストップリストを使用して、索引付けの対象でないワードを識別します。「CTX_DDL.CREATE_STOPLIST」を参照してください。

SECTION GROUP section_group

セクション・グループの名前を指定します。セクション・グループを使用して、構造化ドキュメントに検索可能なセクションを作成します。「CTX_DDL.CREATE_SECTION_GROUP」を参照してください。

MEMORY memsize

索引付けに使用するランタイム・メモリー量を指定します。memsizeの構文は、次のとおりです。

memsize = number[K|M|G]

KはKB、MはMB、GはGBを表します。

memsizeの値は、1MBからCTX_PARAMETERSビューのMAX_INDEX_MEMORYの値までの間で指定する必要があります。MAX_INDEX_MEMORYの値より大きいメモリー・サイズを指定する場合は、CTX_ADM.SET_PARAMETERによってこのパラメータをmemsize以上に再設定する必要があります。

デフォルトは、CTX_PARAMETERSDEFAULT_INDEX_MEMORYに指定された値です。

memsizeパラメータは、索引付けに使用するメモリー量を指定します。使用量が指定値を超えると、索引がディスクにフラッシュされます。大きいメモリー量を指定すると、I/Oが削減されるため索引付けのパフォーマンスが向上します。また、断片化も削減されるため問合せのパフォーマンスおよびメンテナンスが向上します。

小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリーが不足している場合に有効なことがあります。

POPULATE | NOPOPULATE

索引を空にするか移入するかを指定します。デフォルトはPOPULATEです。


注意:

POPULATE | NOPOPULATEオプションのみ、デフォルト値をCTX_ADM.SET_PARAMETERで設定できません。

このオプションは、CTXXPATH索引に対して妥当ではありません。


空の索引は、元表を更新または元表に挿入することで移入されます。索引を追加的に作成したり、元表内のドキュメントを選択的に索引付けするときに、空の索引の作成が必要な場合があります。空の索引は、ドキュメント・セットからテーマおよび要点の出力のみを必要とする場合にも作成します。

SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)

元表に対する挿入、更新または削除がある場合は、CONTEXT索引の自動同期化を行うためにSYNCを指定します。次のSYNCメソッドのいずれかを指定できます。

表1-5 SYNCタイプ

SYNCタイプ 説明

MANUAL

自動同期化は行われません。これはデフォルトです。CTX_DDL.SYNC_INDEXを使用して、索引を手動で同期化する必要があります。

EVERY "interval-string"

スケジューラ・ジョブの場合と同じ構文をとるinterval-stringの値で指定された一定の間隔で、索引を自動的に同期化します。EVERYを使用した自動同期化の場合、索引作成者にCREATE JOB権限が必要です。

interval-stringが、前の同期化ジョブを完了するのに十分な長さの期間に設定されていることを確認してください。長さが十分でないと、同期化ジョブがハングする可能性があります。interval-stringは、二重引用符で囲む必要があります。interval-string内の一重引用符は、別の一重引用符をエスケープ文字で指定する必要があります。

自動同期化構文の例は、「自動索引同期化の有効化」を参照してください。

ON COMMIT

コミット・トランザクションの直後に索引を同期化します。コミット・トランザクションは、同期化が完了するまで戻りません。(同期化は個別のトランザクションとして実行されるため、データがコミットされて索引変更がコミットされない場合でも、ある程度の時間(通常は短い)がかかります。)

この操作は、memoryパラメータで指定されたメモリーを使用します。

同期化操作には、独自のトランザクション・コンテキストがあります。この操作が失敗しても、データ・トランザクションはコミットされます。CTX_USER_INDEX_ERRORSビューに、索引同期化エラーが記録されます。「索引エラーの表示」を参照してください。

ON COMMIT構文の例は、「自動索引同期化の有効化」を参照してください。


ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(ON COMMITEVERYまたはMANUAL)が設定されます。マスター・パラメータ文字列に指定されたSYNCのタイプは、パーティションが独自のタイプを指定した場合を除いて、すべての索引パーティションに適用されます。

自動(EVERY)同期化の場合、ユーザーは、メモリー・サイズおよびパラレル同期化を指定できます。構文は次のとおりです。

... EVERY interval_string MEMORY mem_size PARALLEL paradegree ...

ON COMMIT同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズを使用する必要があります。


関連項目:

ジョブ・スケジューリングの詳細は、『Oracle Database管理者ガイド』を参照してください。

TRANSACTIONAL

ドキュメントが挿入または更新された直後にドキュメントを検索するように指定します。TRANSACTIONALを有効にしてテキスト索引を作成する場合、索引内のすでに同期化されたROWIDを処理する以外に、CONTAINS演算子は、非同期化されたROWIDも処理します。Oracle Textでは非同期ROWIDのインメモリー索引付けが実行され、インメモリー索引に対する問合せが処理されます。

TRANSACTIONALは索引レベル・パラメータのため、パーティション・レベルでは適用されません。

(CTX_DDL.SYNC_INDEXを使用して)テキスト索引を適宜同期化し、保留中のROWIDを索引に取り込む必要があります。非同期ROWIDの数が増えると、問合せのパフォーマンスが低下します。そのため、EVERYパラメータとともに自動同期化を使用するように索引を設定することをお薦めします。(「SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)」を参照してください。)

TRANSACTIONALパラメータを使用して作成された索引に対するトランザクション問合せは、PL/SQL変数CTX_QUERY.disable_transactional_queryを使用してオンまたはオフにできます(ユーザー・セッションの継続時間中)。これは、たとえば、保留中のROWIDが多すぎるために問合せに時間がかかる場合に便利です。次に、このセッション変数を設定する例を示します。

exec ctx_query.disable_transactional_query := TRUE;

索引がAUTO_FILTERを使用する場合、非同期ROWIDを含む問合せでは、同期化されていないドキュメントをフィルタ処理する必要があります。

CREATE INDEX: CONTEXT索引の例

次の項では、CONTEXT索引の作成例を示します。

デフォルトのプリファレンスを使用したCONTEXT索引の作成

次の例では、mytable内のdocs列に、myindexというCONTEXT索引を作成します。デフォルトのプリファレンスが使用されます。

CREATE INDEX myindex ON mytable(docs) INDEXTYPE IS ctxsys.context;

関連項目:


カスタム・プリファレンスを使用したCONTEXT索引の作成

次の例では、mytable内のdocs列に、myindexというCONTEXT索引を作成します。索引は、my_lexerというカスタム・レクサー・プリファレンスおよびmy_stopというカスタム・ストップリストで作成されます。

また、この例では、プリファレンスおよびストップリストは、my_lexerがCTX_DDL.CREATE_PREFERENCEで、my_stopがCTX_DDL.CREATE_STOPLISTで作成されていることを前提としています。未指定のプリファレンスに対しては、デフォルトのプリファレンスが使用されます。

CREATE INDEX myindex ON mytable(docs) INDEXTYPE IS ctxsys.context 
  PARAMETERS('LEXER my_lexer STOPLIST my_stop');

すべてのユーザーが、あらゆるプリファレンスを使用できます。他のユーザーのスキーマにあるプリファレンスを指定するには、そのユーザー名をプリファレンス名に追加します。次の例では、プリファレンスmy_lexerおよびmy_stopが、ユーザーkennyのスキーマ内にあることを前提としています。

CREATE INDEX myindex ON mytable(docs) INDEXTYPE IS ctxsys.context 
  PARAMETERS('LEXER kenny.my_lexer STOPLIST kenny.my_stop');

自動索引同期化の有効化

索引を作成し、元表に対する挿入、更新および削除にあわせて一定の間隔で索引を同期化するように指定できます。それには、SYNC (EVERY "interval-string")パラメータを使用して索引を作成します。

ジョブ・スケジューリングを使用するには、DBA権限を持つユーザーとしてログインし、CREATE JOB権限を付与する必要があります。

次の例では、索引を作成して、3つの索引パーティションに対して3つの同期化ジョブをスケジュールします。最初のパーティションは、ON COMMIT同期化を使用します。残りの2つのパーティションは、毎週月曜日の午後3時に実行するようにスケジュールされたジョブによって同期化されます。

CONNECT system/manager
GRANT CREATE JOB TO dr_test

CREATE INDEX tdrmauto02x ON tdrmauto02(text)
   INDEXTYPE IS CTXSYS.CONTEXT local
   (PARTITION tdrm02x_i1 PARAMETERS('
   MEMORY 20m SYNC(ON COMMIT)'),
   PARTITION tdrm02x_i2,
   PARTITION tdrm02x_i3)  PARAMETERS('
   SYNC (EVERY "NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24")
  ');

ジョブ・スケジューリング構文の詳細は、『Oracle Database管理者ガイド』を参照してください。

マルチレクサー・プリファレンスを使用したCONTEXT索引の作成

マルチレクサー・プリファレンスは、各行にどのレクサーを使用するかを、言語列に基づいて決定します。これは、テキスト列内のドキュメントの言語識別名を格納する文字の列です。たとえば、異なる複数の言語のドキュメントを持つglobaldoc表を、次のように作成するとします。

CREATE TABLE globaldoc (
   doc_id NUMBER PRIMARY KEY,
   lang VARCHAR2(10),
   text CLOB
);

作成したマルチレクサー・プリファレンスが、global_lexerであるとします。global_doc表を索引付けするには、マルチレクサー・プリファレンスおよび言語列の名前を次のように指定します。

CREATE INDEX globalx ON globaldoc(text) INDEXTYPE IS ctxsys.context PARAMETERS
('LEXER global_lexer LANGUAGE COLUMN lang');

関連項目:

マルチレクサー・プリファレンスの作成の詳細は、「MULTI_LEXER」を参照してください。

ローカル・パーティション索引の作成

次の例では、3つにパーティション化されたテキスト表を作成し、それを移入した後、パーティション索引を作成します。

PROMPT create partitioned table and populate it

CREATE TABLE part_tab (a int, b varchar2(40)) PARTITION BY RANGE(a)
(partition p_tab1 values less than (10),
 partition p_tab2 values less than (20),
 partition p_tab3 values less than (30));
PROMPT create partitioned index
CREATE INDEX part_idx on part_tab(b) INDEXTYPE IS CTXSYS.CONTEXT
LOCAL (partition p_idx1, partition p_idx2, partition p_idx3);

注意:

Oracle Textのパーティション数の制限は、Oracle Databaseの表ごとの最大パーティション数と同じです。

FILTER BYおよびORDER BY句の使用

次の例では、docsという表に索引を作成し、作成者の公開日でドキュメントを順序付けします。

最初に、表を作成します。

CREATE TABLE docs (
    docid    NUMBER, 
    pub_date DATE, 
    author   VARCHAR2(30), 
    category VARCHAR2(30), 
    document CLOB
);
 

FILTER BY句およびORDER BY句を指定して索引を作成します。

CREATE INDEX doc_idx on docs(document) indextype is ctxsys.context
  FILTER BY category, author
  ORDER BY pub_date desc, docid
  PARAMETERS ('memory 500M');

パラレル索引付け

複数のCPUがある場合、パラレル索引付けにより、索引のパフォーマンスが向上します。

索引をパラレルに作成するには、並列度を使用してPARALLEL句を使用します。この例では、並列度3を使用します。

CREATE INDEX myindex ON mytab(pk) INDEXTYPE IS ctxsys.context PARALLEL 3;

ローカル・パーティション索引のパラレルでの作成

複数のCPUがある場合、ローカル・パーティション索引をパラレルに作成することでパフォーマンスが向上します。パーティション表を使用すると、作業を分割できます。ローカル・パーティション索引をパラレルで作成するには、次の2つの方法があります。

  • CREATE INDEX文でPARALLEL句とLOCAL句を使用します。この場合、最大並列度は、使用するパーティション数に制限されます。「CREATE INDEXの並列性」を参照してください。

  • UNUSABLEの索引を作成してから、DBMS_PCLXUTIL.BUILD_PART_INDEXユーティリティを実行します。この方法により、特にパーティションより多くのCPUを使用している場合に、並列性が高くなります。「DBMS_PCLUTIL.BUILD_PART_INDEXの並列性」を参照してください。

ローカル・パーティション索引をパラレルで作成しようとすると失敗し、次のエラー・メッセージが表示される場合があります。

ORA-29953: error in the execution of the ODCIIndexCreate routine for one or more
of the index partitions

索引の作成に失敗した具体的な理由を判断するには、CTX_USER_INDEX_ERRORSビューを問い合せます。

CREATE INDEXの並列性

CREATE INDEX文でPARALLEL句とLOCAL句を使用することで、ローカル索引並列性を実現できます。この場合、最大並列度は、使用するパーティション数に制限されます。

次の例では、3つのパーティションを持つ表を作成し、それを移入した後、並列度2のローカル索引を作成します。

create table part_tab3(id number primary key, text varchar2(100)) 
partition by range(id) 
(partition p1 values less than (1000), 
 partition p2 values less than (2000), 
 partition p3 values less than (3000)); 

begin 
  for i in 0..2999 
  loop 
      insert into part_tab3 values (i,'oracle'); 
  end loop; 
end; 
/ 

create index part_tab3x on part_tab3(text) 
indextype is ctxsys.context local (partition part_tabx1, 
                                   partition part_tabx2, 
                                   partition part_tabx3) 
parallel 2;                                                              

DBMS_PCLUTIL.BUILD_PART_INDEXの並列性

UNUSABLEのCONTEXT索引を作成してから、DBMS_PCLUTIL.BUILD_PART_INDEXユーティリティを実行することで、ローカル索引並列性を実現できます。この方法により、特にパーティションより多くのCPUを使用している場合に、並列性が高くなります。

この例の元表には3つのパーティションがあります。最初にローカル・パーティションのUNUSABLEの索引を作成してから、DBMS_PCLUTIL.BUILD_PART_INDEXを実行すると、3つのパーティションがパラレルに作成されます(パーティション間並列性と呼びます)。また、各パーティション内の索引も、並列度2でパラレルに作成されます(パーティション内並列性と呼びます)。したがって、並列度の合計は6(3の2倍)になります。

create table part_tab3(id number primary key, text varchar2(100)) 
partition by range(id) 
(partition p1 values less than (1000), 
 partition p2 values less than (2000), 
 partition p3 values less than (3000)); 

begin 
  for i in 0..2999 
  loop 
      insert into part_tab3 values (i,'oracle'); 
  end loop; 
end; 
/ 

create index part_tab3x on part_tab3(text) 
indextype is ctxsys.context local (partition part_tabx1, 
                                   partition part_tabx2, 
                                   partition part_tabx3) 
unusable; 

exec dbms_pclxutil.build_part_index(jobs_per_batch=>3,
  procs_per_job=>2,
  tab_name=>'PART_TAB3',
  idx_name=>'PART_TAB3X',
  force_opt=>TRUE); 

索引エラーの表示

CREATE INDEX操作またはALTER INDEX操作が完了した後、Oracle Textのビューに索引エラーを表示できます。索引エラーを表示するには、CTX_USER_INDEX_ERRORSビューを問い合せます。全索引のエラーをCTXSYSとして表示するには、CTX_INDEX_ERRORSビューを問い合せます。

たとえば、索引に最後に発生したエラーを表示するには、次の文を入力します。

SELECT err_timestamp, err_text FROM ctx_user_index_errors
ORDER BY err_timestamp DESC;

索引エラーの削除

索引エラーのビューを消去するには、次の文を入力します。

DELETE FROM ctx_user_index_errors;

CTXCAT索引タイプの構文

1つのテキスト列と1つ以上の他の列に対して索引を結合します。SELECT文のWHERE句でCATSEARCH演算子を使用して、この索引を問い合せます。この型の索引は、複合問合せのために最適化されます。この索引はトランザクション型です。元表に対するDML操作によって、索引自体が自動的に更新されます。

CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.ctxcat 
[PARAMETERS
('[index set index_set]
[lexer lexer_pref]
[storage storage_pref] 
[stoplist stoplist] 
[section group sectiongroup_pref
[wordlist wordlist_pref] 
[memory memsize]');
[schema.]table(column)

索引付けする表および列の名前を指定します。

CTXCAT索引の作成時に指定する列は、CHAR型またはVARCHAR2型である必要があります。CTXCATでは、それ以外の型はサポートされていません。

仮想プライベート・データベース(VPD)保護表で索引を作成しようとすると、次のオプションのいずれかに該当しないかぎり失敗します。

  • VPDポリシーが作成され、INDEX文タイプに適用されない場合(デフォルト)

  • ポリシー関数が現在のユーザーに対してNULL条件を戻す場合

  • ユーザー(索引所有者)がSYSの場合

  • ユーザーにEXEMPT ACCESS POLICY権限がある場合

サポートされているCTXCATプリファレンス

index set index_set

CTXCAT索引を作成するには、索引セット・プリファレンスを指定します。索引セット・プリファレンスは、サブ索引を構成する列にネーミングします。索引セット列リストでネーミングされた列は、元表の行にNULL値を設定することはできません。NULL値を設定すると、エラーが発生します。

索引付けの前後に、列にNULL以外の値が設定されていることを確認してください。

「CTXCAT索引の作成」を参照してください。

索引パフォーマンスとサイズに関する考慮点

CTXCAT索引には問合せパフォーマンスの向上という利点がありますが、この型の索引の作成はコストがかかります。CTXCAT索引の作成に要する時間は、その合計サイズによって異なります。

CTXCAT索引の合計サイズに直接関係する要因は、次のとおりです。

  • 索引付けするテキストの合計数

  • 索引セットに含まれるコンポーネント索引の数

  • コンポーネント索引を構成する元表の列数

索引セットに多数のコンポーネント索引がある場合、更新が必要な索引が増えるため、DMLのパフォーマンスは低下します。

CTXCAT索引の作成には追加コストが必要になるため、索引セットにコンポーネント索引を追加する前に、それぞれのコンポーネント索引によりアプリケーションに提供される問合せパフォーマンス上の利点を慎重に考慮する必要があります。


関連項目:

CTXCAT索引の作成とその利点に関する詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

その他のCTXCATプリファレンス

CTXCAT型の索引を作成する場合、parameters文字列で使用できるのは、表1-6に記載されたサポートされている索引プリファレンスです。

表1-6 サポートされているCTXCAT索引プリファレンス

プリファレンス・クラス サポートされている型

データストア

このプリファレンス・クラスは、CTXCATに対してはサポートされていません。

フィルタ

このプリファレンス・クラスは、CTXCATに対してはサポートされていません。

レクサー

BASIC_LEXER(index_themes属性はサポートされていません)

CHINESE_LEXER

CHINESE_VGRAM_LEXER

JAPANESE_LEXER

JAPANESE_VGRAM_LEXER

KOREAN_MORPH_LEXER

ワードリスト

BASIC_WORDLIST


記憶域

BASIC_STORAGE


ストップリスト

1つの言語のストップリストのみがサポートされます(BASIC_STOPLIST型)。

セクション・グループ

フィールド・セクションのみがCTXCATに対してサポートされています。


サポートされないプリファレンスとパラメータ

CTXCAT索引を作成する場合、データストアおよびフィルタのプリファレンスは指定できません。セクション・グループ・プリファレンスでは、フィールド・セクション・プリファレンスのみがサポートされています。CONTEXT索引の場合と同様に、言語列、フォーマット列またはキャラクタ・セット列は指定できません。

CTXCAT索引の作成

この項では、CTXCAT索引の作成の簡単な例を示します。詳細な例は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

次のスキーマを使用してAUCTIONという表について考えます。

create table auction(
item_id number,
title varchar2(100),
category_id number,
price number,
bid_close date);

表の問合せに、priceに対する必須のテキスト問合せ句とオプションの構造化条件が含まれているとします。結果は、bid_closeに基づいてソートする必要があります。したがって、構造化およびソート基準に適した応答時間をサポートする索引が必要です。

ユーザーが入力する可能性がある様々なタイプの構造化問合せをサポートするために、カタログ索引を作成できます。構造化問合せの場合、CONTEXT索引に比べ、CTXCAT索引の方が問合せパフォーマンスが向上します。

索引を作成する場合は、最初に索引セット・プリファレンスを作成してオプションで記憶域プリファレンスを追加した後、そのプリファレンスに必要な索引を追加します。

begin
ctx_ddl.create_index_set('auction_iset');
ctx_ddl.add_index('auction_iset','bid_close');
ctx_ddl.add_index('auction_iset','price, bid_close');
end;

オプションで、記憶域プリファレンスを作成します。

begin
 ctx_ddl.create_preference('auction_st_pref', 'BASIC_STORAGE');
 ctx_ddl.set_attribute('auction_st_pref', 'I_TABLE_CLAUSE',
                       'tablespace TEXT storage (initial 5M)');
 ctx_ddl.set_attribute('auction_st_pref', 'I_ROWID_INDEX_CLAUSE',
                        'tablespace TEXT storage (initial 5M)');
 ctx_ddl.set_attribute('auction_st_pref', 'I_INDEX_CLAUSE',
                        'tablespace TEXT storage (initial 5M) compress 2');
end;
/ 

CTXCAT索引は、CREATE INDEX文を使用して次のように作成します。

create index auction_titlex on AUCTION(title) indextype is CTXSYS.CTXCAT
parameters ('index set auction_iset storage auction_st_pref');

CTXCAT索引の問合せ

ワードpokemonのtitle列を問い合せるには、次のように、通常の複合問合せを入力します。

select * from AUCTION where CATSEARCH(title, 'pokemon',NULL)> 0;
select * from AUCTION where CATSEARCH(title, 'pokemon', 'price < 50 order by
bid_close desc')> 0;

関連項目:

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

CTXRULE索引タイプの構文

CTXRULEタイプは、問合せの集合を含む列に対する索引です。この索引は、SELECT文のWHERE句でMATCHES演算子を使用して問い合せます。

CREATE INDEX [schema.]index on [schema.]table(rule_col) INDEXTYPE IS 
ctxsys.ctxrule 
[PARAMETERS ('[lexer lexer_pref] [storage storage_pref]
[section group section_pref] [wordlist wordlist_pref]
[classifier classifier_pref]');
[PARALLEL n];
[schema.]table(column)

索引付けする表およびルール列の名前を指定します。ルールは、問合せ互換文字列、問合せテンプレート文字列またはバイナリ・サポート・ベクター・マシンのルールになります。

CTXRULE索引の作成時に指定する列は、VARCHAR2型、CLOB型またはBLOB型である必要があります。CTXRULEタイプでは、それ以外のタイプはサポートされていません。

仮想プライベート・データベース(VPD)保護表で索引を作成しようとすると、次のいずれかに該当しないかぎり失敗します。

  • VPDポリシーで、INDEX文タイプがオンになっていない場合(デフォルト)

  • ポリシー関数が現在のユーザーに対してNULL条件を戻す場合

  • ユーザー(索引所有者)がSYSの場合

  • ユーザーにEXEMPT ACCESS POLICY権限がある場合

lexer_pref

MATCHES関数を使用して、問合せの処理およびその後のドキュメントの分類に使用するレクサー・プリファレンスを指定します。

SVN_CLASSFIER分類およびRULE_CLASSIFIER分類の両方で、BASIC_LEXERCHINESE_LEXERJAPANESE_LEXERKOREAN_MORPH_LEXERレクサーを使用できます。(「分類型」および「レクサー型」を参照してください。)

問合せ処理の場合、このレクサーがサポートしている演算子は、ABOUTSTEMANDNEARNOTORおよびWITHINです。

シソーラスを使用した演算子(BT*NT*PTRTSYNTRTRSYSTTなど)がサポートされています。ただし、これらの演算子は、MATCHES関数の入力時ではなく、索引付け時にシソーラスのスナップショットを使用して拡張されます。したがって、索引付けの後にシソーラスを変更する場合は、問合せセットの再索引付けが必要になります。

storage_pref

問合せに対して索引の記憶域プリファレンスを指定します。この記憶域プリファレンスを使用して索引表の格納方法を指定します。「記憶域型」を参照してください。

セクション・グループ

セクション・グループを指定します。このパラメータは問合せには影響を与えません。分類するドキュメントのセクションに適用されます。CTXRULE索引タイプに対して、次のセクション・グループがサポートされています。

  • BASIC_SECTION_GROUP

  • HTML_SECTION_GROUP

  • XML_SECTION_GROUP

  • AUTO_SECTION_GROUP

「セクション・グループ型」を参照してください。

CTXRULEでは、特殊セクションはサポートされません。また、NDATAセクションもサポートされません。

wordlist_pref

ワードリスト・プリファレンスを指定します。このプリファレンスを使用すると、問合せ語句でステミング操作を有効化できます。「ワードリスト型」を参照してください。

classifier_pref

分類プリファレンスを指定します。「分類型」を参照してください。CTX_CLS.TRAINで指定したのと同じプリファレンス名を使用する必要があります。

CTXRULE索引の作成例

ドキュメント・ルーティング・アプリケーションでのCTXRULE索引タイプの使用方法の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

CTXXPATH索引タイプの構文

この索引タイプは、下位互換用にのみ提供されています。XMLType列に対するexistsNode()問合せの高速化が必要な場合は、CTXXPATH索引を作成します。

CREATE INDEX [schema.]index on [schema.]table(XMLType column) INDEXTYPE IS 
ctxsys.CTXXPATH 
[PARAMETERS ('[storage storage_pref]
              [memory memsize]')];
[schema.]table(column)

索引付けする表および列の名前を指定します。

CTXXPATH索引の作成時に指定する列は、XMLTypeである必要があります。CTXXPATH索引では、それ以外の型はサポートされていません。

storage_pref

問合せに対して索引の記憶域プリファレンスを指定します。

記憶域プリファレンスを使用して、索引表の格納方法を指定します。第2章「Oracle Text索引付けの要素」「記憶域型」を参照してください。

memory memsize

索引付けに使用するランタイム・メモリー量を指定します。memsizeの構文は、次のとおりです。

memsize = number[M|G|K]

MはMB(メガバイト)、GはGB(ギガバイト)、KはKB(キロバイト)を表します。

memsizeの値は、1MBからCTX_PARAMETERSビューのMAX_INDEX_MEMORYの値までの間で指定する必要があります。MAX_INDEX_MEMORYの値より大きいメモリー・サイズを指定する場合は、CTX_ADM.SET_PARAMETERによってこのパラメータをmemsize以上に再設定する必要があります。

デフォルトは、CTX_PARAMETERSDEFAULT_INDEX_MEMORYに指定された値です。

CTXXPATHの例

XMLType列に対する索引の作成

CREATE INDEX xml_index ON xml_tab(col_xml) indextype is ctxsys.CTXXPATH;

または

CREATE INDEX xml_index ON xml_tab(col_xml) indextype is ctxsys.CTXXPATH
 PARAMETERS('storage my_storage memory 40M');

existsNodeを使用した表の問合せ

select xml_id from xml_tab x where
x.col_xml.existsnode('/book/chapter[@title="XML"]') > 0;

関連項目:

CTXXPATH索引タイプの使用方法の詳細は、『Oracle XML DB開発者ガイド』を参照してください。

関連項目

「CTX_DDL.CREATE_PREFERENCE

「CTX_DDL.CREATE_STOPLIST

「CTX_DDL.CREATE_SECTION_GROUP

「ALTER INDEX」

「CATSEARCH」

DROP INDEX


注意:

この項では、テキスト・ドメイン索引の削除に関連するDROP INDEX文について説明します。

DROP INDEX文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


用途

DROP INDEXを使用して、指定したテキスト索引を削除します。

構文

DROP INDEX [schema.]index [force];
[force]

オプションで、索引を強制的に削除します。forceオプションは、索引付け操作が失敗したときなど、索引の状態を判定できない場合に使用してください。

デフォルトでは、このオプションを使用しないことをお薦めします。通常のDROP INDEX呼出しが失敗した場合にのみ使用してください。

次の例では、カレント・ユーザーのデータベース・スキーマ内にあるdoc_indexという名前の索引を削除します。

DROP INDEX doc_index;

MATCHES

MATCHES演算子を使用して、指定したドキュメントに一致している問合せ表のすべての行を検索します。ドキュメントは、プレーン・テキスト、HTMLまたはXMLのドキュメントである必要があります。

MATCHES演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblinkを追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblinkは、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)

この演算子では、問合せセットにCTXRULE索引が必要です。

SVM_CLASSIFIER分類型が使用されている場合、MATCHESは0から100の範囲のスコアを戻します。数値が大きいほど、一致の信頼度が高いことを示します。この数値を取得するには、labelパラメータおよびMATCH_SCOREを使用します。一致スコアを使用して、カテゴリ固有のしきい値を特定のカテゴリに適用します。

SVM_CLASSIFIERタイプが使用されていない場合、この演算子は100(ドキュメントが基準と一致)または0(ドキュメントが不一致)のいずれかを戻します。

制限事項

オプティマイザがMATCHES問合せとともに機能問合せ呼出しを使用すると、問合せは失敗します。

構文

MATCHES(
[schema.]column,
document VARCHAR2 or CLOB
[,label INTEGER])
RETURN NUMBER;
column

索引付けられた問合せセットを含む列を指定します。

document

分類するドキュメントを指定します。ドキュメントは、プレーン・テキスト、HTMLまたはXMLドキュメントである必要があります。バイナリ・フォーマットはサポートされていません。

label

オプションで、MATCHES演算子で生成されたスコアを識別するラベルを指定します。MATCH_SCOREとともにこのラベルを使用します。

MATCHESの例

次の例では、表querytableを作成し、分類名および関連ルールを移入します。さらに、CTXRULE索引を作成します。

例では、分類するドキュメント文字列を指定してMATCHES問合せを入力します。SELECT文は、ドキュメントが適合する行(問合せ)をすべて戻します。

create table querytable (classification varchar2(64), text varchar2(4000));
insert into querytable values ('common names', 'smith OR jones OR brown');
insert into querytable values ('countries', 'United States OR Great Britain OR
France');
insert into querytable values ('Oracle DB', 'oracle NEAR database');

create index query_rule on querytable(text) indextype is ctxsys.ctxrule;

SELECT classification FROM querytable WHERE MATCHES(text, 'Smith is a common name
in the United States') > 0;


CLASSIFICATION
----------------------------------------------------------------
common names
countries

関連項目

「MATCH_SCORE」

「CTXRULE索引タイプの構文」

「CTX_CLS.TRAIN

MATCHES演算子を使用する、単純な分類および管理型分類の拡張例については、『Oracle Textアプリケーション開発者ガイド』を参照してください。

MATCH_SCORE

文でMATCH_SCORE演算子を使用して、MATCHES問合せによって生成されたスコアが戻されるようにします。

MATCH_SCORE演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblinkを追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblinkは、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)

SVM_CLASSIFIER分類型が使用されている場合、この演算子は0から100の範囲のスコアを戻します。一致スコアを使用して、カテゴリ固有のしきい値を特定のカテゴリに適用します。

SVM_CLASSIFIER分類が使用されていない場合、この演算子は100(ドキュメントが基準と一致)または0(ドキュメントが不一致)のいずれかを戻します。

構文

MATCH_SCORE(label NUMBER)
label

問合せで生成されたスコアを識別するための数値を指定します。この数値を使用して、このスコアを戻すMATCHES句を識別します。

一致スコアを取得するには、次の構文を使用します。

select cat_id, match_score(1) from training_result where matches(profile,
text,1)>0;

関連項目

「MATCHES」

SCORE

SELECT文でSCORE演算子を使用して、CONTAINS問合せによって生成されたスコア値が戻されるようにします。SCORE演算子は、SELECTORDER BYまたはGROUP BY句で使用できます。

SCORE演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblinkを追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblinkは、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)

構文

SCORE(label NUMBER)
label

問合せで生成されたスコアを識別するための数値を指定します。この数値を使用して、このスコアを戻すCONTAINS句を識別します。

1つのCONTAINS

SCORE演算子を(SELECT句などで)コールする場合は、次のように、CONTAINS句がSCOREラベル値を参照するように指定します。

SELECT SCORE(1), title from newsindex 
           WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC;

複数のCONTAINS

newsデータベースでは、ニュース記事のタイトルおよび本文が別々に格納および索引付けされるとします。次の問合せは、タイトルにOracleというワードおよび本文にjavaというワードを含むすべてのドキュメントを戻します。戻された記事は、最初のCONTAINS (Oracle)に対するスコア順にソートされた後、次のCONTAINS (java)のスコア順にソートされます。

SELECT title, body, SCORE(10), SCORE(20)
FROM news
WHERE CONTAINS (news.title, 'Oracle', 10) > 0 OR
CONTAINS (news.body, 'java', 20) > 0 
ORDER BY SCORE(10), SCORE(20);