1 Oracle TextのSQL文と演算子

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

ノート:

Oracle Database 23ai以降では、DBMS_SEARCH PL/SQLパッケージを使用して、テキストおよび範囲ベースのユビキタス検索のための検索索引を作成、管理または問い合せることもできます。「DBMS_SEARCHパッケージ」を参照してください。

1.1 ALTER INDEX

ALTER INDEX文を使用して、Oracle Text索引、Oracle Text検索索引、JSON検索索引、XML検索索引、ハイブリッド・ベクトル索引などの既存の索引を変更または再構築します。

ノート:

この項では、Oracle Textドメイン索引の管理に関連するALTER INDEX文について説明します。ALTER INDEX文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください

ALTER INDEXの用途

CONTEXTCTXCATまたはCTXRULE索引の変更またはメンテナンス作業を実行します。

ノート:

  • ALTER INDEXを使用してFAST_DMLからFAST_QUERYにシフトすると、DRG-11380「同期されていない索引に対する操作は許可されません」というエラーが発生することがあります。このエラーを解決するには、その索引に対してSYNCコマンドを実行してから、ALTER INDEXを再試行します。

  • ALTER INDEXの実行中にDMLまたは問合せのワークロードを実行すると、ORA-00060またはその他のエラーが発生し、索引がUNUSABLEとマークされることがあります。これは、ALTER INDEXがDDL操作のように動作し、デフォルトではオンラインで実行されないためです。このエラーを解決するには、ALTER INDEX文でONLINEパラメータを設定します。

  • FAST_DMLおよびFAST_QUERYオプションは、オンライン操作ではサポートされていません。

すべての索引タイプ

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

  • 索引または索引パーティションの名前変更。ALTER INDEX RENAME構文を参照してください。

  • 索引のストップワードの追加。ALTER INDEX REBUILD構文を参照してください。

  • sub_lexerを追加または削除し、特定のシンボル(言語または言語に依存しないシンボル)に対してストップワードを削除または設定します。ALTER INDEX Sub_Lexer構文を参照してください

  • 異なるプリファレンスを使用した索引の再構築。一部の制限事項がCTXCAT索引タイプに適用されます。ALTER INDEX REBUILD構文を参照してください。

ノート:

Oracle Textの索引タイプCTXCATは、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCATは、将来のリリースで削除される可能性があります。

CONTEXT問合せの代替文法としてCTXCATおよびCTXCAT文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXTでのトランザクションに近い動作は、SYNC(ON COMMIT)または短い期間(できればSYNC(EVERY [time-period]))を使用して実現できます。

CTXCATは、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCATで管理が困難な場合があります。CTXCATへの索引セットの追加は、CONTEXT索引タイプでFILTER BY列とORDER BY列、またはSDATA列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCATが適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT索引タイプを選択することをお薦めします。

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 ('REPLACE DATASTORE datastore_pref')
    ALTER INDEX REBUILD PARAMETERS ('REPLACE WORDLIST wordlist_pref')
  • JSON検索索引のALTER INDEX構文: DATAGUIDESEARCH_ONなどのJSON検索索引プリファレンスの変更に使用します。

  • XML検索索引のALTER INDEX構文: SEARCH_ONなどのXML検索索引プリファレンスの変更に使用します。

  • ハイブリッド・ベクトル索引のALTER INDEX構文: 既存のハイブリッド・ベクトル索引の変更または再構築に使用します。

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構文

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

ALTER INDEX index_name PARAMETERS (paramstring)
paramstring

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

  • 'REPLACE METADATA'

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

  • ADD MDATA SECTION secname TAG sectag READ ONLY

    更新不可なMDATAセクションを作成し、これらのMDATAセクションの問合せが余分なカーソルを$I表で開かないようにします。

  • '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の項を参照してください。

  • 'ADD SDATA SECTION'

    索引にSDATAセクションを動的に追加します。SDATAセクションを追加できるのは、BASICHTMLXMLNEWSの各セクション・グループのみです。グローバルとローカルの両方の索引をサポートします。索引に同期化された新しいドキュメントは、この新しいプリファレンスを反映します。構文は次のとおりです。

    ALTER INDEX index_name PARAMETERS (ADD SDATA SECTION sdata_section_name TAG sdata_section_tag DATATYPE sdata_section_datatype);

    データ型は、VARCHAR2CHARNUMBERDATEまたはRAWです。

    詳細は、SDATAセクションの追加を参照してください。

    ノート:

    SDATAセクションを追加する前に索引付けされたドキュメントは、この新しいプリファレンスを反映しません。この場合、索引を再構築します。

上に説明した各パラメータには、ALTER INDEX REBUILD PARAMETERSバージョンと同等のパラメータがありますが、ADD SDATA SECTIONは例外です。

たとえば、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の新しい名前を指定します。Oracle Database 12c リリース2 (12.2)にアップグレードされていない以前のリリースのOracle Databaseでは、new_index_nameパラメータの長さは25バイト以下、パーティション索引は21バイト以下です。26バイト以上の名前(またはパーティション索引に22バイト以上)を指定するとエラーが戻され、名前変更した索引は無効になります。

ノート:

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

データベースをアップグレードしても、compatibleパラメータを12.2に設定しないと、new_index_nameパラメータに設定できる値は30バイト以下、パーティション索引では30バイトです。

データベースをアップグレードして、compatibleパラメータを12.2に設定する、またはnew Oracle Database 12c リリース2 (12.2)インストールに設定すると、new_index_nameパラメータに設定できる値は128バイト以下、パーティション索引では128バイトです。

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構文を使用して、TEXT索引表に関連するINMEMORYオプションを追加または削除できません。

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

ALTER INDEX REBUILD PARALLEL n
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およびSYNCです。

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

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

ONLINE

元表での更新、挿入および削除を続行できます。元表を問い合せることはできません。ONLINEキーワードは、Enterprise EditionのOracle Databaseでのみ使用できます。

ノート:

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

PARAMETERS(paramstring)

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

ノート:

Oracle Textは、索引にディープ・コピーされたメタデータ値を使用して索引を再構築します。CTX_REPORT.CREATE_INDEX_SCRIPTプロシージャを使用して、ユーザー・プリファレンスを再作成できます。このプロシージャは、元のテキスト索引で使用されているものと同じプリファレンスを含むスクリプトを生成します。ただし、プリファレンスの名前はシステムによって生成されます。

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] MAINTENANCE AUTO | MAINTENANCE MANUAL]
     [[METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
     [[METADATA] TRANSACTIONAL | NONTRANSACTIONAL
     [[METADATA] [ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE]]

     [[METADATA] OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]

|[DATAGUIDE [ON | OFF | ON CHANGE [ADD_VC|Function_name]] 
|[SEARCH_ON (NONE | TEXT | TEXT_VALUE[(data_types)] | VALUE[(data_types)] | TEXT_VALUE_STRING)] 
| RESUME [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は、索引の特定のパーティションに対して指定でき、索引全体に対しては指定できません。

ALTER INDEX REBUILDでは、NOPOPULATEキーワードを明示的に指定しないかぎり、移入された索引がデフォルトで作成されることに注意してください。CTX_REPORT.CREATE_INDEX_SCRIPTおよびCTX_REPORT.DESCRIBE_INDEXの出力には、このような索引のNOPOPULATEキーワードが含まれます。

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

新しいワードリスト・プリファレンスSEPARATE_OFFSETSは、索引のtoken_infoをDOCIDとして1つの場所に格納し、offsetsを別の場所に格納することを指定します。CONTEXT索引のSEPARATE_OFFSETSオプションを使用して応答時間を改善する方法の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。

BASIC_STORAGE型の次の記憶域属性(いずれか)についてのみ、このプロシージャで既存の索引表を変更する場合は、データが再索引付けされません。

  • BIG_IO

  • I_INDEX_CLAUSE

  • I_TABLE_CLAUSE

  • SEPARATE_OFFSETS

ノート:

  • CONTEXT索引タイプのBIG_IO属性は、Oracle Database 23aiで非推奨になり、将来のリリースで無効化または削除される可能性があります。

  • Oracleでは、この値をデフォルト値Nに設定することをお薦めします。BIG_IOは、索引ポストの長さが4KBを超えた場合にシークのコストを削減するために導入されました。ただし、内部コードは比較的非効率であり、属性を新しい索引オプションと組み合せることはできません。シーク・コストは、ソリッド・ステート・ディスクまたは非揮発性メモリー・デバイス(NVMe)にはあまり関連せず、ポストがキャッシュされている場合、シーク・コストは関係ありません。したがって、この設定はほとんどの索引にとってほとんどメリットがありません。

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構文を参照してください。

ノート:

ALTER INDEX REPLACE METDATAオプションは基本的にDDL操作である(かつONLINE操作ではない)ため、基礎となる表(問合せを含む)でロックをリクエストする同時DML操作があると失敗する可能性があります。ALTER INDEX REPLACE METDATA操作は、表または索引で他のユーザー操作が進行中でないときのシステムが静かな時間に実行する必要があります。

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

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

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

警告:

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

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

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

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

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

  • FORWARD_INDEXREPLACE METADATAは使用しないでください。かわりにREPLACE STORAGEを使用してください。

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

REPLACE [METADATA] MAINTENANCE AUTO | MAINTENANCE MANUAL

元表に対する挿入、更新または削除があるときのCONTEXT索引と検索索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

次のいずれかのメンテナンス・タイプを指定できます。

表1-1 メンテナンス・タイプ

メンテナンス・タイプ 説明

MAINTENANCE AUTO

これは、Oracle Text CONTEXTおよび検索索引を同期するためのデフォルトのメソッドです。

このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

ノート: シャドウ索引では自動メンテナンスはサポートされていません。自動メンテナンス・モードで準拠する要件および制限事項の詳細なリストは、『Oracle Textアプリケーション開発者ガイド』を参照してください。

MAINTENANCE MANUAL

このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

MAINTENANCE AUTOメソッドとMAINTENANCE MANUALメソッドの切替えに関するガイドラインおよび例は、Oracle Textアプリケーション開発者ガイドを参照してください。

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

元表に対する挿入、更新または削除があるときのCONTEXT索引と検索索引の同期のためのSYNCタイプを指定します。

これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

ノート:

デフォルトでは、CONTEXT索引と検索索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、SYNCメソッドを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

次のSYNCメソッドのいずれかを指定できます。

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

SYNCタイプ 説明

MANUAL

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

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

EVERY interval-string

デフォルトの同期間隔は30秒に設定されています。

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

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

自動同期化構文の例は、一定間隔での自動索引同期の有効化を参照してください。

ON COMMIT

コミットの直後に索引を同期化します。コミットは、同期化が完了するまで戻りません。Oracle Databaseリリース18cより以前、同期は個別のトランザクションとして実行されていました。データがコミットされていても索引が変更されていない時間間隔(通常は短い間隔)がありました。Oracle Databaseリリース18cからは、同期が同じトランザクションの一部として実行されます。

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

Oracle Databaseリリース18cより以前、同期操作には独自のトランザクション・コンテキストがありました。この操作が失敗しても、データ・トランザクションはコミットされていました。Oracle Databaseリリース18cからは、リカバリ不能な索引同期エラーが発生した場合に、データ・トランザクション全体がロールバックされます。リカバリ可能な(個別の行の)同期エラーはCTX_USER_INDEX_ERRORSビューに記録されますが、トランザクションは完了します。CREATE INDEX索引エラーの表示を参照してください。

ON COMMIT同期は、STAGE_ITAB索引が有効なときに最も有効に機能します。これが有効でないと、主索引が大幅に断片化し、頻繁なOPTIMIZEコールが必要になります。

ON COMMIT同期は、SEARCH INDEXおよびJSON検索索引のデフォルトの同期方法です。

ON COMMIT構文の例は、一定間隔での自動索引同期の有効化を参照してください。

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

ローカル・パーティション索引の各パーティションには、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');
REPLACE [METADATA] [ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE]

Oracle Text索引に基づくドキュメントの列を更新すると、索引の同期が実行されるまでドキュメントには検索操作使用不可のマークが付きます。索引の非同期更新を有効化すると、索引列の更新後に索引が同期化される前でも、ドキュメントが検索可能になります。索引が同期化されるまで、Oracle Textは古いドキュメントのコンテンツを使用してユーザーの問い合わせに答えます。

ノート:

同期更新は、TRANSACTIONALオプションでサポートされていません。更新は動作を遅くします。

TEXT索引の非同期更新を有効にするには、次のようにします。

ALTER INDEX idx PARAMETERS ('REPLACE METADATA asynchronous_update');

TEXT索引の非同期更新を無効にするには、次のようにします。

ALTER INDEX idx PARAMETERS ('REPLACE METADATA synchronous_update');

ノート:

CONTEXT索引タイプのASYNCHRONOUS_UPDATE設定は、Oracle Database 23aiで非推奨になり、将来のリリースで無視または削除される可能性があります。

Oracleでは、将来のリリースでこの属性を無視または削除する可能性があります。Oracleでは、この値をデフォルト値SYNCHRONOUS_UPDATEに設定することをお薦めします。更新時の予期しない結果損失を回避するには、SYNC (ON COMMIT)またはSYNC(EVERY [time-period])を短い期間で使用します。

ASYNCHRONOUS_UPDATE設定は、更新が"delete followed by insert"として実装され、削除が即時(コミット時)であり、挿入が索引同期中にのみ実行されるという事実の回避策として導入されました。ただし、この設定は他のいくつかの索引オプションと互換性がありません。Oracleでは、使用を中止することをお薦めします。

REPLACE [[METADATA] OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]

自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます。

表1-3 ALTER INDEX OPTIMIZEのタイプ

OPTIMIZEタイプ 説明

MANUAL

自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

AUTO_DAILY

索引作成パラメータ・リストにOPTIMIZE (AUTO_DAILY)を指定すると、繰り返し実行されるトークン最適化ジョブと繰り返し実行されるフル最適化ジョブが索引およびパーティションごとにスケジュールされます。
  • トークン最適化ジョブは、毎週土曜日の夜午前12時から実行して$S*表を最適化するようにスケジュールされます。

    このジョブは、JSONデータ型以外(VARCHAR2CLOBまたはBLOB)の表で実行され、最も断片化されている上位10個のトークン(自動的に決定される)を最適化します。

  • フル最適化ジョブは、土曜日の夜を除き、毎日深夜12時から午前3時まで実行するようにスケジュールされています。午前3時より前に開始されていないジョブはスキップされます。このようなスキップされたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。

    このジョブは、JSONデータ型またはIS JSONチェック制約を持つ表に対して実行されます。

デフォルトでは、既存の索引にOPTIMIZE (AUTO_DAILY)は設定されません。自動バックグランド索引最適化を有効にするには、ALTER INDEXを使用する必要があります。

EVERY "interval-string"

スケジューラ・ジョブと同じ構文の値interval-stringで指定された一定の間隔で自動的に実行されます。
  • トークン最適化ジョブは、JSON以外のデータ型を持つ表に対してスケジュールされます。

    このジョブは、ユーザーが指定した間隔で、最上位10の最も断片化されたトークンのトークンを最適化します。最も断片化された上位10個のトークンの最適化処理を実行します

  • フル最適化ジョブは、JSONデータ型またはIS JSONチェック制約を持つ表に対してスケジュールされます。

    このジョブは、毎週土曜日の夜午前12時に$S*表に対してフル最適化を実行します。

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

複数の索引でOPTIMIZE EVERY "interval-string"オプションを使用する場合、索引ごとに異なるジョブが作成されます。これらのジョブは同時に実行されます。

AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。構文は次のとおりです。

... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...
RESUME [MEMORY memsize]

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

ノート:

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

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をサポートしている場合は、索引付けを高速化できます。

JSON検索索引のALTER INDEX構文

ALTER INDEX [schema.]index REBUILD 
PARAMETERS(
  [DATAGUIDE ON [CHANGE (ADD_VC | function_name)] | OFF]
  [SEARCH_ON (TEXT | TEXT_VALUE[(data_types)] | VALUE[(data_types)] | TEXT_VALUE_STRING)]
  [REMOVE SEARCH_ON VALUE(VARCHAR2)]
  );

ノート:

  • JSON検索索引プリファレンスを変更するためのALTER INDEX REBUILD PARAMETERS文では、REPLACEキーワードは必要ありません。

  • 単一のALTER INDEX文でJSONとOracle Textの両方の検索索引プリファレンスを変更することはできません。

  • JSON検索索引プリファレンス(DATAGUIDESEARCH_ONなど)を指定すると、PARAMETERS句の他のプリファレンスは更新されません。同様に、Oracle Text検索索引プリファレンス(STORAGELEXERなど)を指定した場合、JSONプリファレンスは更新されません。

[schema.]index

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

DATAGUIDE ON | OFF

既存のJSON検索索引のデータ・ガイドのサポートを変更します。デフォルトでは、データ・ガイドをサポートせずにJSON検索索引が作成されます。JSONデータ・ガイドのサポートを有効にすると、変更トリガー・プロシージャも定義できます。

ノート:

DATAGUIDE句は、JSON検索索引にのみ使用します。

次のオプションのいずれかを指定します。

  • ON: データ・ガイドのサポートを有効にします。DATAGUIDEの値をONに設定した場合は、独自のPL/SQLプロシージャを定義するか、事前定義された変更トリガー・プロシージャADD_VCを使用することもできます。

    ADD_VCは、仮想列がデータ・ガイドに基づいて作成されたかどうかを示します。

    function_nameは、データ・ガイドが変更された場合に実行する関数を指定します。

  • OFF: データ・ガイドのサポートと変更トリガー・プロシージャの両方を無効にします。一般的な検索インデックス機能のみを提供します。

    ノート:

    SEARCH_ON句の値がNONEに設定されている場合、DATAGUIDE句はオフにできません。

Oracle Database JSON開発者ガイドデータ・ガイド対応検索索引の変更トリガーを参照してください。

SEARCH_ON (TEXT | TEXT_VALUE[(data_types)] | VALUE[(data_types)] | TEXT_VALUE_STRING)
既存のJSON検索索引に指定された検索プリファレンスを変更します。

ノート:

SEARCH_ON句は、JSONおよびXML検索索引にのみ使用できます。

次のSEARCH_ONオプションのいずれかを指定できます。

表1-4 ALTER_INDEX SEARCH_ONのオプション

オプション 説明

TEXT

全文検索コンポーネントを有効にします。これは、全文検索問合せに対してテキスト・データのみが索引付けされることを示します。これには、パス情報に依存する問合せも含まれます。

索引は、JSON_TEXTCONTAINS述語、およびJSON検索索引の使用時に文字列を操作するJSON_VALUE述語またはJSON_EXISTS述語に使用されます。

問合せに全文検索のみが含まれ、文字列範囲検索や数値検索は含まれない場合、このオプションを指定すると、索引メンテナンス時間とディスク領域を節約できます。

例:

ALTER INDEX [schema.]index REBUILD
  PARAMETERS ('SEARCH_ON TEXT);

VALUE[(data_types)]

指定されたデータ型の範囲検索コンポーネントを有効にします。これにより、関係演算子(>、<、==、>=、<=、!=)を使用して述語に対して索引を取得できます。SEARCH_ON VALUEのみで作成されたJSON検索索引は、JSON_TEXTCONTAINS演算子を使用して全文問合せに応答できません。

サポートされるデータ型:

  • NUMBER (数値の索引付けの場合)。

  • TIMESTAMP (日時値の索引付けの場合)。

  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

データ型を指定しない場合、サポートされているすべてのデータ型に対して範囲検索索引付けが索引によって有効になります。

ノート:

BINARY_DOUBLEデータ型は、XML検索索引にのみ使用できます。

例:

  • この例では、デフォルトの動作を指定します。
    ALTER INDEX [schema.]index REBUILD
      PARAMETERS ('SEARCH_ON VALUE');
  • 次の例では、VALUE(data_types)構文を使用してデータ型を明示的に指定します。

    ALTER INDEX [schema.]index REBUILD
      PARAMETERS ('SEARCH_ON VALUE(NUMBER)');
    ALTER INDEX [schema.]index REBUILD
      PARAMETERS ('SEARCH_ON VALUE(NUMBER, TIMESTAMP, VARCHAR2)');

TEXT_VALUE[(data_types)]

指定したデータ型の全文検索コンポーネントと範囲検索コンポーネントの両方を有効にします。

サポートされるデータ型:

  • NUMBER (数値の索引付けの場合)。

  • TIMESTAMP (日時値の索引付けの場合)。

  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

データ型を指定しない場合、索引によって、NUMBERおよびTIMESTAMPデータ型に対する全文検索および範囲検索索引付けが有効になります。

例:

  • この例では、デフォルトの動作を指定します。
    ALTER INDEX [schema.]index REBUILD 
      PARAMETERS('SEARCH_ON TEXT_VALUE');
  • 次の例では、TEXT_VALUE(data_types)構文を使用してデータ型を明示的に指定します。

    ALTER INDEX [schema.]index REBUILD 
      PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER)');
    ALTER INDEX [schema.]index REBUILD 
      PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER, TIMESTAMP)');

TEXT_VALUE_STRING

数値、日時および完全な文字列の値に対してテキストおよび範囲ベースの索引が作成されることを示します。これにより、NUMBERTIMESTAMPおよびVARCHAR2データ型の全文検索コンポーネントと範囲検索コンポーネントの両方が有効になります。

文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

例:

ALTER INDEX [schema.]index REBUILD
  PARAMETERS ('SEARCH_ON TEXT_VALUE_STRING');

SEARCH_ONの遷移を指定するためのガイドライン:

ALTER INDEX REBUILD文でSEARCH_ON句を指定すると、現在の構成と、有効にするコンポーネントのセットの両方が決定されます。その後、文によって新しいコンポーネントが有効化され、索引が再構築されます。要求されたすべてのコンポーネントがすでに有効になっている場合、このアクションは索引の再構築と同じです。再構築により、新しく有効になった索引付けおよび問合せコンポーネントを使用してJSON検索索引を再生成できます。

異なるデータ型の範囲検索コンポーネントは、独立したコンポーネントとみなされます。

VARCHAR2の範囲検索コンポーネントのみを無効にできます。他のコンポーネントを無効にするには、まずDROP INDEX文を使用して索引を削除してから、必要なコンポーネントを有効にして索引を再作成する必要があります。

索引付けコンポーネントの削除:

VARCHAR2データ型は、任意の範囲検索コンポーネント(VALUETEXT_VALUEまたはTEXT_VALUE_STRING)から削除できます。VARCHAR2データ型を削除すると、索引メンテナンス時間とディスク領域を節約できます。

構文は次のとおりです。
REMOVE SEARCH_ON VALUE(VARCHAR2)

XML検索索引のALTER INDEX構文

ALTER INDEX [schema.]index REBUILD 
PARAMETERS(
  [SEARCH_ON (TEXT | TEXT_VALUE(data_types) | VALUE (data_types))]
  [REMOVE SEARCH_ON VALUE(VARCHAR2)]
  );
[schema.]index

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

SEARCH_ON (TEXT | TEXT_VALUE(data_types) | VALUE(data_types))
既存のXML検索索引に指定された検索プリファレンスを変更します。

ノート:

SEARCH_ON句は、JSONおよびXML検索索引にのみ使用できます。

次のSEARCH_ONオプションのいずれかを指定できます。

表1-5 ALTER_INDEX SEARCH_ONのオプション

オプション 説明

TEXT

全文検索コンポーネントを有効にします。これは、全文検索問合せに対してテキスト・データのみが索引付けされることを示します。これには、パス情報に依存する問合せも含まれます。

索引は、XQueryフルテキスト演算子および句を参照するXMLEXISTS述語に使用されます。

問合せに全文検索のみが含まれ、文字列範囲検索や数値検索は含まれない場合、このオプションを指定すると、索引メンテナンス時間とディスク領域を節約できます。

次に例を示します。

ALTER INDEX [schema.]index REBUILD 
  PARAMETERS ('SEARCH_ON TEXT');

VALUE(data_types)

指定されたデータ型の範囲検索コンポーネントを有効にします。

これにより、関係演算子(>、<、==、>=、<=、!=)を使用して述語に対して索引を取得できます。SEARCH_ON VALUEコンポーネントのみが有効になっているXML検索索引は、XQueryフルテキスト演算子がXMLEXISTS述語に存在する場合、全文問合せに応答できません。

1つ以上のデータ型を指定する必要があります。

  • BINARY_DOUBLEおよびNUMBER (数値の索引付けの場合)。
  • TIMESTAMP (日時値の索引付けの場合)。
  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

次に例を示します。

ALTER INDEX [schema.]index REBUILD 
  PARAMETERS ('SEARCH_ON VALUE(BINARY_DOUBLE)');
ALTER INDEX [schema.]index REBUILD 
  PARAMETERS ('SEARCH_ON VALUE(BINARY_DOUBLE, NUMBER, TIMESTAMP, VARCHAR2)');

TEXT_VALUE(data_types)

指定したデータ型の全文検索コンポーネントと範囲検索コンポーネントの両方を有効にします。範囲検索問合せの場合は、NUMBER (数値の索引付けの場合)やTIMESTAMP (日時値の索引付けの場合)などの1つ以上のデータ型を指定する必要があります。

次に例を示します。

ALTER INDEX [schema.]index REBUILD 
  PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER)');
ALTER INDEX [schema.]index REBUILD 
  PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER, TIMESTAMP)');

ノート:

XML検索索引にはSEARCH_ON NONEおよびSEARCH_ON TEXT_VALUE_STRINGを使用できません。

XML検索索引のTEXT_VALUEおよびVALUEオプションを使用してデータ型を明示的に指定する必要があります。指定しないと、文でエラーが発生します。

SEARCH_ONの遷移を指定するためのガイドライン:

ALTER INDEX REBUILD文でSEARCH_ON句を指定すると、現在の構成と、有効にするコンポーネントのセットの両方が決定されます。その後、文によって新しいコンポーネントが有効化され、索引が再構築されます。要求されたすべてのコンポーネントがすでに有効になっている場合、このアクションは索引の再構築と同じです。再構築により、新しく有効にした索引付けおよび問合せコンポーネントを使用してXML検索索引を再生成できます。

異なるデータ型の範囲検索コンポーネントは、独立したコンポーネントとみなされます。

VARCHAR2の範囲検索コンポーネントのみを無効にできます。他のコンポーネントを無効にするには、まずDROP INDEX文を使用して索引を削除してから、必要なコンポーネントを有効にして索引を再作成する必要があります。

索引付けコンポーネントの削除:

VARCHAR2データ型は、任意の範囲検索コンポーネント(VALUEまたはTEXT_VALUE)から削除できます。VARCHAR2データ型を削除すると、索引メンテナンス時間とディスク領域を節約できます。

構文は次のとおりです。
REMOVE SEARCH_ON VALUE(VARCHAR2)

ハイブリッド・ベクトル索引のALTER INDEX構文

ALTER INDEX [schema.]index_name REBUILD 
  PARAMETERS(
      ['UPDATE VECTOR INDEX']
      ['REPLACE vectorizer vectorizer_pref_name']
      )
  [PARALLEL n];

ノート:

  • PARAMETERS句を指定しない場合、ハイブリッド・ベクトル索引のすべての部分(Oracle Text索引とベクトル索引の両方)が既存のプリファレンス設定で再作成されます。

  • ALTER INDEX RENAME構文を使用したハイブリッド・ベクトル索引の名前変更はサポートされていません。

  • ALTER INDEXパラメータUDPATE VECTOR INDEXは、ローカルHVIおよびHNSWベクトル索引ではサポートされていません。

[schema.]index_name

変更するハイブリッド・ベクトル索引の名前を指定します。

PARAMETERS(UPDATE VECTOR INDEX)

ハイブリッド・ベクトル索引のベクトル索引部分のみを元のプリファレンス設定で再作成します。

PARAMETERS(REPLACE vectorizer vectorizer_pref_name)
指定されたベクトル化プリファレンス設定で、ハイブリッド・ベクトル索引のベクトル索引部分のみを再作成します。

ノート:

HVI以外の索引では、存在しないものを置き換えることができないため、置換操作によってエラーがスローされます。
PARALLEL

CREATE HYBRID VECTOR INDEX文で説明されているように、パラレル索引付けを指定します。

PARALLEL句の詳細は、「CREATE HYBRID VECTOR INDEX」を参照してください。

例:

既存のハイブリッド・ベクトル索引を変更する方法の例を次に示します。
  • ハイブリッド・ベクトル索引のすべての部分を再構築するには:

    ハイブリッド・ベクトル索引のすべての部分(Oracle Text索引とベクトル索引の両方)を元のプリファレンス設定で再構築するには、次の構文を使用します:

    構文:

    ALTER INDEX index_name REBUILD [PARALLEL n];

    ハイブリッド・ベクトル索引の両方の部分を再構築する場合、PARAMETERS句を指定する必要はありません。

    例:

    ALTER INDEX my_hybrid_idx REBUILD;
    
    SELECT (select id from doc_table where rowid = jt.doc_rowid) as doc,
           jt.chunk
    FROM JSON_TABLE(
             DBMS_HYBRID_VECTOR.SEARCH(
               json(
                 '{ "hybrid_index_name" : "my_hybrid_idx",
                    "vector" : 
                     { "search_text"    : "vector based search capabilities",
                       "search_mode"    : "CHUNK"
                     },
                    "return" : 
                     { "topN"           : 10 }
                 }')
               ),
               '$[*]' COLUMNS doc_rowid  PATH '$.rowid',
                              chunk      PATH '$.chunk_text') jt;
  • ベクトル索引の部分のみを再構築するには:

    ハイブリッド・ベクトル索引のベクトル索引部分のみを元のプリファレンス設定で再構築するには、次の構文を使用します:

    構文:

    ALTER INDEX index_name REBUILD 
      PARAMETERS('UPDATE VECTOR INDEX') [PARALLEL n];

    例:

    ALTER INDEX my_hybrid_idx REBUILD 
      PARAMETERS('UPDATE VECTOR INDEX') PARALLEL 3;
    
    SELECT (select id from doc_table where rowid = jt.doc_rowid) as doc,
           jt.chunk
    FROM JSON_TABLE(
             DBMS_HYBRID_VECTOR.SEARCH(
               json(
                 '{ "hybrid_index_name" : "my_hybrid_idx",
                    "vector" : 
                     { "search_text"    : "vector based search capabilities",
                       "search_mode"    : "CHUNK"
                     },
                    "return" : 
                     { "topN"           : 10 }
                 }')
               ),
               '$[*]' COLUMNS doc_rowid  PATH '$.rowid',
                              chunk      PATH '$.chunk_text') jt;
  • ベクトル化プリファレンスで索引を再作成するには:

    DBMS_VECTOR_CHAIN.CREATE_PREFERENCE PL/SQLファンクションを使用してベクトル化プリファレンスを作成できます。ベクトル化プリファレンスの作成方法の詳細は、unresolvable-reference.html#GUID-B83978CD-EAF8-4794-9652-F335C54C3385を参照してください。プリファレンスを作成した後、REPLACE vectorizerパラメータを使用してプリファレンス名をここで渡します。

    構文:

    ALTER INDEX index_name REBUILD 
      parameters('REPLACE vectorizer vectorizer_pref_name') [PARALLEL n];

    ノート:

    HVI以外の索引の場合は、REPLACE操作によってエラーがスローされます。

    例:

    ALTER INDEX my_hybrid_idx REBUILD 
      parameters('REPLACE vectorizer my_vectorizer_pref') [PARALLEL n];
  • モデルまたはベクトル索引タイプ(あるいはその両方)のみを置換するには

    既存のHVI索引では、次の構文を使用して完全なベクトル化プリファレンスを指定せずに、モデルまたは索引タイプ(あるいはその両方)を置換できます。

    構文:

    ALTER INDEX schema.index_name REBUILD[
    parameters('REPLACE MODEL model_name VECTOR_IDXTYPE hnsw/ivf')];

    例:

    ALTER INDEX schema.my_hybrid_idx REBUILD[
    parameters('REPLACE MODEL my_model_name VECTOR_IDXTYPE ivf')];

    ノート:

    HVI以外の索引の場合、この構文はエラーをスローします。ベクトル化がモデル/vector_idxtypeと一緒に指定されている場合は、ベクトル化またはモデル/vector_idxtypeのいずれか1つのみが許可されるため、エラーが発生します。
  • 既存のText SEARCHまたはJSON SEARCH索引のHVIへの変換

    次の構文を使用して、索引のテキスト/JSON部分を完全に再構築することなく、既存のText SEARCHまたはJSON SEARCH索引をHVIに変換(アップコンバート)できます。この構文は、HVI以外の索引でのみサポートされます。この操作の後、索引はHVI索引に変更されます。これは、すべてのHVI操作がサポートされ、ctx_reportがこの更新を正しく反映することを意味します。

    構文:

    ALTER INDEX schema.index_name REBUILD
    [parameters('add vectorizer_fast vectorizer_pref_name')]; 

    例:

    ALTER INDEX schema.my_hybrid_idx REBUILD
    [parameters('add vectorizer_fast my_vectorizer_pref')];
    「アップコンバート」に適用できないその他のケースについては、次の構文を使用して、既存のText SEARCH索引またはJSON SEARCH索引を完全再構築でHVIに変換できます:
    ALTER INDEX schema.index_name REBUILD
    [parameters('add vectorizer vectorizer_pref_name')]; 

    例:

    ALTER INDEX schema.my_hybrid_idx REBUILD
    [parameters('add vectorizer my_vectorizer_pref)'];

ハイブリッド・ベクトル索引の管理の詳細は、『Oracle Database AI Vector Searchユーザーズ・ガイド』を参照してください。

ALTER INDEX Sub_Lexer構文

New 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] MAINTENANCE AUTO | MAINTENANCE MANUAL]
     [[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][LANGUAGE_DEPENDENT(TRUE|FALSE)]
| 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
| ADD SUB_LEXER sub_lexer_name LANGUAGE language [ALT_VALUE alternate_value_for_language] [LANGUAGE_DEPENDENT (TRUE|FALSE)]
| REMOVE SUB_LEXER LANGUAGE language
| REMOVE STOPWORD word [LANGUAGE language]
| REMOVE STOPWORDS FOR LANGUAGE language
| MIGRATE to MULTI_STOPLIST [LANGUAGE COLUMN lang]
| MIGRATE FIELD SECTION field_section_name to [READ ONLY] MDATA
| UPDATE SUB_LEXER LANGUAGE language TO sub_lexer_preference
| ADD MDATA SECTION secname TAG sectag READ ONLY

Sub_Lexerの例

ALTER INDEX myidx PARAMETERS('ADD SUB_LEXER mycompany_lexer LANGUAGE mycompany LANGUAGE_DEPENDENT FALSE');

ALTER INDEX myidx PARAMETERS('REMOVE STOPWORDS FOR LANGUAGE mycompany');

Sub_Lexerのノート

言語は、Oracleで事前定義されている言語シンボル(Oracle Textでサポートされている言語のグローバリゼーション・サポート名または略称)、または言語に依存しないsub_lexerまたはstopwordにユーザーが定義するシンボルです。

ADD SUB_LEXER

次の条件が適用されます。

  • LANGUAGE_DEPENDENT句を指定する場合、デフォルトはTRUEです。

  • 同期はブロックされます(または同期によってブロックされます)。

  • 言語に依存しない最初のsub_lexerを追加する場合は、元表もロックされます。

  • 言語に依存しない最初のsub_lexerまたはストップワードを追加する場合は、完了するまで長い時間がかかります。それ以外の場合は、同じ索引に対して進行中の同期によってブロックされていないかぎり、すぐに終了します。

REMOVE SUB_LEXER

言語列が削除しようとしているsub_lexerのシンボルに設定されているドキュメントがない場合にのみ成功します。

REMOVE STOPWORD

次の条件が適用されます。

  • LANGUAGE句を指定しない場合、索引はbasic_stoplistを使用していると想定されます。索引がbasic_stoplistを使用していない場合は、エラーが発生します。

  • 索引が(multi_stoplistではなく) basic_stoplistを使用している場合でも、成功するのは元表が空の場合のみです。

  • 索引がmulti_stoplistを使用しており、ユーザーがLANGUAGE句にALLを指定した場合、成功するのは元表が空の場合のみです。

  • 索引がmulti_stoplistを使用しており、ユーザーがLANGUAGE句にシンボルを指定した場合は、削除しようとしているストップワードのシンボルに言語列が設定されているドキュメントがない場合にのみ成功します。

MIGRATE TO MULTI_STOPLIST [LANGUAGE COLUMN lang]

次の条件が適用されます。

  • 既存のテキスト索引のストップリストをmulti_stoplistに移行します。既存のストップワードの言語は、値がALLになります。

  • LANGUAGE列は、すでに索引に定義されています。

    • LANGUAGE COLUMNはスキップできます(古い言語列が索引に保持されます)。

    • LANGUAGE COLUMNを指定し、索引の言語列と指定した言語列が一致しない場合には、エラーが発生します。

  • 索引にLANGUAGE COLUMNを指定する必要があります。指定しない場合は、エラーが発生します。

MIGRATE FIELD SECTION TO MDATA SECTION

次の条件が適用されます。

  • ユーザーがフィールド・セクションをMDATAセクションに変換できます。MDATAセクションをREAD_ONLY MDATAセクションにする場合は、READ ONLY飲みを指定します(ADDとREMOVEは使用できない)。

  • 制約: 移行されるMDATAセクションのトークンは、通常のMDATAの特性を持ちません。大/小文字の情報や、ドキュメントに確認されるトークンなどです。これらの特性を維持するには、ドキュメントを再索引付けする必要があります。

UPDATE SUB_LEXER LANGUAGE SUB_LEXER_SYMBOL TO SUB_LEXER_PREFERENCE

次の条件が適用されます。

  • サブレクサーをユーザーが動的に更新できます。

  • 言語、alt_value、言語依存性は、新旧のサブレクサー・プリファレンスで同じままである必要があります。

  • デフォルトのサブレクサーを更新する構文は、次のとおりです。

    UPDATE SUB_LEXER DEFAULT TO SUB_LEXER_PREFERENCE
ADD MDATA SECTION secname TAG sectag READ ONLY

次の条件が適用されます。

  • MDATAセクションを索引に追加できます。

  • NULL/AUTO/PATHセクション・グループで使用することはできません。

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');
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&oacute;n r&aacute;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');

SDATAセクションの追加

NUMBERデータ型で、タグT1により識別されるSDATAセクションS1を索引に追加するには、次のように文を入力します。

ALTER INDEX myindex PARAMETERS('add sdata section S1 tag T1 datatype NUMBER);

自動バックグラウンド索引最適化の無効化

次の例では、バックグラウンドで自動的に実行されるトークン最適化ジョブとフル最適化ジョブを無効にします。

ALTER INDEX myindex PARAMETERS ('REPLACE METADATA OPTIMIZE (MANUAL)');

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

テキスト問合せのフラッシュバックが、問合せ対象のテキスト索引に対する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;

関連項目:

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

ノート

セクション追加時の制約

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

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

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

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

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

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

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

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

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

  • セクションおよびフィールド名に、埋込み空白は使用できません。

1.2 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)]
[parallel_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;

1.3 CATSEARCH

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

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

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

ノート:

Oracle Textの索引タイプCTXCATは、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCATは、将来のリリースで削除される可能性があります。

CONTEXT問合せの代替文法としてCTXCATおよびCTXCAT文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXTでのトランザクションに近い動作は、SYNC(ON COMMIT)または短い期間(できればSYNC(EVERY [time-period]))を使用して実現できます。

CTXCATは、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCATで管理が困難な場合があります。CTXCATへの索引セットの追加は、CONTEXT索引タイプでFILTER BY列とORDER BY列、またはSDATA列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCATが適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT索引タイプを選択することをお薦めします。

パフォーマンス

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

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

制限事項

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

INDEXヒントを使用すると、索引を使用するオプティマイザを指定し、CATSEARCHの機能評価を回避できます。

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-6に、これらの演算子の構文を示します。

表1-6 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_queryquery」パラメータの説明を参照してください。

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 DVD Player', '20-FEB-2012');
    INSERT INTO auction values(2, 'Sony DVD Player', '24-FEB-2012');
    INSERT INTO auction values(3, 'Pioneer DVD Player', '25-FEB-2012');
    INSERT INTO auction values(4, 'Sony DVD Player', '25-FEB-2012');
    INSERT INTO auction values(5, 'Bose Speaker', '22-FEB-2012');
    INSERT INTO auction values(6, 'Tascam CD Burner', '25-FEB-2012');
    INSERT INTO auction values(7, 'Nikon digital camera', '22-FEB-2012');
    INSERT INTO auction values(8, 'Canon digital camera', '26-FEB-2012');
    
  2. 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');
    
  3. 表を問い合せます。

    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-12
              7 Nikon digital camera 22-FEB-12
    

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

    SELECT * FROM auction WHERE CATSEARCH(title, '"Sony DVD Player"',
    'bid_close=''20-FEB-00''')> 0;
     
    CATEGORY_ID TITLE                BID_CLOSE
    ----------- -------------------- ---------
              1 Sony DVD Player       20-FEB-12
    

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

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

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

    SELECT * FROM auction WHERE CATSEARCH(title, 'DVD - Player', 'order by bid_close
    desc')> 0;
     
    CATEGORY_ID TITLE                BID_CLOSE
    ----------- -------------------- ---------
              6 Tascam CD Burner     25-FEB-12
    

    次の問合せでは、語句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-12
              4 Sony DVD Player      25-FEB-12
              6 Tascam CD Burner     25-FEB-12
              2 Sony DVD Player      24-FEB-12
              5 Bose Speaker         22-FEB-12
              1 Sony DVD Player      20-FEB-12
    

    次の問合せは、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; 

1.4 CONTAINS

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

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

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

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

ノート:

Oracle Textの索引タイプCTXCATは、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCATは、将来のリリースで削除される可能性があります。

CONTEXT問合せの代替文法としてCTXCATおよびCTXCAT文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXTでのトランザクションに近い動作は、SYNC(ON COMMIT)または短い期間(できればSYNC(EVERY [time-period]))を使用して実現できます。

CTXCATは、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCATで管理が困難な場合があります。CTXCATへの索引セットの追加は、CONTEXT索引タイプでFILTER BY列とORDER BY列、またはSDATA列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCATが適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT索引タイプを選択することをお薦めします。

構文

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

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

text_query

次のいずれかを指定します(VARCHAR2に対して4000バイト、CLOBに対して64000バイトに制限されます)。

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

このテンプレートを使用して、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は、書換えルールを指定するために使用され、次の構文を使用します(二重カッコを使用することに注意してください)。次の表に、パラメータの説明を示します。

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

表1-7 TRANSFORMのパラメータ

パラメータ 説明

term

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

prefix

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

suffix

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

connector

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

ノート:

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

問合せ結果セット記述子テンプレート

結果セット記述子を取得する場合に、このテンプレートを使用します。問合せテンプレートに、ctx_result_set_descriptor要素が追加されます。これによって、CONTAINS問合せカーソルがグループ・カウント問合せを取得できるようになります。

結果セット・インタフェース・ドキュメントが、ctx_queryパッケージのパブリック変数に配置されます。 (ctx_query.result_set_document)

CONTAINS問合せカーソルの動作は変わらず、結果セット・ドキュメントはカーソルのクローズ直後に使用できるようになります。

たとえば、kukui nutの次の問合せは、次のテンプレートを持つ結果セットを戻します。

<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <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"/>
<ctx_result_set_descriptor> 
 <group>
    <group_values>
       <value id="2"/>
       <value id="3"/>
       <value id="4"/>
    </group_values>
    <count/>
  </group>
</ctx_result_set_descriptor>
</query>

問合せ緩和テンプレート

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

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

blue pen
blue NEAR pen
blue AND pen
blue ACCUM pen

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

<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <progression>
       <seq>blue pen</seq>
       <seq>blue NEAR pen</seq>
       <seq>blue AND pen</seq>
       <seq>blue 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 grammar="CONTEXT" lang="ENGLISH">
            Oracle 
      </textquery>
      <score datatype="INTEGER" algorithm="COUNT"/>
      <sublexers>
            <sublexer_label>  SESSION_LANG   </sublexer_label>
            <sublexer_label>   MAIL   </sublexer_label>
            <sublexer_label> CALENDER </sublexer_label>
      </sublexers>
</query>

次の条件が適用されます。

  • sublexers要素は、1つ以上のsublexer_label要素で構成されます。

  • sublexer_label要素には、言語に依存しないsub_lexerのシンボルが含まれます。

  • sublexers要素を指定すると、sublexers要素に指定されるシンボルごとにストップワードとsub_lexerを使用して問合せが処理され、queryは指定されたsub_lexerによって索引付けされるドキュメントのみを戻します。

  • 特別に予約されているSESSION_LANGというシンボルを使用すると、シンボルは問合せテンプレートのtextquery要素のlang属性で指定される言語に基づいて言語に依存するsub_lexerを選択します。lang属性を指定しない場合、lang属性はセッション言語に基づいて決定されます。選択したsub_lexerによって解析されるQueryは、言語に依存するそのsub_lexerによって索引付けされたドキュメントのみを戻すようになります。SESSION_LANG属性とlang属性の両方を指定した場合は、lang属性が優先されます。

  • SESSION_LANGを指定せずにsublexers要素を指定した場合は、textquery要素のlang属性が無視されます。

  • デフォルトの動作は次のとおりです。

    sublexers要素が問合せテンプレートに存在しない場合、queryは言語に依存する1つのsub-lexer (存在する場合)によって解析されます。これは、指定されたlang属性、またはセッション言語および言語に依存しないすべてのsub-lexerに基づいて選択されます。

代替言語テンプレート

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

<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-8に、テンプレート属性の有効な値を示します。

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

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

grammar=

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

CONTEXT

CTXCAT

問合せの文法。

datatype=

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

INTEGER

FLOAT

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

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

algorithm=

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

DEFAULT

COUNT

デフォルトを戻します。

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

lang=

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

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

言語の名前。

テンプレート文法の定義

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

<!DOCTYPE query [
<!ELEMENT query (textquery, score?, order?)> 
<!ELEMENT textquery (#PCDATA|progression)*> 
<!ELEMENT progression (seq)+> 
<!ELEMENT seq (#PCDATA|rewrite)*> 
<!ELEMENT rewrite (#PCDATA)> 
<!ELEMENT score EMPTY> 
<!ELEMENT order (orderkey+)> 
<!ELEMENT orderkey (#PCDATA)> 
<!ATTLIST textquery grammar (CONTEXT | CTXCAT | CTXRULE) #REQUIRED>
<!ATTLIST textquery lang CDATA #IMPLIED>
<!ATTLIST score datatype (integer | float) "integer">
<!ATTLIST score algorithm (default | count) "default">
<!ATTLIST score normalization_expr CDATA >

値は大/小文字が区別されず、integer | float、default | count、context |ctxcatです。

関連項目:

問合せ式の演算子の詳細は、「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>

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

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

select id from docs where CONTAINS (text, '
<query>
   <textquery lang="ENGLISH" grammar="CONTEXT">
     <progression>
       <seq>blue pen</seq>
       <seq>blue NEAR pen</seq>
       <seq>blue AND pen</seq>
       <seq>blue 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;

SDATAセクション・テンプレートによる並替えの例

次の問合せテンプレートでは、<order>要素と<orderkey>要素を使用してSDATAセクションの値を並べ替える問合せシーケンスを定義します。第1レベルの並替えはSDATAセクションのpriceに基づいて実行され、これによって昇順でソートされます。第2レベルと第3レベルの並替えはSDATAセクションのpub_dateとスコアに基づいて実行され、これによって降順でソートされます。

select id from docs where CONTAINS (text, '
<query>
   <textquery lang="ENGLISH" grammar="CONTEXT"> Oracle </textquery>
   <score datatype="INTEGER" algorithm="COUNT"/>
   <order>
       <orderkey> SDATA(price) ASC </orderkey>
       <orderkey> SDATA(pub_date) DESC </orderKey>
       <orderkey> Score DESC </orderkey>
   </order>
</query>', 1)>0;

<orderkey>要素の値は、次の形式である必要があります。

<orderkey> SDATA(sdata_section_name) | score [DESC|ASC] </orderkey>

DESCまたはASCで指定しないデフォルトでは、ソート順は昇順です。

次の場合、<orderkey>要素は無視されます。

  • Oracleのコストベース・オプティマイザ(CBO)が、SQL問合せレポートの並替えをテキスト索引にプッシュした場合

  • CONTAINS()述語が関数的に処理される場合

  • SQL問合せ文のORDER BY句によって、並替えがすでに指定されている場合

ノート

マルチ言語表の問合せ

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

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

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

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

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;

CONTAINS問合せのリモート実行に関する制約

Oracle Textは、CONTAINS演算子のリモート実行をサポートしていますが、いくつかの制約があります。CONTAINS演算子を呼び出せるのは、問合せが完全にリモート・データベースで実行される場合のみです。問合せの副問合せではCONTAINS演算子を使用できません。リモート・データベースとローカル・データベースで問合せがそれぞれ部分的に実行されてしまうためです。これを実行すると、エラー「ORA-00949: リモート・データベースへの参照は無効です。」が発生します。ただし、CONTAINSを内部問合せからリモートで呼び出すと、ビューのマージが有効で、この問合せでも可能な場合には、正常に実行される場合があります。この場合は、問合せが単一の問合せに変換されるため、エラーになりません。

たとえば、次の問合せは正常です。

select id from remtab@rdb 
where contains@rdb(text,'hello') > 0;

1.5 CREATE INDEX

CREATE INDEX文を使用して、Oracle Text索引を作成します。

この項では、Oracle Textドメイン索引およびコンポジット・ドメイン索引の作成に関連する部分でのCREATE INDEX文について説明します。CREATE INDEX文の詳細は、Oracle Database SQL言語リファレンスを参照してください。

用途

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

create table mytab
(item_id number, 
 item_info varchar2(4000),
 item_supplier varchar2(250),
 item_distributor varchar2(500));

create index idx on mytab(item_info) indextype is ctxsys.context 
filter by item_supplier order by item_distributor;

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索引は、一般にCONTEXTに比べて大きく、作成および更新に時間がかかり、使用できる索引付けオプションが限られています。CTXCAT索引タイプの構文を参照してください。

ノート:

Oracle Textの索引タイプCTXCATは、Oracle Database 23aiでは非推奨です。索引タイプ自体とその演算子CTXCATは、将来のリリースで削除される可能性があります。

CONTEXT問合せの代替文法としてCTXCATおよびCTXCAT文法の使用はどちらも非推奨です。かわりに、Oracleでは、CONTEXT索引タイプを使用することをお薦めします。索引タイプは、トランザクション以外のすべての同じ機能を提供できます。CONTEXTでのトランザクションに近い動作は、SYNC(ON COMMIT)または短い期間(できればSYNC(EVERY [time-period]))を使用して実現できます。

CTXCATは、通常、索引のサイズが数メガバイトのときに導入されました。最近の大規模な索引は、CTXCATで管理が困難な場合があります。CTXCATへの索引セットの追加は、CONTEXT索引タイプでFILTER BY列とORDER BY列、またはSDATA列(あるいはその両方)を使用することで、より効率的に実行できます。したがって、CTXCATが適切な選択になることはほとんどありません。Oracleでは、より効率的なCONTEXT索引タイプを選択することをお薦めします。

CTXRULE

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

必要な権限

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

ノート:

Oracle Text索引を作成する場合、DR$が接頭辞に付いた一連の内部オブジェクトが、常に追加で作成されます。これらの内部オブジェクトの名前には、通常、索引名が含まれます。オブジェクト名に収まるように、索引名が短縮される場合もあります。そのような場合、オブジェクト名に索引IDが含まれるので、他の索引のオブジェクトと名前の競合が発生するのを防ぎます。

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によってドキュメントを識別します。

ノート:

サポートされる主キーの型は、NUMBERVARCHAR2DATECHARVARCHARおよびRAWです。

指定する列は、CHARVARCHARVARCHAR2BLOBCLOB(4294967295バイトに制限)、BFILEXMLTypeまたはURITypeのうちいずれかの型であることが必要です。

ノート:

Oracle Database 12cリリース2 (12.2)以降、Oracle Text索引は、宣言された照合BINARYUSING_NLS_COMPUSING_NLS_SORTまたはUSING_NLS_SORT_CSを使用する列に対してのみ作成できます。Oracle Textの動作は、すべてのサポートされる照合で同様です。

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

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

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

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

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

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

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

ノート:

元表にDBMS_RLSを使用して仮想プライベート・データベース(VPD)ポリシーを作成するか、DBMS_REDACTを使用してデータ・リダクション・ポリシーを作成する前に、その同じ元表に索引を作成した場合、$IなどのDR$索引表には、索引けされた列のデータから導出されたトークンが引き続き含まれます。これらのトークンは通常、索引付けされた列のデータの完全なコピーを表すものではありませんが、依然として機密データが露呈する可能性があります。これは、その列の機密データを保護することを目的としたセキュリティ・ポリシーを作成しても発生します。CONTAINS問合せも、それに応じた結果を返します。機密データの索引付けを防ぐには、CONTEXT索引を作成する前にデータ・リダクションとVPDポリシーを作成するか、セキュリティ・ポリシーが追加されるたびに CONTEXT索引を再構築します。

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

ノート:

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

ノート:

透過的なデータ暗号化の可能な列ではドメイン索引はサポートされないため、Oracle Textで使用することはできません。ただし、透過的なデータ暗号化に対応する表領域に格納されている表の列に対しては、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のみです。また、CHARVARCHAR2およびVARCHAR2型がサポートされるのは、最大長が指定されており、249バイトを超えない場合のみです。CHAR列またはVARCHAR2列の最大長が文字数として指定されている場合(VARCHAR2 (50 CHAR)など)、FLOOR (249/max_char_width)を超えることはできません。ここで、max_char_widthはデータベース文字セット内の任意の文字の最大幅です。たとえば、データベース文字セットがAL32UTF8である場合、指定する列の最大長が62文字を超えることはできません。サポートされている型(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バイトより長いVARCHAR2およびRAW列は、最初の249バイトに切り捨てられます。たとえば、式func(cola)および仮想列は使用できません。

指定した列の順序が重要です。コストベース・オプティマイザ(CBO)は、テキスト問合せのORDER BY句に次の項目のいずれかが含まれている場合にのみ、コンポジット・ドメイン索引に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列の接頭辞に続くスコア

次の例では、ORDERBY列に関して、コストベース・オプティマイザ(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にプッシュしません。この動作は、通常のSDATA検索に最適化された索引と一貫性があります。

col_listに次の値がある場合、コストベース・オプティマイザ(CBO)は、コンポジット・ドメイン索引(CDI)に対するソートをプッシュしようとします。

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

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

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

(またはA, B)

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

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

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

制限事項

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

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

  • CHARVARCHAR2およびRAW列のFILTER BY列の最大長は、249以内です。ORDER BY列では、データは249文字に切り捨てられます。

  • CDI(FILTER BYおよびORDER BY)の合計数は、32です。

ノート:

CDIでは、索引付けされた列がFILTER BYまたはORDER BY列でもある場合、主索引列を更新すると、FILTER BY列またはORDER BY列の更新はトランザクション型にはなりません。

ノート:

  • 連結されたSDATA検索に最適化された索引またはビットマップ索引の場合と同様に、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句(あるいはその両方)を指定してコンポジット・ドメイン索引が作成されているテキスト表のエクスポートとインポートに関する制限事項は、次のとおりです。

  • Oracleでは、Oracle Data Pump Import (impdp)およびOracle Data Pump Export (expdp)ユーティリティを使用して、Oracle Text索引をインポートおよびエクスポートすることをお薦めします。

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

  • 元のOracle Database Export (exp)ユーティリティは、Oracle Database 23aiでサポートが終了しました。

コンポジット・ドメイン索引の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 =
'[ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE]
 [DATASTORE datastore_pref] 
 [FILTER filter_pref] 
 [CHARSET COLUMN charset_column_name]  
 [FORMAT COLUMN format_column_name]
 [SAVE_COPY COLUMN save_copy_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]
 [MAINTENANCE AUTO | MAINTENANCE MANUAL]
 [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
 [TRANSACTIONAL]
 [OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]'

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

ノート:

ASYNCHRONOUS_UPDATEパラメータとTRANSACTIONALパラメータの組合せは、コンテキスト索引ではサポートされていません。

ノート:

paramstringを指定しない場合は、システムのデフォルト値が使用されます。これらのデフォルト値の詳細は、「デフォルトの索引付けパラメータ」を参照してください。

ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE

Oracle Textで、索引付られた列を更新したドキュメント内に古い索引のエントリを保持するかどうか指定します。デフォルトはSYNCHRONOUS_UPDATEです。索引の更新は同期され、索引の同期が終了するまで古い索引のエントリは検索操作で使用不可能です。

ASYNCHRONOUS_UPDATEは、索引が同期化されるまで、問合せは古い索引エントリを使用して古いドキュメントの内容を戻します。索引の同期化後、再構築された索引を使用して更新されたドキュメントの内容が戻されます。

非同期更新は、動作が遅くなるためDML操作でサポートされていません。

このオプションは、パーティション・レベルで設定できません。

次の例では、非同期更新が使用可能なCONTEXT索引idxを作成します。

CREATE INDEX myidx ON mytab1(item_info) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('asynchronous_update');

ノート:

CONTEXT索引タイプのASYNCHRONOUS_UPDATE設定は、Oracle Database 23aiで非推奨になり、将来のリリースで無視または削除される可能性があります。

Oracleでは、将来のリリースでこの属性を無視または削除する可能性があります。Oracleでは、この値をデフォルト値SYNCHRONOUS_UPDATEに設定することをお薦めします。更新時の予期しない結果損失を回避するには、SYNC (ON COMMIT)またはSYNC(EVERY [time-period])を短い期間で使用します。

ASYNCHRONOUS_UPDATE設定は、更新が"delete followed by insert"として実装され、削除が即時(コミット時)であり、挿入が索引同期中にのみ実行されるという事実の回避策として導入されました。ただし、この設定は他のいくつかの索引オプションと互換性がありません。Oracleでは、使用を中止することをお薦めします。

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はどのフィルタ・タイプにも使用できます。

ノート:

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

SAVE_COPY COLUMN save_copy_column_name

検索操作で$D索引表にドキュメントのコピーを保存するかどうかのプリファレンスを含む列の名前を指定します。

SAVE_COPY列に指定できるオプションは、PLAINTEXTFILTEREDNONEの3つのいずれかです。

PLAINTEXTオプションでは、ドキュメントをプレーン・テキストとして$D索引表に格納することを指定します。SNIPPETプロシージャを使用するには、この値を指定する必要があります。

FILTEREDオプションでは、ドキュメントを$D索引表に格納する前に、そのドキュメントに存在するテキストにフィルタ・プリファレンスを適用することを指定します。MARKUPプロシージャまたはHIGHLIGHTプロシージャを使用するときは、この値を指定します。

NONEオプションでは、ドキュメントを$D索引表に格納しないことを指定します。次の場合には、この値を指定します。

  • SNIPPET、MARKUPまたはHIGHLIGHTプロシージャを使用しない場合

  • 索引付けされた列がVARCHAR2またはCLOBの場合

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パラメータは、CONTEXTCTXRULEおよびSEARCH_INDEXタイプに適用できます。

ノート:

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

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

NOPOPULATEキーワードを明示的に指定しないかぎり、移入された索引がデフォルトで作成されることに注意してください。CTX_REPORT.CREATE_INDEX_SCRIPTおよびCTX_REPORT.DESCRIBE_INDEXの出力には、このような索引のNOPOPULATEキーワードが含まれます。

MAINTENANCE AUTO | MAINTENANCE MANUAL

元表に対する挿入、更新または削除があるときのCONTEXT索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

次のメンテナンス・タイプのいずれかを設定できます。

表1-9 メンテナンス・タイプ

メンテナンス・タイプ 説明

MAINTENANCE AUTO

これは、Oracle Text CONTEXTおよび検索索引を同期するためのデフォルトのメソッドです。

このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

ノート: 自動メンテナンス・モードでの索引の要件および制限事項のリスト(『Oracle Textアプリケーション開発者ガイド』に記載)を確認してください。

MAINTENANCE MANUAL

このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

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

元表に対する挿入、更新または削除があるときのCONTEXT索引の同期のためのSYNCタイプを指定します。

これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

ノート:

デフォルトでは、CONTEXT索引と検索索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、SYNCメソッドを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

次のSYNCメソッドのいずれかを指定できます。

表1-10 SYNCタイプ

SYNCタイプ 説明

MANUAL

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

EVERY "interval-string"

デフォルトの同期間隔は30秒に設定されています。

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

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

自動同期化構文の例は、一定間隔での自動索引同期の有効化を参照してください。

ON COMMIT

コミット・トランザクションの直後に索引を同期化します。コミット・トランザクションは、同期化が完了するまで戻りません。Oracle Databaseリリース18cより以前、同期は個別のトランザクションとして実行されていました。データがコミットされていても索引が変更されていない時間間隔(通常は短い間隔)がありました。Oracle Databaseリリース18cからは、同期が同じトランザクションの一部として実行されます。

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

Oracle Databaseリリース18cより以前、同期操作には独自のトランザクション・コンテキストがありました。この操作が失敗しても、データ・トランザクションはコミットされていました。Oracle Databaseリリース18cからは、リカバリ不能な索引同期エラーが発生した場合に、データ・トランザクション全体がロールバックされます。リカバリ可能な(個別の行の)同期エラーはCTX_USER_INDEX_ERRORSビューに記録されますが、トランザクションは完了します。索引エラーの表示を参照してください。

ON COMMIT構文の例は、一定間隔での自動索引同期の有効化を参照してください。

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

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

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

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

関連項目:

TRANSACTIONAL

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

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

(CTX_DDL.SYNC_INDEXを使用して)テキスト索引を適宜同期化し、保留中のROWIDを索引に取り込む必要があります。非同期ROWIDの数が増えると、問合せのパフォーマンスが低下します。そのため、EVERYまたはON COMMITパラメータとともに自動同期化を使用するように索引を設定することをお薦めします。(「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を含む問合せでは、同期化されていないドキュメントをフィルタ処理する必要があります。

OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")

自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます。

表1-11 CREATE INDEX OPTIMIZEのタイプ

OPTIMIZEタイプ 説明

MANUAL

自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

AUTO_DAILY

索引作成パラメータ・リストにOPTIMIZE (AUTO_DAILY)を指定すると、繰り返し実行されるトークン最適化ジョブと繰り返し実行されるフル最適化ジョブが索引およびパーティションごとにスケジュールされます。
  • トークン最適化ジョブは、毎週土曜日の夜午前12時から実行して$S*表を最適化するようにスケジュールされます。

    このジョブは、JSONデータ型以外(VARCHAR2CLOBまたはBLOB)の表で実行され、最も断片化されている上位10個のトークン(自動的に決定される)を最適化します。

  • フル最適化ジョブは、土曜日の夜を除き、毎日深夜12時から午前3時まで実行するようにスケジュールされています。午前3時より前に開始されていないジョブはスキップされます。このようなスキップされたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。

    このジョブは、JSONデータ型またはIS JSONチェック制約を持つ表に対して実行されます。

デフォルトでは、既存の索引にOPTIMIZE (AUTO_DAILY)は設定されません。自動バックグランド索引最適化を有効にするには、ALTER INDEXを使用する必要があります。

EVERY "interval-string"

スケジューラ・ジョブと同じ構文の値interval-stringで指定された一定の間隔で自動的に実行されます。
  • トークン最適化ジョブは、JSON以外のデータ型を持つ表に対してスケジュールされます。

    このジョブは、ユーザーが指定した間隔で、最上位10の最も断片化されたトークンのトークンを最適化します。最も断片化された上位10個のトークンの最適化処理を実行します

  • フル最適化ジョブは、JSONデータ型またはIS JSONチェック制約を持つ表に対してスケジュールされます。

    このジョブは、毎週土曜日の夜午前12時に$S*表に対してフル最適化を実行します。

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

複数の索引でOPTIMIZE EVERY "interval-string"オプションを使用する場合、索引ごとに異なるジョブが作成されます。これらのジョブは同時に実行されます。

AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。構文は次のとおりです。

... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...

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/password
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管理者ガイド』を参照してください。

自動バックグラウンド索引最適化の有効化

次の例では、索引を作成して、毎日深夜午前12時に繰り返し実行されるトークン最適化ジョブと毎週土曜日の深夜午前12時に繰り返し実行されるフル最適化ジョブをスケジュールします。


CREATE TABLE mytable (
	text VARCHAR2(30)
);

CREATE INDEX myindex ON mytable(text) 
	INDEXTYPE IS CTXSYS.CONTEXT 
	PARAMETERS('OPTIMIZE (EVERY "FREQ=DAILY; BYHOUR=0")');

マルチレクサー・プリファレンスを使用した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);
CREATE INDEX part_idx on part_tab(b) INDEXTYPE IS CTXSYS.CONTEXT LOCAL;
10000を超えるパーティションがある場合は、次のいずれかのアクションを実行します。
  • 10000を超えるパーティションを含むCONTEXT索引を作成する必要がある場合は、索引の作成時にイベント30579、レベル2147483648を使用する必要があります。
  • 索引がすでに作成されており、10000を超えるパーティションがある場合は、次のコマンドを実行した後に索引を再作成する必要があります。
    alter SYSTEM set events '30579 trace name context forever, level 2147483648';

関連項目:

MOSノート2671924.1

ノート:

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-12に記載されたサポートされている索引プリファレンスです。

表1-12 サポートされている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

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

section_group

セクション・グループを指定します。このパラメータは問合せには影響を与えません。分類するドキュメントのセクションに適用されます。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アプリケーション開発者ガイド』を参照してください。

関連トピック

「CTX_DDL.CREATE_PREFERENCE

「CTX_DDL.CREATE_STOPLIST

「CTX_DDL.CREATE_SECTION_GROUP

ALTER INDEX

「CATSEARCH」

1.6 CREATE SEARCH INDEX

CREATE SEARCH INDEX文を使用して、構造化データ、非構造化データ、または準構造化データ(テキスト、JSON、XMLドキュメントなど)を索引付けおよび問合せするための検索索引を作成します。

用途

SEARCH INDEXは、索引記憶域用のシャード・データベースおよびシステム管理パーティション化とともに、CONTEXT索引機能をサポートしている索引タイプです。CREATE SEARCH INDEX構文を使用して、テキスト、JSONおよびXML列に対して検索索引を作成できます。

ノート:

シャドウ索引は検索索引ではサポートされていません。

概要

CREATE SEARCH INDEX構文では、次のように、列のデータ型に基づいて、作成する検索索引のタイプが自動的に決定されます。

列のデータ型 FOR句 構文の説明

テキスト

FOR TEXT

テキスト列に対するCREATE SEARCH INDEX文では、Oracle Text検索索引が作成されます。

必要に応じて、CREATE SEARCH INDEX文にFOR TEXT句を明示的に指定してOracle Text検索索引を作成できます。テキスト列に対してFOR TEXT句を省略した場合は、FOR TEXT設定が自動的に選択されます。

列にJSONデータ型、IS JSONチェック制約、またはTBXを使用するXMLTypeデータ型がある場合は、FOR TEXT句を指定することでそれらの設定をオーバーライドし全文検索索引を作成できます。

JSONデータ型

または

IS JSONチェック制約がある列

FOR JSON

JSONデータ型またはIS JSONチェック制約がある列に対するCREATE SEARCH INDEX文では、JSON検索索引が作成されます。

必要に応じて、CREATE SEARCH INDEX文でFOR JSON句を明示的に指定してJSON検索索引を作成できます。FOR JSON句を省略し、列にJSONデータ型またはIS JSONチェック制約がある場合は、FOR JSON設定が自動的に選択されます。

TRANSPORTABLE BINARY XMLXMLTypeデータ型

FOR XML

TRANSPORTABLE BINARY XML (TBX)のXMLType列に対するCREATE SEARCH INDEX文では、XML検索索引が作成されます。

必要に応じて、CREATE SEARCH INDEX文にFOR XML句を明示的に指定してXML検索索引を作成できます。TBX記憶域オプションを使用するXMLTYPE列に対してFOR XML句を省略した場合は、FOR XML設定が自動的に選択されます。XMLTYPE列に対してFOR XML句を省略したが、記憶域オプションがTBXでない場合は、Oracle Text索引が作成されます。XML検索索引を作成するには、ドキュメントがTBXとして格納されていることを確認する必要があります。

XML検索索引では、XQueryフルテキスト検索機能もサポートされています。TBXオプションを使用して格納されていないXMLデータを索引付けするには、XQueryフルテキストCONTEXT索引を作成します。Oracle XML DB開発者ガイドを参照してください。

各タイプの検索索引の詳細な構文を次に示します:

Oracle Text Search索引の構文

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

ONLINEFILTER BYORDER BY、PARTITIONPARALLELおよびUNUSABLEの詳細は、CONTEXT索引タイプの構文を参照してください。

[schema.]index

作成するOracle Text検索索引の名前を指定します。

[schema.]table(index_column)

索引付けする表および列の名前を指定します。index_columnは、索引が作成される列の名前です。

LOCAL

パーティション表にローカル・パーティション検索索引を作成します。索引は、元表のパーティション化スキームを使用してパーティション化されます。

レンジ、リスト、ハッシュ、時間隔、レンジ・コンポジット(レンジ、リストおよびハッシュ)、リスト・コンポジット(レンジ、リストおよびハッシュ)、ハッシュ・コンポジット(レンジ、リストおよびハッシュ)および自動リストのパーティション化スキームを使用して、表をパーティション化できます。参照パーティション表の元表が、サポートされているスキームのいずれかを使用してパーティション化されている場合、参照パーティション化を使用してローカル検索索引を作成できます。

ノート:

時間隔コンポジット・パーティション表にローカル検索索引は作成できません。

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

次の例は、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 search index
CREATE SEARCH INDEX part_idx ON part_tab (b) LOCAL;

関連項目:

PARAMETERS(paramstring)

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

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

paramstring =
'[DATASTORE datastore_pref]
 [STORAGE storage_pref]
 [MEMORY memsize]
 [MAINTENANCE AUTO | MAINTENANCE MANUAL]
 [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
 [OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]
 [STOPLIST stoplist]
 [LEXER lexer_pref] 
 [FILTER filter_pref] 
 [WORDLIST wordlist_pref]  
 [SECTION GROUP section_group]'

ノート:

TRANSACTIONALおよびASYNCHRONOUS_UPDATEパラメータは、Oracle Textの検索索引タイプではサポートされません。
DATASTORE datastore_pref

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

デフォルトはDIRECT_DATASTOREタイプです。

STORAGE storage_pref

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

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以上に再設定する必要があります。

Oracle Text検索索引のデフォルトは500MBです。

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

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

MAINTENANCE AUTO | MAINTENANCE MANUAL

元表に対する挿入、更新または削除があるときのOracle Text検索索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

次のいずれかのメンテナンス・タイプを指定できます。

表1-13 メンテナンス・タイプ

メンテナンス・タイプ 説明

MAINTENANCE AUTO

これは、Oracle Text CONTEXTおよび検索索引を同期するためのデフォルトのメソッドです。

このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

ノート: シャドウ索引では自動メンテナンスはサポートされていません。自動メンテナンス・モードでの索引に関する要件および制限事項の詳細なリストは、『Oracle Textアプリケーション開発者ガイド』を参照してください。

MAINTENANCE MANUAL

このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

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

元表に対する挿入、更新または削除があるときのOracle Text検索索引の同期のためのSYNCメソッドを指定します。

これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

ノート:

デフォルトでは、CONTEXT索引と検索索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、SYNCメソッドを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

表1-10で説明するように、SYNCメソッドのいずれかを指定できます。

ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(ON COMMITEVERYまたはMANUAL)が設定されます。プライマリ・パラメータ文字列に指定されたsyncのタイプは、すべての索引パーティションに適用されます。MANUAL同期は、Oracle Text検索索引のデフォルトの同期方法です。ON COMMIT同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズを使用する必要があります。

自動(EVERY)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。interval-string引数で繰返しスケジュールを定義するには、カレンダ構文の値を使用します。これらの値の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

構文:
SYNC [EVERY "interval-string"] MEMORY mem_size PARALLEL paradegree
:
SYNC [EVERY "freq=secondly;interval=20"] MEMORY 500M PARALLEL 2
次の例では、自動(EVERY)同期化を使用してOracle Text検索索引を作成します。
  • 毎晩午前1時に開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(text_document) 
      PARAMETERS('SYNC (EVERY "freq=daily; byhour=1")');
  • 5分ごとに開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(text_document) 
      PARAMETERS('SYNC (EVERY "freq=minutely; interval=5")');
OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string)

自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます。

表1-14 OPTIMIZEのタイプ

OPTIMIZEタイプ 説明

MANUAL

自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

AUTO_DAILY

これはデフォルト値です。

CREATE INDEX PARAMETERS文字列でOPTIMIZE (AUTO_DAILY)を指定すると、繰り返し実行されるtoken最適化ジョブおよびfull最適化ジョブがスケジュールされます。
  • token最適化ジョブは、最も断片化されている上位10個のトークンを最適化するために、土曜日の夜以外の毎日深夜午前12時から午前3時に実行するようにスケジュールされます。午前3時までに開始されなかったジョブは、翌日の午前12時まで一時停止されます。このような一時停止されたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。

  • full最適化ジョブは、索引表を最適化して$Nをクリーン・アップするために、毎週土曜日の深夜午前12時から実行するようにスケジュールされます。

デフォルトでは、既存の索引にOPTIMIZE (AUTO_DAILY)は設定されません。自動バックグランド索引最適化を有効にするために、ALTER INDEXを使用する必要があります。

EVERY "interval-string"

定期的な間隔でtoken最適化を自動実行します。この間隔は、スケジューラ・ジョブと同じ構文のinterval-string値で指定します。

interval-stringは、前の最適化ジョブを完了できる十分な長さの期間に設定してください。そうしないと、最適化ジョブが応答しなくなる可能性があります。interval-stringは二重引用符で囲む必要があります。interval-string内の一重引用符は、前にエスケープ文字としてもう1つ一重引用符を指定する必要があります。

AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。構文は次のとおりです。

... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...
STOPLIST stoplist

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

Oracle Text検索索引のデフォルトはCTXSYS.DEFAULT_STOPLISTです。

LEXER lexer_pref

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

デフォルトはCTXSYS.DEFAULT_LEXERです。

FILTER filter_pref

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

バイナリ・テキスト列のデフォルトはNULL_FILTERです。バイナリ・テキスト列のデフォルトはAUTO_FILTERです。

WORDLIST wordlist_pref

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

SECTION GROUP section_group

セクション・グループの名前を指定します。セクション・グループは、構造化ドキュメントにセクションを作成する場合に使用します。CTX_DDLパッケージのCREATE_SECTION_GROUPを参照してください。

Oracle Text検索索引のデフォルト値は、NULL_SECTION_GROUPです。

JSON検索索引の構文

CREATE SEARCH INDEX [schema.]index ON [schema.]table(json_column) FOR JSON
[LOCAL ([PARTITION [partition] ][, PARTITION [partition] ])]
PARAMETERS(
  [DATAGUIDE ON [CHANGE (ADD_VC | function_name)] | OFF]
  [STORAGE storage_pref]
  [SEARCH_ON NONE]
  [SEARCH_ON (TEXT | TEXT_VALUE[(data_types)] | VALUE[(data_types)] | TEXT_VALUE_STRING)
             [(path_subsetting_clause)]
  [MEMORY memsize]
  [MAINTENANCE AUTO | MAINTENANCE MANUAL]
  [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
  [OPTIMIZE (MANUAL | EVERY "interval-string" | AUTO_DAILY)]
  [ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE]
  [POPULATE | NOPOPULATE]
  [DATASTORE datastore_pref]
  [FILTER filter_pref]
  [LEXER lexer_pref]
  [WORDLIST wordlist_pref]
)
[PARALLEL N]
[UNUSABLE];

PARAMETERS句を省略した場合、DATAGUIDEおよびSEARCH_ONのデフォルト値はそれぞれOFFおよびTEXT_VALUEになります。デフォルトの同期方法はMAINTENANCE AUTOです。したがって、索引はバックグラウンドで自動的に同期され、テキストと数値または日時範囲の両方が索引付けされます。

ノート:

  • SECTION GROUP句はJSON検索索引には必要ありません。セクション・グループを使用して、テキスト列にセクションを定義します。

  • MULTI_COLUMN_DATASTORETRANSACTIONALおよびSTOPLIST句は、JSON検索索引ではサポートされていません。

  • ASYNCHRONOUS_UPDATESYNCHRONOUS_UPDATEPOPULATENOPOPULATEDATASTOREFILTERLEXERWORDLISTPARALLELおよびUNUSABLEパラメータについては、「CONTEXT索引タイプの構文」を参照してください。

[schema.]index

作成するJSON検索索引の名前を指定します。

[schema.]table(index_column)

索引付けする表および列の名前を指定します。index_columnは、索引が作成される列の名前です。

列には、JSONデータ型またはIS JSONチェック制約が必要です。

LOCAL

パーティション表にローカル・パーティションJSON検索索引を作成します。索引は、元表のパーティション化スキームを使用してパーティション化されます。

レンジ、リスト、ハッシュ、時間隔、レンジ・コンポジット(レンジ、リストおよびハッシュ)、リスト・コンポジット(レンジ、リストおよびハッシュ)、ハッシュ・コンポジット(レンジ、リストおよびハッシュ)および自動リストのパーティション化スキームを使用して、表をパーティション化できます。参照パーティション表の元表が、サポートされているスキームのいずれかを使用してパーティション化されている場合、参照パーティション化を使用してローカルJSON検索索引を作成できます。

ノート:

時間隔コンポジット・パーティション表にローカルJSON検索索引は作成できません。

次の例は、3つにパーティション化された表を作成し、それを移入して、パーティション化されたJSON検索索引を作成する方法を示しています。

PROMPT create partitioned table and populate it

CREATE TABLE part_tab (a int, b JSON) 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 JSON search index
CREATE SEARCH INDEX part_idx ON part_tab (b) 
  FOR JSON LOCAL;

関連項目:

DATAGUIDE ON | OFF

JSON検索索引のデータ・ガイドのサポートを指定します。デフォルトの動作では、データ・ガイドのサポートなしでJSON検索索引が作成されます。データ・ガイドのサポートを有効にした場合は、変更トリガー・プロシージャも定義できます。

ノート:

DATAGUIDEパラメータは、JSON検索索引に対してのみ使用します。

次のオプションのいずれかを指定します。

  • ON: データ・ガイドのサポートを有効にします。DATAGUIDEの値をONに設定した場合は、独自のPL/SQLプロシージャを定義するか、事前定義された変更トリガー・プロシージャADD_VCを使用することもできます。

    ADD_VCは、仮想列がデータ・ガイドに基づいて作成されたかどうかを示します。

    function_nameは、データ・ガイドが変更された場合に実行する関数を指定します。

  • OFF: データ・ガイドのサポートと変更トリガー・プロシージャの両方を無効にします。一般的な検索インデックス機能のみを提供します。

    ノート:

    DATAGUIDE機能が無効になっている場合は、SEARCH_ON句をNONEに設定して索引を作成することができません。

Oracle Database JSON開発者ガイドデータ・ガイド対応検索索引の変更トリガーに関する項を参照してください。

STORAGE storage_pref

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

SEARCH_ON NONE

索引付け機能は有効になりません。これは、全文検索および範囲検索に使用される表が移入されないことを示します。索引のデータ・ガイドのみが保持されます。この索引は、JSON_TEXTCONTAINSを含むJSON問合せ演算子では使用されません。

次に例を示します。

CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
  FOR JSON PARAMETERS ('SEARCH_ON NONE DATAGUIDE ON');
SEARCH_ON (TEXT | TEXT_VALUE[(data_types)] | VALUE[(data_types)] | TEXT_VALUE_STRING) [(path_subsetting_clause)]

効率的な検索のために索引付けされるデータまたは属性のタイプを指定します。次の項で説明するように、パスのサブセット化句を指定することもできます。

ノート:

SEARCH_ON句は、JSONおよびXML検索索引にのみ使用できます。

次のSEARCH_ONオプションのいずれかを指定できます。

表1-15 SEARCH_ONのオプション

オプション 説明

TEXT

全文検索コンポーネントを有効にします。これは、全文検索問合せに対してテキスト・データのみが索引付けされることを示します。これには、パス情報に依存する問合せも含まれます。

索引は、JSON_TEXTCONTAINS述語、およびJSON検索索引の使用時に文字列を操作するJSON_VALUE述語またはJSON_EXISTS述語に使用されます。

問合せに全文検索のみが含まれ、文字列範囲検索や数値検索は含まれない場合、このオプションを指定すると、索引メンテナンス時間とディスク領域を節約できます。

例:

CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
  FOR JSON PARAMETERS ('SEARCH_ON TEXT');

VALUE[(data_types)]

指定されたデータ型の範囲検索コンポーネントを有効にします。

これにより、関係演算子(>、<、==、>=、<=、!=)を使用して述語に対して索引を取得できます。SEARCH_ON VALUEのみで作成されたJSON検索索引は、JSON_TEXTCONTAINS演算子を使用して全文問合せに応答できません。

サポートされるデータ型:

  • NUMBER (数値の索引付けの場合)。

  • TIMESTAMP (日時値の索引付けの場合)。

  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

データ型を指定しない場合、サポートされているすべてのデータ型に対して範囲検索索引付けが索引によって有効になります。

ノート:

BINARY_DOUBLEデータ型は、XML検索索引にのみ使用できます。

例:

  • この例では、デフォルトの動作を指定します。
    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS ('SEARCH_ON VALUE');
  • 次の例では、VALUE(data_types)構文を使用してデータ型を明示的に指定します。

    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS ('SEARCH_ON VALUE(TIMESTAMP)');
    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS ('SEARCH_ON VALUE(NUMBER, 
                                            TIMESTAMP, 
                                            VARCHAR2)');

TEXT_VALUE[(data_types)]

指定したデータ型の全文検索コンポーネントと範囲検索コンポーネントの両方を有効にします。

サポートされるデータ型:

  • NUMBER (数値の索引付けの場合)。

  • TIMESTAMP (日時値の索引付けの場合)。

  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

データ型を指定しない場合、索引によって、NUMBERおよびTIMESTAMPデータ型に対する全文検索および範囲検索索引付けが有効になります。

例:

  • この例では、デフォルトの動作を指定します。
    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS('SEARCH_ON TEXT_VALUE');
  • 次の例では、TEXT_VALUE(data_types)構文を使用してデータ型を明示的に指定します。

    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER)');
    CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
      FOR JSON PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER, 
                                                TIMESTAMP)');

TEXT_VALUE_STRING

数値、日時および完全な文字列の値に対してテキストおよび範囲ベースの索引が作成されることを示します。

これにより、NUMBERTIMESTAMPおよびVARCHAR2データ型の全文検索コンポーネントと範囲検索コンポーネントの両方が有効になります。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

例:

CREATE SEARCH INDEX json_idx ON json_tab (jsondoc) 
  FOR JSON PARAMETERS('SEARCH_ON TEXT_VALUE_STRING');

ノート: 範囲検索問合せの場合、TEXT_VALUE_STRINGのかわりに、VALUE[(data_types)]またはTEXT_VALUE[(data_types)]オプションを使用することをお薦めします。

TEXT_VALUE(NUMBER, TIMESTAMP, VARCHAR2)を使用した索引の作成は、TEXT_VALUE_STRINGと同等です。

path_subsetting_clause

パスのサブセット化SEARCH_ONとともに使用すると、索引付けに含めるまたは除外するドキュメント内のフィールドを指定できます。除外されたフィールドは索引付けされず、問合せ時にJSON検索索引は使用されません。ドキュメントから無関係なパスをフィルタで除外すると、索引付けされるデータの量が減り、ディスク領域および索引の作成時間または再構築時間が最小限に抑えられます。

path_subsetting_clauseを使用したSEARCH_ONの構文:

SEARCH_ON ( 
  TEXT | TEXT_VALUE [(data_types)] | VALUE [(data_types)] )
  [(INCLUDE | EXCLUDE) '(' paths ')']

次の点に注意してください:

  • 1つの索引にINCLUDE句とEXCLUDE句の両方を指定することはできません。

  • パスのサブセット化句は、SEARCH_ON TEXTTEXT_VALUE TEXT_VALUE_STRINGおよびVALUEで指定できます(NONEでは指定できません)。

  • INCLUDE句またはEXCLUDE句を指定するかわりに、PATHLISTパラメータを使用して、含めるまたは除外するパスのリストを指定できます。PL/SQLサブプログラムCTX_DDL.CREATE_PATH_LISTおよびCTX_DDL.ADD_PATHを使用して、パスのリストを指定します。「CREATE_PATH_LIST」を参照してください。

    PATHLISTパラメータもあるときにSEARCH_ON句を指定すると、エラーが発生します。同様に、データガイド機能が有効になっている索引に対してPATHLISTパラメータを指定することはできません。

表1-16 パスのサブセット化を使用したSEARCH_ONオプション

オプション パスのサブセット化の例

TEXT

  • この例では、全文検索および文字列等価検索用にパスのサブセット化を使用したJSON検索索引を作成します。発注書のパス$.SpecialInstructionsおよび$.LineItems.Part.Descriptionにあるフィールドのみを索引付けします。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH_ON
        TEXT INCLUDE ($.SpecialInstructions,
                      $.LineItems.Part.Description)');
  • この例では、全文検索および文字列等価検索用にパスのサブセット化を使用したJSON検索索引を作成します。発注書のパス$.Userにあるフィールドは除外されます。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH_ON
        TEXT EXCLUDE ($.User');

VALUE[(data_types)]

  • この例では、発注書のフィールド$.SpecialInstructionsおよび$.LineItems.Part.Descriptionの全文検索および文字列等価検索用にパスのサブセット化を使用したJSON検索索引を作成します。ただし、数値範囲の場合はフィールド$.PONumberおよび$.LineItems.Part.UnitPriceも索引付けし、文字列値範囲の場合はフィールド$.Reference$.User$.ShippingInstructions.nameおよび$.ShippingInstructions.Address.zipCodeも索引付けします。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH_ON 
        TEXT INCLUDE ($.SpecialInstructions, $.LineItems.Part.Description)
        VALUE(NUMBER) INCLUDE ($.PONumber, $.LineItems.Part.UnitPrice)
        VALUE(VARCHAR2) INCLUDE ($.Reference, 
                                 $.User,
                                 $.ShippingInstructions.name,
                                 $.ShippingInstructions.Address.zipCode)');

    あるいは、パラメータPATHLISTを使用して同じ索引を作成できます。この値は、次に示すPL/SQLサブプログラムCTX_DDL.create_path_listおよびCTX_DDL.add_pathを使用して作成される、含めるパスの名前付きリストです:

    BEGIN
      CTX_DDL.create_path_list('json_pl', CTX_DDL.PATHLIST_JSON, CTX_DDL.PATHLIST_INCLUDE);
      CTX_DDL.add_path('json_pl', 'TEXT',     '$.SpecialInstructions');
      CTX_DDL.add_path('json_pl', 'TEXT',     '$.LineItems.Part.Description');
      CTX_DDL.add_path('json_pl', 'NUMBER',   '$.PONumber');
      CTX_DDL.add_path('json_pl', 'NUMBER',   '$.LineItems.Part.UnitPrice');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.Reference');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.User');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.name');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.Address.zipCode');
    END;
    /
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('PATHLIST json_pl');
  • この例では、数値範囲用にパスのサブセット化を使用したJSON検索索引を作成します。発注書のパス$.PONumberにあるフィールドは除外されます。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH_ON
        VALUE(NUMBER) EXCLUDE ($.PONumber)');

TEXT_VALUE[(data_types)]

  • この例では、発注書のフィールド$."FieldWithNoQuote"および$."FieldWith\"Quote\""の全文検索および文字列等価検索用にパスのサブセット化を使用したJSON検索索引を作成します。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH ON 
        TEXT_VALUE INCLUDE ($."FieldWithNoQuote", $."FieldWith\"Quote\"")');

    あるいは、パラメータPATHLISTを使用して同じ索引を作成できます。この値は、次に示すPL/SQLサブプログラムCTX_DDL.create_path_listおよびCTX_DDL.add_pathを使用して作成される、含めるパスの名前付きリストです:

    BEGIN
      CTX_DDL.create_path_list('json_pl', CTX_DDL.PATHLIST_JSON, CTX_DDL.PATHLIST_INCLUDE);
      CTX_DDL.add_path('json_pl', 'TEXT',     '$.SpecialInstructions');
      CTX_DDL.add_path('json_pl', 'TEXT',     '$.LineItems.Part.Description');
      CTX_DDL.add_path('json_pl', 'NUMBER',   '$.PONumber');
      CTX_DDL.add_path('json_pl', 'NUMBER',   '$.LineItems.Part.UnitPrice');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.Reference');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.User');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.name');
      CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.Address.zipCode');
    END;
    /
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('PATHLIST json_pl');
  • この例では、数値範囲用にパスのサブセット化を使用したJSON検索索引を作成します。発注書のパス$.PONumberにあるフィールドは除外されます。
    CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
      FOR JSON PARAMETERS ('SEARCH_ON
        TEXT_VALUE(NUMBER) EXCLUDE ($.PONumber)');

TEXT_VALUE_STRING

この例では、パスのサブセット化を使用してJSON検索索引を作成します。パスは、使用可能なデータ型に従って索引付けされます。たとえば、フィールド$.PONumberの内容が145980の場合、145980は全文検索のトークンとして、数値範囲検索の数値(145980)として、また文字列範囲検索の文字列("145980")として索引付けされます。
CREATE SEARCH INDEX json_idx ON json_tab (purchase_order_jsondoc)
  FOR JSON PARAMETERS ('SEARCH_ON
    TEXT_VALUE_STRING INCLUDE ($.SpecialInstructions,
                               $.LineItems.Part.Description,
                               $.PONumber, $.LineItems.Part.UnitPrice,
                               $.Reference,
                               $.User,
                               $.ShippingInstructions.name,
                               $.ShippingInstructions.Address.zipCode)');
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以上に再設定する必要があります。

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

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

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

MAINTENANCE AUTO | MAINTENANCE MANUAL

元表に対する挿入、更新または削除があるときのJSON検索索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

次のいずれかのメンテナンス・タイプを指定できます。

表1-17 メンテナンス・タイプ

メンテナンス・タイプ 説明

MAINTENANCE AUTO

これは、Oracle Text CONTEXTおよび検索索引を同期するためのデフォルトのメソッドです。

このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

ノート: シャドウ索引では自動メンテナンスはサポートされていません。自動メンテナンス・モードで準拠する要件および制限事項の詳細なリストは、『Oracle Textアプリケーション開発者ガイド』を参照してください。

MAINTENANCE MANUAL

このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

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

元表に対する挿入、更新または削除があるときのJSON検索索引の同期のためのSYNCタイプを指定します。

これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

ノート:

デフォルトでは、CONTEXT索引と検索索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、SYNCメソッドを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

表1-10で説明するように、SYNCメソッドのいずれかを指定できます。

ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(ON COMMITEVERYまたはMANUAL)が設定されます。プライマリ・パラメータ文字列に指定されたsyncのタイプは、すべての索引パーティションに適用されます。ON COMMIT同期は、JSON検索索引のデフォルトの同期方法です。ON COMMIT同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズを使用する必要があります。

自動(EVERY)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。interval-string引数で繰返しスケジュールを定義するには、カレンダ構文の値を使用します。これらの値の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

構文:
SYNC [EVERY "interval-string"] MEMORY mem_size PARALLEL paradegree
:
SYNC [EVERY "freq=secondly;interval=20"] MEMORY 500M PARALLEL 2
次の例では、自動(EVERY)同期化を使用してJSON検索索引を作成します。
  • 毎晩午前1時に開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(json_document) 
      FOR JSON PARAMETERS('SYNC (EVERY "freq=daily; byhour=1")');
  • 5分ごとに開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(json_document) 
      FOR JSON PARAMETERS('SYNC (EVERY "freq=minutely; interval=5")');
OPTIMIZE

自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます。

表1-18 OPTIMIZEのタイプ

OPTIMIZEタイプ 説明

MANUAL

これはデフォルト値です。

自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

AUTO_DAILY

CREATE INDEX PARAMETERS文字列でOPTIMIZE (AUTO_DAILY)を指定すると、繰り返し実行されるTOKEN_TYPE最適化ジョブおよびfull最適化ジョブが次のようにスケジュールされます:

  • TOKEN_TYPE最適化ジョブは、索引内のSDATAセクションを最適化するために、土曜日の夜を除き毎晩午前12時から午前3時まで実行するようにスケジュールされます。午前3時までに開始されなかったジョブは、翌日の午前12時まで一時停止されます。このような一時停止されたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。

  • full最適化ジョブは、索引表を最適化し$Nをクリーン・アップするために、毎週土曜日の夜午前12時から実行するようにスケジュールされます。

EVERY "interval-string"

interval-stringの値で指定された一定の間隔でTOKEN_TYPE最適化ジョブを自動実行します。この間隔は、スケジューラ・ジョブと同じ構文を使用します。

interval-stringは、前の最適化ジョブを完了できる十分な長さの期間に設定してください。そうしないと、最適化ジョブが応答しなくなる可能性があります。interval-stringは二重引用符で囲む必要があります。interval-string内の一重引用符は、前にエスケープ文字としてもう1つ一重引用符を指定する必要があります。

AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。構文は次のとおりです。

... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...

XML検索索引の構文

Oracle Database 23ai以降、XML検索索引は、XML対応の索引を作成するための簡素化された構文を提供します。XMLType列または表内に格納されるXMLドキュメントに索引を作成できます。これにより、XMLドキュメントに対してテキスト問合せ、パス対応問合せおよび範囲検索問合せを実行できます。

CREATE SEARCH INDEX [schema.]index ON [schema.]table(xml_column) 
FOR XML 
[LOCAL]
PARAMETERS(
  [SEARCH_ON (TEXT | TEXT_VALUE(data_types) | VALUE(data_types))]
  [STORAGE storage_pref]
  [PREFIX_NS (prefix_ns_mapping)]
  [MEMORY memsize]
  [MAINTENANCE AUTO | MAINTENANCE MANUAL]
  [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
  [OPTIMIZE (MANUAL | EVERY "interval-string" | AUTO_DAILY)]
)
[PARALLEL N]
[UNUSABLE];
[schema.]index

作成するXML検索索引の名前を指定します。

[schema.]table(index_column)

索引付けする表および列の名前を指定します。index_columnは、索引が作成される列の名前です。

この索引は、TRANSPORTABLE BINARY XML (TBX)記憶域オプションを使用してドキュメントを格納するXMLType列に対してのみ作成できます。

LOCAL

パーティション表にローカル・パーティションXML検索索引を作成します。索引は、元表のパーティション化スキームを使用してパーティション化されます。

レンジ、リスト、ハッシュ、時間隔、レンジ・コンポジット(レンジ、リストおよびハッシュ)、リスト・コンポジット(レンジ、リストおよびハッシュ)、ハッシュ・コンポジット(レンジ、リストおよびハッシュ)および自動リストのパーティション化スキームを使用して、表をパーティション化できます。参照パーティション表の元表が、サポートされているスキームのいずれかを使用してパーティション化されている場合、参照パーティション化を使用してローカルXML検索索引を作成できます。

ノート:

時間隔コンポジット・パーティション表にローカルXML検索索引は作成できません。

次の例は、3つにパーティション化された表を作成し、それを移入して、パーティション化されたXML検索索引を作成する方法を示しています。

PROMPT create partitioned table and populate it

CREATE TABLE part_tab (a int, b SYS.XMLType) XMLTYPE b STORE AS 
  TRANSPORTABLE BINARY XML 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 XML search index
CREATE SEARCH INDEX part_idx ON part_tab (b) 
  FOR XML PARAMETERS ('SEARCH_ON TEXT') LOCAL;
STORAGE storage_pref

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

ストレージ・プリファレンスを指定しない場合、デフォルトのストレージ・プリファレンス(CTXSYS.XQFT_MEDIUM)が使用されます。

SEARCH_ON (TEXT | TEXT_VALUE(data_types) | VALUE(data_types))

効率的な検索のために索引付けされるデータまたは属性のタイプを指定します。

ノート:

SEARCH_ON句は、JSONおよびXML検索索引にのみ使用できます。

次のSEARCH_ONオプションのいずれかを指定できます。

表1-19 SEARCH_ONのオプション

オプション 説明

TEXT

全文検索コンポーネントを有効にします。これは、全文検索問合せに対してテキスト・データのみが索引付けされることを示します。これには、パス情報に依存する問合せも含まれます。

索引は、XQueryフルテキスト演算子および句を参照するXMLEXISTS述語に使用されます。

問合せに全文検索のみが含まれ、文字列範囲検索や数値検索は含まれない場合、このオプションを指定すると、索引メンテナンス時間とディスク領域を節約できます。

次に例を示します。

CREATE SEARCH INDEX ex_xml_idx ON ex_tab (xmldoc) 
  FOR XML PARAMETERS ('SEARCH_ON TEXT');

VALUE(data_types)

指定されたデータ型の範囲検索コンポーネントを有効にします。

これにより、関係演算子(>、<、==、>=、<=、!=)を使用して述語に対して索引を取得できます。SEARCH_ON VALUEコンポーネントのみが有効になっているXML検索索引は、XQueryフルテキスト演算子がXMLEXISTS述語に存在する場合、全文問合せに応答できません。

1つ以上のデータ型を指定する必要があります。

  • BINARY_DOUBLEおよびNUMBER (数値の索引付けの場合)。

  • TIMESTAMP (日時値の索引付けの場合)。

  • VARCHAR2 (完全な文字列値の索引付けの場合)。文字列値は、トークン化やその他の変換なしでそのまま索引付けされます。237バイト以下の文字列はすべて索引付けされます。

次に例を示します。

CREATE SEARCH INDEX ex_xml_idx ON ex_tab (xmldoc) 
  FOR XML PARAMETERS ('SEARCH_ON VALUE(NUMBER)');
CREATE SEARCH INDEX ex_xml_idx ON ex_tab (xmldoc) 
  FOR XML PARAMETERS ('SEARCH_ON VALUE(BINARY_DOUBLE, 
                                       NUMBER, 
                                       TIMESTAMP, 
                                       VARCHAR2)');

TEXT_VALUE(data_types)

指定したデータ型の全文検索コンポーネントと範囲検索コンポーネントの両方を有効にします。範囲検索問合せの場合は、NUMBER (数値の索引付けの場合)やTIMESTAMP (日時値の索引付けの場合)などの1つ以上のデータ型を指定する必要があります。

次に例を示します。

CREATE SEARCH INDEX ex_xml_idx ON ex_tab (xmldoc) 
  FOR XML PARAMETERS('SEARCH_ON TEXT_VALUE(TIMESTAMP)');
CREATE SEARCH INDEX ex_xml_idx ON ex_tab (xmldoc) 
  FOR XML PARAMETERS('SEARCH_ON TEXT_VALUE(NUMBER, 
                                           TIMESTAMP)');

ノート:

XML検索索引にはSEARCH_ON NONEおよびSEARCH_ON TEXT_VALUE_STRINGを使用できません。

XML検索索引のTEXT_VALUEおよびVALUEオプションを使用してデータ型を明示的に指定する必要があります。指定しないと、文でエラーが発生します。

PREFIX_NS (prefix_ns_mapping)

XML検索索引のプリフィックスとネームスペースのマッピングを指定します。

XMLExists問合せには、XMLネームスペース宣言を含めることができます。検索索引の作成時に、様々なXMLネームスペースに属する修飾名を個別に格納できます。

プリフィックスとネームスペースのマッピングでは、次の構文が使用されます。
xmlns:local_name="URI_string"

xmlnsは、デフォルトのXMLネームスペース宣言属性です。URI_string値は必須ではありません。二重引用符で囲まれた空の文字列を指定できます。xmlnsプリフィックスを使用して修飾名を指定することもできます。プリフィクスとネームスペースのマッピングを指定しない場合、xmlnsが使用されます。

次に例を示します。

PREFIX_NS (xmlns="example.com" xmlns:pfx="www.example1.com" xmlns:pfx2="example2.com"));

ノート:

PREFIX_NS句は、XML検索索引にのみ使用します。

ALTER INDEXを使用してプリフィックスとネームスペースのマッピングの指定を変更することはできません。

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以上に再設定する必要があります。

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

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

MAINTENANCE AUTO | MAINTENANCE MANUAL

元表に対する挿入、更新または削除があるときのXML検索索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

次のいずれかのメンテナンス・タイプを指定できます。

表1-20 メンテナンス・タイプ

メンテナンス・タイプ 説明

MAINTENANCE AUTO

これは、Oracle Text CONTEXTおよび検索索引を同期するためのデフォルトのメソッドです。

このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

ノート: シャドウ索引では自動メンテナンスはサポートされていません。自動メンテナンス・モードで準拠する要件および制限事項の詳細なリストは、『Oracle Textアプリケーション開発者ガイド』を参照してください。

MAINTENANCE MANUAL

このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

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

元表に対する挿入、更新または削除があるときのXML検索索引の同期のためのSYNCメソッドを指定します。

これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

ノート:

デフォルトでは、CONTEXT索引と検索索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、SYNCメソッドを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

表1-10で説明するように、SYNCメソッドのいずれかを指定できます。

ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(ON COMMITEVERYまたはMANUAL)が設定されます。プライマリ・パラメータ文字列に指定されたsyncのタイプは、すべての索引パーティションに適用されます。ON COMMITは、XML検索索引のデフォルトの同期方法です。ON COMMIT同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズを使用する必要があります。

自動(EVERY)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。interval-string引数で繰返しスケジュールを定義するには、カレンダ構文の値を使用します。これらの値の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

構文:
SYNC [EVERY "interval-string"] MEMORY mem_size PARALLEL paradegree
:
SYNC [EVERY "freq=secondly;interval=20"] MEMORY 500M PARALLEL 2
次の例では、自動(EVERY)同期化を使用してXML検索索引を作成します。
  • 毎晩午前1時に開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(xml_document) 
      FOR XML PARAMETERS('SYNC (EVERY "freq=daily; byhour=1")');
  • 5分ごとに開始:
    CREATE SEARCH INDEX nightly_refreshed ON purchase_orders(xml_document) 
      FOR XML PARAMETERS('SYNC (EVERY "freq=minutely; interval=5")');
OPTIMIZE

自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます:

表1-21 OPTIMIZEのタイプ

OPTIMIZEタイプ 説明

MANUAL

これはデフォルト値です。

自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

AUTO_DAILY

CREATE INDEX PARAMETERS文字列でOPTIMIZE (AUTO_DAILY)を指定すると、繰り返し実行されるTOKEN_TYPE最適化ジョブおよびfull最適化ジョブが次のようにスケジュールされます:

  • TOKEN_TYPE最適化ジョブは、索引内のSDATAセクションを最適化するために、土曜日の夜を除き毎晩午前12時から午前3時まで実行するようにスケジュールされます。午前3時までに開始されなかったジョブは、翌日の午前12時まで一時停止されます。このような一時停止されたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。

  • full最適化ジョブは、索引表を最適化し$Nをクリーン・アップするために、毎週土曜日の夜午前12時から実行するようにスケジュールされます。

EVERY "interval-string"

interval-stringの値で指定された一定の間隔でTOKEN_TYPE最適化ジョブを自動実行します。この間隔は、スケジューラ・ジョブと同じ構文を使用します。

interval-stringは、前の最適化ジョブを完了できる十分な長さの期間に設定してください。そうしないと、最適化ジョブが応答しなくなる可能性があります。interval-stringは二重引用符で囲む必要があります。interval-string内の一重引用符は、前にエスケープ文字としてもう1つ一重引用符を指定する必要があります。

AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。構文は次のとおりです。

... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...

1.7 CREATE HYBRID VECTOR INDEX

CREATE HYBRID VECTOR INDEX SQL文を使用してハイブリッド・ベクトル索引を作成します。これにより、ドキュメントの索引付けおよび全文検索とベクトル類似検索の組合せを使用した問合せを行うことができます。

用途

ハイブリッド・ベクトル索引と呼ばれる特殊なドメイン索引のクラスを作成します。

ハイブリッド・ベクトル索引は、既存のOracle Text索引データ構造とベクトル索引データ構造を1つの統一構造に組み合せるOracle TextのSEARCH INDEX型です。これは、ドキュメントのテキスト・フィールドとベクトル・フィールドの両方を格納する単一ドメインの索引です。テキスト検索と類似検索は、それぞれトークン化された語句とベクトルに対して実行されます。2つの検索結果が結合およびスコアリングされて、統合された結果セットが返されます。

ハイブリッド・ベクトル索引の目的は、ユーザーがベクトルキーワードの両方で検索できるようにすることで、Oracle Text索引の検索関連性を高めることです。従来のキーワードベースのテキスト検索をベクトルベースの類似検索と統合することで、全体的な検索エクスペリエンスを向上させ、より正確な情報をユーザーに提供できます。

使用上のノート

ハイブリッド・ベクトル索引を作成するには、次のような最小限の情報を指定できます:

  • 索引を作成する表または列

  • 埋込みを生成するためのデータベース内のONNX埋込みモデル

複数の列または表をまとめて索引付けする必要がある場合は、MULTI_COLUMN_DATASTOREまたはUSER_DATASTOREプリファレンスを指定できます。

他のすべての索引付けパラメータは、ドキュメントの索引付けを容易にするために事前定義されており、ユーザーはテキスト処理、チャンク化または埋込みの戦略のエキスパートである必要はありません。必要に応じて、次のものを使用して事前定義済パラメータを変更できます:

  • 索引のベクトル索引の部分のベクトル検索プリファレンス

  • 索引のテキスト索引の部分のテキスト検索プリファレンス

  • 結合された索引に対するDML操作の索引メンテナンス・プリファレンス

ハイブリッド・ベクトル索引の作成プロセスの詳細、またはハイブリッド・ベクトル索引の概要は、「ハイブリッド・ベクトル索引の理解」を参照してください。

ノート:

ハイブリッド・ベクトル索引を作成および使用する際に注意する必要がある重要な点がいくつかあります。「ハイブリッド・ベクトル索引のガイドラインおよび制限事項」を参照してください。

構文

CREATE HYBRID VECTOR INDEX [schema.]index_name ON 
  [schema.]table_name(column_name)
   PARAMETERS ('paramstring') 
  [FILTER BY filter_column[, filter_column]...]
  [ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...]
  [PARALLEL n];

最小限必要なパラメータのみを指定したDDLの例を次に示します。

CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
  doc_table(text_column)
  PARAMETERS('MODEL my_embed_model');

このセクションの最後には、より包括的な例が示されています。

すべての必須およびオプションの索引付けパラメータを確認します:

[schema.]index_name

作成するハイブリッド・ベクトル索引の名前を指定します。

[schema.]table_name(column_name)

ハイブリッド・ベクトル索引を作成する表および列の名前を指定します。VARCHAR2CLOBおよびBLOBデータ型を使用して、1つ以上のテキスト列にハイブリッド・ベクトル索引を作成できます。

ノート:

IS JSONチェック制約を使用するテキスト列には、ハイブリッド・ベクトル索引を作成できません。

HTML、PDF、Microsoft Wordおよびプレーン・テキストを含むほとんどのドキュメント形式を索引付けできるため、サポートされているタイプをテキスト列にロードできます。完全なリストについては、サポートされているドキュメント形式を参照してください。

複数の列または表をまとめて索引付けする必要がある場合は、データストア・プリファレンスを指定します(後述の「テキスト検索プリファレンス」を参照)。

PARAMETERS(paramstring)

paramstringでプリファレンスを指定します:

  • ベクトル検索プリファレンス:

    ベクトル検索の入力処理に関連する、ハイブリッド・ベクトル索引の「ベクトル索引」の部分を構成します。

    ノート:

    PARAMETERS句に最低限の一連のパラメータ(必須のMODELおよびオプションのVECTOR_IDXTYPEパラメータ)を直接渡すか、ベクトル化プリファレンスを使用してベクトル検索パラメータの完全なセットを指定できます。PARAMETERS句で両方(パラメータの直接設定とベクトル化)を使用することはできません。
    • MODELおよびVECTOR_IDXTYPEを直接指定した場合:

      CREATE HYBRID VECTOR INDEX [schema.]index_name ON 
        [schema.]table_name(column_name)
         PARAMETERS ('MODEL <model_name> 
                     [VECTOR_IDXTYPE <vector_index_type>]') 
        [FILTER BY filter_column[, filter_column]...]
        [ORDER BY oby_column[desc|asc][, oby_column[desc|asc]]...]
        [PARALLEL n];

      ここで、MODELには、入力データに対するベクトル埋込みを生成するためにデータベースにインポートするベクトル埋込みモデルを指定します。

      ノート:

      現在、ONNXのデータベース内の埋込みモデルのみがサポートされています。

      VECTOR_IDXTYPEには、作成するベクトル索引のタイプを指定します。たとえば、Inverted File Flat (IVF)ベクトル索引の場合はIVF (デフォルト)、Hierarchical Navigable Small World (HNSW)ベクトル索引の場合はHNSWなどです。このパラメータを省略すると、IVFベクトル索引がデフォルトで作成されます。

      ハイブリッド・ベクトル索引でのLOCAL索引の作成は、基礎となるindex_typeIVFの場合にサポートされます。次に例を示します。

      CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column) 
      parameters('MODEL my_doc_model
                  VECTOR_IDXTYPE IVF')
      LOCAL PARALLEL;

      注意:

      基礎となるindex_typeHNSWの場合にハイブリッド・ベクトル索引にLOCAL索引を作成すると、ドキュメント処理を開始する前にエラーがスローされます(早期失敗)。
    • ベクトル化プリファレンスを使用する場合:

      ベクトル化プリファレンスは、チャンク化(UTL_TO_CHUNKSまたはVECTOR_CHUNKS)、埋込み(UTL_TO_EMBEDDINGUTL_TO_EMBEDDINGSまたはVECTOR_EMBEDDING)およびベクトル索引(distanceaccuracyまたはvector_idxtype)に関連するすべての索引付けパラメータをまとめて保持するJSONオブジェクトです。

      ベクトル化プリファレンスを作成するには、DBMS_VECTOR_CHAIN.CREATE_PREFERENCE PL/SQLファンクションを使用します。ベクトル化プリファレンスを作成するには、DBMS_VECTOR_CHAIN.CREATE_PREFERENCEを参照してください。

      ベクトル化プリファレンスを作成した後、VECTORIZERパラメータを使用してプリファレンス名をここで渡すことができます。次に例を示します:

      begin
        DBMS_VECTOR_CHAIN.CREATE_PREFERENCE(
          'my_vectorizer_pref',
           dbms_vector_chain.vectorizer,
          json('{
                  "vector_idxtype":  "hnsw",
                  "model"         :  "my_doc_model",
                  "by"            :  "words",
                  "max"           :  100,
                  "overlap"       :  10,
                  "split"         :  "recursively"
                }'
              ));
      end;
      /
      
      CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
        doc_table(text_column) 
          parameters('VECTORIZER my_vectorizer_pref');
  • テキスト検索プリファレンス:

    キーワード検索の入力処理に関連する、ハイブリッド・ベクトル索引の「Oracle Text索引」の部分を構成します。

    これらのパラメータは、ハイブリッド・ベクトル索引付けパイプラインのテキスト処理およびトークン化のステージを定義します。これらはすべて、Oracle Text索引のみの操作時に指定する一連のパラメータと同じです。

    [DATASTORE datastore_pref]
    [STORAGE storage_pref]
    [MEMORY memsize]
    [STOPLIST stoplist]
    [LEXER lexer_pref] 
    [FILTER filter_pref] 
    [WORDLIST wordlist_pref]  
    [SECTION GROUP section_group]
    DATASTORE datastore_pref

    データストア・プリファレンスの名前を指定します。ソース・ファイルが格納されるローカルまたはリモートの場所を指定するには、データストア・プリファレンスを使用します。

    複数の列または表をまとめて索引付けする場合は、「MULTI_COLUMN_DATASTORE」および「USER_DATASTORE」を参照してください。

    すべてのデータストア・プリファレンスの詳細なリストは、「データストア型」を参照してください。

    デフォルト: DIRECT_DATASTORE

    STORAGE storage_pref

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

    MEMORY memsize

    索引付けに使用するランタイム・メモリー量を指定します。

    memsize = number[K|M|G]

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

    memsizeの値は、1MからCTX_PARAMETERSビューのMAX_INDEX_MEMORYの値までの間で指定する必要があります。MAX_INDEX_MEMORYより大きいメモリー・サイズを指定するには、CTX_ADM.SET_PARAMETERを使用してこのパラメータをmemsize以上にリセットする必要があります。CTX_ADM.SET_PARAMETERを参照してください。

    Oracle Text検索索引のデフォルトは500 MBです。

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

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

    STOPLIST stoplist

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

    デフォルト: CTXSYS.DEFAULT_STOPLIST

    LEXER lexer_pref

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

    デフォルト: CTXSYS.DEFAULT_LEXER

    FILTER filter_pref

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

    バイナリ・テキスト列のデフォルトはNULL_FILTERです。バイナリ・テキスト列のデフォルトはAUTO_FILTERです。

    WORDLIST wordlist_pref

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

    SECTION GROUP section_group

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

    デフォルト: NULL_SECTION_GROUP

  • 索引メンテナンス・プリファレンス:

    ハイブリッド・ベクトル索引全体に対するDML操作(つまり、索引を同期および最適化する方法)を構成します。

    ハイブリッド・ベクトル索引は基本的にOracle Textの検索索引タイプであるため、Oracle Text索引のメンテナンス固有のすべての機能を適用できます。

    [MAINTENANCE AUTO | MAINTENANCE MANUAL]
    [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
    [OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]
    MAINTENANCE AUTO | MAINTENANCE MANUAL

    実表に対する挿入、更新または削除があるときのハイブリッド・ベクトル索引の同期のためのメンテナンス・タイプを指定します。索引に指定されたメンテナンス・タイプは、すべての索引パーティションに適用されます。

    次のいずれかのメンテナンス・タイプを指定できます。

    メンテナンス・タイプ 説明

    MAINTENANCE AUTO

    このメソッドは、索引を自動メンテナンスに設定します。つまり、索引は最適な間隔でバックグラウンドで自動的に同期されます。

    SYNCタイプを手動で構成したり、同期間隔を設定する必要はありません。バックグラウンド・メカニズムは、DMLキューを追跡することで、同期間隔を自動的に決定し、バックグラウンドのSYNC.INDEX操作をスケジュールします。

    MAINTENANCE MANUAL

    このメソッドは、索引を手動メンテナンスに設定します。これは、MANUALEVERYON COMMITなどのSYNCタイプを指定できる非自動メンテナンス(同期)モードです。

    SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)
    実表に対する挿入、更新または削除があるときのハイブリッド・ベクトル索引の同期のためのSYNCタイプを指定します。これらのSYNC設定は、手動メンテナンスに設定されている索引にのみ適用されます。

    ノート:

    デフォルトでは、ハイブリッド・ベクトル索引は自動メンテナンス・モード(MAINTENANCE AUTO)で実行されます。つまり、DMLは最適な間隔でバックグラウンドで索引に自動的に同期されます。したがって、ハイブリッド・ベクトル索引を維持するために、SYNCタイプを手動で構成する必要はありません。ただし、必要に応じて、索引のデフォルト設定を変更する場合は手動で構成できます。

    次のSYNCメソッドのいずれかを指定できます:

    SYNCタイプ 説明

    MANUAL

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

    EVERY interval-string

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

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

    ON COMMIT

    コミットの直後に索引を同期化します。コミットは、同期化が完了するまで戻りません。

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

    この同期タイプは、STAGE_ITAB索引オプションが有効なときに最も有効に機能します。有効でない場合、主な索引が大幅に断片化し、頻繁なOPTIMIZEコールが必要になります。

    自動(EVERY)同期化の場合は、メモリー・サイズおよびパラレル同期化を指定できます。interval-string引数で繰返しスケジュールを定義するには、カレンダ構文の値を使用します。これらの値の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

    構文:
    SYNC [EVERY "interval-string"] MEMORY mem_size PARALLEL paradegree
    たとえば、索引を20秒間隔で同期するには:
    SYNC [EVERY "freq=secondly;interval=20"] MEMORY 500M PARALLEL 2
    OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string)

    ハイブリッド・ベクトル索引の自動バックグラウンド索引最適化を有効にするには、OPTIMIZEを指定します。次のいずれかのOPTIMIZEメソッドを指定できます。

    OPTIMIZEタイプ 説明

    MANUAL

    自動最適化は提供されません。CTX_DDL.OPTIMIZE_INDEXを使用して、手動で索引を最適化する必要があります。

    AUTO_DAILY

    これがデフォルトの設定です。OPTIMIZE (AUTO_DAILY)を指定した場合、最適化FULLジョブが、ローカル時間の午前0時から毎日実行されるようにスケジュールされます。

    EVERY "interval-string"

    定期的な間隔でtoken最適化を自動実行します。この間隔は、スケジューラ・ジョブと同じ構文のinterval-string値で指定します。

    interval-stringは、前の最適化ジョブを完了できる十分な長さの期間に設定してください。そうしないと、最適化ジョブが応答しなくなる可能性があります。interval-stringは二重引用符で囲む必要があります。interval-string内の一重引用符は、前にエスケープ文字としてもう1つ一重引用符を指定する必要があります。

    AUTO_DAILY | EVERY "interval-string"の設定では、パラレル最適化を指定できます。

    構文:

    OPTIMIZE [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...
    たとえば、索引を20分間隔で最適化するには:
    OPTIMIZE [EVERY "freq=minutely;interval=20"] PARALLEL 2
FILTER BY filter_column

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

  • 次の関係演算子を使用できます:

    <<==>=>betweenおよびLIKE (VARCHAR2の場合)

  • これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2またはRAWのみです。また、CHARVARCHAR2およびVARCHAR2型がサポートされるのは、最大長が指定されており、249バイトを超えない場合のみです。

    CHAR列またはVARCHAR2列の最大長を文字数で指定する場合(たとえば、VARCHAR2 (50 CHAR))、それをFLOOR (249/max_char_width)より長くすることはできません。ここでのmax_char_widthは、データベース文字セット内の文字の最大幅です。

    たとえば、データベース文字セットがAL32UTF8の場合は、指定する最大列長を62文字より長くはできません。サポートされている型(CHARNUMBERDATEVARCHAR2またはRAW)のADT属性も使用できます。

    これ以外のデータ型の場合はエラーが発生します。たとえば、式func(cola)および仮想列は使用できません。

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

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

ORDER BY oby_column[desc|asc]

問合せ結果のソートに使用する1つ以上の構造化索引付き列を指定します。

構造化されたoby_columnsのリストを指定できます。これらの列に使用できる型は、CHARNUMBERDATEVARCHAR2またはRAWのみです。249バイトより長いVARCHAR2およびRAW列は、最初の249バイトに切り捨てられます。式(func(cola)など)および仮想列は使用できません。

指定した列の順序が重要です。問合せのORDER BY句には、次のものを含めることができます:

  • 順序付けされたORDER BY列全体

  • 順序付けされたORDER BY列の接頭辞のみ

  • スコアとそれに続く順序付けされたORDER BY列の接頭辞

DESCは結果を降順(最も大きい値から最も小さい値)でソートし、ASC (デフォルト)は結果を昇順(最も小さい値から最も大きい値)でソートします。

[PARALLEL n]

複数のCPUがある場合、パラレル索引付けにより、索引のパフォーマンスが向上します。索引をパラレルに作成するには、並列度を使用してPARALLEL句を使用します。

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

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

  • ベクトル検索のプリファレンスが直接指定されている場合:

    この例では、必須パラメータmodelのみがPARAMETERS句に指定されています:

    CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column)
      parameters('MODEL my_doc_model');

    この例では、パラメータmodelvector_idxtypeの両方が指定されています:

    CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column)
      parameters('MODEL my_doc_model 
                  VECTOR_IDXTYPE HNSW');
  • ベクトル検索のプリファレンスがVECTORIZERを使用して指定されている場合:

    この例では、PARAMETERS句でvectorizerパラメータを使用して、my_vectorizer_specプリファレンスを指定します:

    begin
      DBMS_VECTOR_CHAIN.CREATE_PREFERENCE(
        'my_vectorizer_spec',
         dbms_vector_chain.vectorizer,
        json('{"vector_idxtype" :  "hnsw",
               "model"          :  "my_doc_model",
               "by"             :  "words",
               "max"            :  100,
               "overlap"        :  10,
               "split"          :  "recursively"}'));
    end;
    /
    
    CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column) 
      parameters('VECTORIZER my_vectorizer_spec');
  • テキスト検索およびベクトル検索のプリファレンスが直接指定されている場合:

    この例では、必須のベクトル検索パラメータMODELのみがPARAMETERS句に指定されています。テキスト検索パラメータも指定します:

    CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column)
      parameters('MODEL my_doc_model
                  DATASTORE my_datastore
                  STORAGE my_storage
                  STOPLIST my_stoplist
                  LEXER my_lexer')
      ORDER BY docid asc;
  • テキスト検索および索引メンテナンスのプリファレンスが直接指定され、ベクトル検索プリファレンスがVECTORIZERを使用して指定されている場合:

    この例では、VECTORIZERパラメータを使用して、ベクトル検索パラメータを保持するmy_vectorizer_specプリファレンスを指定します。すべてのテキスト検索および索引メンテナンス・プリファレンスが直接指定されます。

    begin
      DBMS_VECTOR_CHAIN.CREATE_PREFERENCE(
        'my_vectorizer_spec',
         dbms_vector_chain.vectorizer,
        json('{
                "vector_idxtype" :  "hnsw",
                "model"          :  "my_doc_model",
                "by"             :  "words",
                "max"            :  100,
                "overlap"        :  10,
                "split"          :  "recursively"
             }'
            ));
    end;
    /
    
    CREATE HYBRID VECTOR INDEX my_hybrid_idx on 
      doc_table(text_column) 
      parameters('VECTORIZER my_vectorizer_spec
                  DATASTORE my_datastore
                  STORAGE my_storage
                  MEMORY 128M
                  MAINTENANCE AUTO
                  OPTIMIZE AUTO_DAILY
                  STOPLIST my_stoplist
                  LEXER my_lexer
                  FILTER my_filter
                  WORDLIST my_wordlist
                  SECTION GROUP my_section_group')
      FILTER BY category, author
      ORDER BY score(10), score(20) desc  
      PARALLEL 3;

1.8 DROP INDEX

ノート:

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

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

用途

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

構文

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

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

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

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

DROP INDEX doc_index;

関連トピック

ALTER INDEX

CREATE INDEX

1.9 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アプリケーション開発者ガイド』を参照してください。

1.10 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」

1.11 SCORE

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

SCORE演算子は、SELECTORDER BYまたはGROUP BY句で使用できます。

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

構文

SCORE(label NUMBER)

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

ノート

ネストされた問合せの場合は、エラーを回避するために別名を指定する必要があります。たとえば、ここでは、外部のSELECT問合せを識別するために、内部のSELECT問合せで別名sが使用されます。

SELECT s FROM (
      SELECT SCORE(1) AS s FROM mytable 
      WHERE CONTAINS(text, 'oracle', 1) > 0
); 

  • 単一の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);
  • 単一のJSON_TEXTCONTAINS句を使用する場合:

    この問合せでは、説明にテキストrunが含まれる発注書の発注番号を選択します。オプションのスコアリングラベル引数を使用して、関連性によって結果を順序付けします。問合せにより、各発注書の関連性スコアも返されます。

    json_textcontainsに渡されるスコアリング・ラベルは、SCOREで使用されるラベルと同じである必要があります。この場合、ラベルは1です。

    SELECT po.po_document.PONumber, SCORE(1)
          FROM j_purchaseorder po
          WHERE json_textcontains (po.po_document,
                '$.LineItems.Part.Description',
                'run',
                1)
          ORDER BY SCORE(1) DESC;

    結果(一部省略):

    リストされた最初の17件の発注書のスコアは18で、残りの85件の発注書のスコアは9です。前者のグループ一致パターンrunは後者より優れています(発注書当たり1回ではなく2回一致しています):

    PONUMBER SCORE(1)
    -------- --------
    1 18
    9958 18
    ...
    1388 18
    36 9
    22 9
    ...
    8637 9
    102 rows selected.