1 Oracle TextのSQL文と演算子
この章では、Oracle Text索引の作成と管理およびOracle Text問合せの実行に使用する、SQL文とOracle Text演算子について説明します。
この章で説明する文は、次のとおりです。
1.1 ALTER INDEX
既存のOracle Text索引やJSON検索索引を変更または再構築するには、ALTER
INDEX
を使用します。
ALTER INDEXの用途
CONTEXT
、CTXCAT
またはCTXRULE
索引の変更またはメンテナンス作業を実行します。
ノート:
-
ALTER INDEX
の実行中にDMLまたは問合せのワークロードを実行すると、ORA-00060またはその他のエラーが発生し、索引がUNUSABLE
とマークされることがあります。これは、ALTER INDEX
がDDL操作のように動作し、デフォルトではオンラインで実行されないためです。このエラーを解決するには、ALTER INDEX
文でONLINE
パラメータを設定します。 -
FAST_DML
およびFAST_QUERY
オプションは、オンライン操作ではサポートされていません。
すべての索引タイプ
ALTER
INDEX
を使用すると、Oracle Textのすべての索引タイプで次のタスクを実行できます。
-
索引または索引パーティションの名前変更。「ALTER INDEX RENAME構文」を参照してください。
-
異なるプリファレンスを使用した索引の再構築。一部の制限事項が
CTXCAT
索引タイプに適用されます。「ALTER INDEX REBUILD構文」を参照してください。 -
索引のストップワードの追加。「ALTER INDEX REBUILD構文」を参照してください。
-
sub_lexerを追加または削除し、特定のシンボル(言語または言語に依存しないシンボル)に対してストップワードを削除または設定します。「ALTER INDEX Sub_Lexer構文」を参照してください
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構文」:
DATAGUIDE
やSEARCH_ON
などのJSON検索索引プリファレンスの変更に使用します。
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
セクションを追加できるのは、BASIC
、HTML
、XML
、NEWS
の各セクション・グループのみです。グローバルとローカルの両方の索引をサポートします。索引に同期化された新しいドキュメントは、この新しいプリファレンスを反映します。構文は次のとおりです。ALTER INDEX
index_name
PARAMETERS (ADD SDATA SECTIONsdata_section_name
TAGsdata_section_tag
DATATYPEsdata_section_datatype
);データ型は、
VARCHAR2
、CHAR
、NUMBER
、DATE
または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
操作で指定できるのは、各索引パーティションに対するMEMORY
、STORAGE
および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
を指定しない場合、既存のプリファレンス設定で索引が再構築されます。paramstring
の構文は、次のとおりです。paramstring =
'REPLACE [DATASTORE datastore_pref] [FILTER filter_pref] [LEXER lexer_pref] [WORDLIST wordlist_pref] [STORAGE storage_pref] [STOPLIST stoplist] [SECTION GROUP section_group] [MEMORY memsize [[POPULATE | NOPOPULATE] [INDEX SET index_set] [METADATA preference new_preference] [METADATA FORMAT COLUMN format_column_name] [[METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)] [[METADATA] TRANSACTIONAL|NONTRANSACTIONAL [[METADATA] [ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE]] [[METADATA] OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")] |[DATAGUIDE [ON | OFF | ON CHANGE [ADD_VC|Function_name]] |[SEARCH_ON TEXT_VALUE] | 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
は、索引の特定のパーティションに対して指定でき、索引全体に対しては指定できません。REPLACE
パラメータを使用してパーティション索引を再構築している場合は、STORAGE
、MEMORY
および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
関連項目:
-
システム定義のプリファレンスの詳細、およびプリファレンスの作成と設定の詳細は、「Oracle Text索引付けの要素」を参照してください。
-
CONTEXT索引のSEPARATE_OFFSETSオプションを使用して応答時間を改善する方法の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください
-
- REPLACE METADATA preference new_preference
-
SYNC
パラメータを含む、索引の既存のpreference
クラス設定を、new_preference
の設定に置換します。索引プリファレンスおよび属性のみが置換されます。索引は再構築されません。この文は、索引の構築後に、すべてのデータを再索引付けせずにプリファレンスとその属性設定を置き換える場合に便利です。データの再索引付けは、大幅な時間とコンピューティング・リソースを必要とするためです。
この文は、
SYNC
のタイプ(AUTOMATIC、MANUALまたはON-COMMIT)を変更する場合にも便利です。ALTER INDEX REBUILD PARAMETER ('REPLACE METADATA')
文は、索引のグローバル・レベルのローカル・パーティション索引には機能しません。たとえば、索引を再構築せずにフィルタまたはレクサー型などのグローバル・プリファレンスを変更する場合は、この構文を使用できません。かわりにALTER INDEX PARAMETERS
を使用し、すべてのパーティションを含む、グローバル・レベルで索引のメタデータを変更します。「ALTER INDEX PARAMETERS構文」を参照してください。METADATAキーワードを使用する必要がある場合
REPLACE METADATA
は、索引メタデータを変更しても、索引の一貫性が失われない場合のみ使用する必要があります。一貫性のない索引では、問合せ結果が不適切になる可能性があります。たとえば、次の場合にこの文を使用します。
-
マルチ言語データを想定して、単一言語レクサーからマルチレクサーに移行する場合。例については、「索引メタデータの置換: 単一レクサーからマルチレクサーへの変更」を参照してください。
-
BASIC_WORDLISTの
WILDCARD_MAXTERMS
設定を変更する場合。 -
SYNC
のパラメータ・タイプ(AUTOMATIC、MANUALまたはON-COMMIT)を変更する場合。
これらの変更は安全で、索引の一貫性が失われることはありません。一貫性のない索引は、問合せ結果に悪影響を及ぼすことがあります。
警告:
REPLACE
METADATA
文を使用すると、索引データの一貫性が失われることがあります。これにより、問合せ結果が不適切になる可能性があります。したがって、索引データおよびその後の問合せの一貫性に与える影響を慎重に検討した場合を除いて、この文を使用することはお薦めできません。メタデータの変更により、索引データの一貫性が失われる場合には、様々な例があります。たとえば、次の処理を行った後に
METADATA
キーワードを使用しないことをお薦めします。-
USER_DATASTORE プロシージャを、出力が異なる新規のPL/SQLストアド・プロシージャに変更した場合。
-
既存のドキュメントに対してプリフィックスが生成されていないため、BASIC_WORDLIST属性
PREFIX_INDEX
をNO
からYES
に変更した場合。YES
からNO
への変更は安全です。 -
printjoinおよびskipjoin文字を使用した新規の問合せが、索引付け時にこれらの文字がレクサー処理されたのと異なる方法でレクサー処理されたため、
BASIC_LEXER
printjoinおよびskipjoin文字を追加または変更した場合。 -
FORWARD_INDEX
でREPLACE
METADATA
は使用しないでください。かわりにREPLACE
STORAGE
を使用してください。
このように危険な場合は、索引を再構築することをお薦めします。
-
- REPLACE [METADATA] SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)
-
元表に対するDML変更が発生したときに
CONTEXT
索引を同期させるには、SYNC
を指定します。表1-1に示すSYNC
メソッドのいずれかを指定できます。表1-1 ALTER INDEXのSYNCメソッド
SYNCタイプ 説明 MANUAL
自動同期化は行われません。これはデフォルトです。
CTX_DDL.SYNC_INDEX
を使用して、索引を手動で同期化する必要があります。ON
COMMIT
およびEVERY
同期化を無効にするには、MANUAL
を使用します。EVERY
interval-stringスケジューラ・ジョブの場合と同じ構文をとるinterval-stringの値で指定された一定の間隔で、索引を自動的に同期化します。
EVERY
を使用した自動同期化の場合、索引作成者にCREATE
JOB
権限が必要です。interval-stringが、前の同期化ジョブを完了できる十分な長さの期間に設定されていることを確認してください。そうしないと、同期化ジョブが応答を停止する可能性があります。interval-string引数は、二重引用符('' '')で囲む必要があります。
自動同期化構文の例は、「自動索引同期化の有効化」を参照してください。
ON
COMMIT
コミットの直後に索引を同期化します。コミットは、同期化が完了するまで戻りません。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
構文の例は、「自動索引同期化の有効化」を参照してください。CONTEXT索引のSTAGE_ITABオプションの詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。
ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(
ON COMMIT
、EVERY
または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は古いドキュメントのコンテンツを使用してユーザーの問い合わせに答えます。
TEXT索引の非同期更新を有効にするには、次のようにします。
ALTER INDEX idx PARAMETERS ('REPLACE METADATA asynchronous_update');
TEXT索引の非同期更新を無効にするには、次のようにします。
ALTER INDEX idx PARAMETERS ('REPLACE METADATA synchronous_update');
ノート:
同期更新は、
TRANSACTIONAL
オプションでサポートされていません。更新は動作を遅くします。 - REPLACE [[METADATA] OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]
-
自動バックグラウンド索引最適化を有効にするには、
OPTIMIZE
を指定します。次のいずれかのOPTIMIZE
メソッドを指定できます。表1-2 ALTER INDEX OPTIMIZEのタイプ
OPTIMIZEタイプ 説明 MANUAL
自動最適化は提供されません。
CTX_DDL.OPTIMIZE_INDEX
を使用して、手動で索引を最適化する必要があります。AUTO_DAILY
CREATE INDEXのパラメータ・リストにOPTIMIZE (AUTO_DAILY)
を指定すると、繰り返し実行されるトークン最適化ジョブと繰り返し実行されるフル最適化ジョブがスケジュールされます。-
トークン最適化ジョブは、最も断片化されている上位10個のトークン(自動的に決定される)を最適化するために、土曜日の夜以外の毎日深夜午前12時から午前3時に実行するようにスケジュールされます。午前3時より前に開始されていないジョブはスキップされます。このようなスキップされたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。
- フル最適化ジョブは、索引表を最適化して$Nをクリーン・アップするために、毎週土曜日の深夜午前12時から実行するようにスケジュールされます。
デフォルトでは、既存の索引に
OPTIMIZE (AUTO_DAILY)
は設定されません。自動バックグランド索引最適化を有効にするには、ALTER INDEX
を使用する必要があります。EVERY "interval-string"
最も断片化されている上位10個のトークンのトークン最適化を定期的な間隔で自動実行します。この間隔は、スケジューラ・ジョブと同じ構文のinterval-stringの値で指定します。
interval-stringが、前の最適化ジョブを完了できる十分な長さの期間に設定されていることを確認してください。interval-string値は二重引用符で囲む必要があり、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を使用すると、パラレル索引付けに対する並列度をオプションで指定できます。このパラメータがサポートされるのは、
SYNC
、REPLACE
およびRESUME
をparamstring
に使用した場合のみです。実際の並列度は、リソースによっては多少低くなります。パラレル索引付けによって、索引付けするデータが大量にある場合およびオペレーティング・システムが複数のCPUをサポートしている場合は、索引付けを高速化できます。
JSON検索索引のALTER INDEX構文
ALTER INDEX [schema.]index REBUILD
PARAMETERS(
[DATAGUIDE ON [CHANGE (ADD_VC | function_name)] | OFF]
[SEARCH_ON (NONE | TEXT | TEXT_VALUE)]
);
ノート:
JSON検索索引プリファレンスを変更するためのALTER INDEX REBUILD PARAMETERS
文では、REPLACE
キーワードは必要ありません。また、単一のALTER INDEX
文でJSONとOracle Textの両方の検索索引プリファレンスを変更することはできません。
JSON検索索引プリファレンス(DATAGUIDE
やSEARCH_ON
など)を指定すると、PARAMETERS
句の他のプリファレンスは更新されません。同様に、Oracle Text検索索引プリファレンス(STORAGE
やLEXER
など)を指定した場合、JSONプリファレンスは更新されません。
- [schema.]index
-
JSON検索索引名を変更します。
- DATAGUIDE ON | OFF
-
既存のJSON検索索引のデータ・ガイドのサポートを変更します。JSONデータ・ガイドのサポートを有効にすると、変更トリガー・プロシージャも定義できます。
ノート:
DATAGUIDE
句は、JSON検索索引にのみ使用します。次のオプションのいずれかを指定します。
-
ON
: データ・ガイドのサポートを有効にします。また、独自のPL/SQLプロシージャを定義することも、事前定義された変更トリガー・プロシージャadd_vc
を使用することもできます。 -
OFF
: データ・ガイドのサポートと変更トリガー・プロシージャの両方を無効にします。一般的な検索インデックス機能のみを提供します。ノート:
SEARCH_ON
句の値がNONE
に設定されている場合、DATAGUIDE
句はオフにできません。
『Oracle Database JSON開発者ガイド』のデータ・ガイド対応検索索引の変更トリガーに関する項を参照してください。
-
- SEARCH_ON (TEXT | TEXT_VALUE)
-
JSON検索索引に指定された検索プリファレンスを変更します。検索オプションを有効にすると、更新されたプリファレンスで索引が再構築されます。
ノート:
SEARCH_ON
句は、JSON検索索引にのみ使用します。次のオプションのいずれかを指定します。-
TEXT
: 全文検索問合せで、検索索引を使用することを示します。 -
TEXT_VALUE
: 数値および日時の値に対して、全文索引と範囲ベースの索引の両方が作成されることを示します。
TEXT_VALUE
を指定すると、索引付け時間および索引領域に関する負荷が大きくなります。 -
ALTER INDEX Sub_Lexer構文
次の構文を使用します。
関連項目:
ALTER INDEXの索引タイプと構文は、「ALTER INDEXの用途」を参照してください
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] 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にユーザーが定義するシンボルです。
- REMOVE STOPWORD
-
次の条件が適用されます。
-
LANGUAGE句を指定しない場合、索引はbasic_stoplistを使用していると想定されます。索引がbasic_stoplistを使用していない場合は、エラーが発生します。
-
索引が(multi_stoplistではなく)basic_stoplistを使用している場合でも、成功するのは元表が空の場合のみです。
-
索引がmulti_stoplistを使用しており、ユーザーLANGUAGE句にALLを指定した場合、成功するのは元表が空の場合のみです。
-
索引がmulti_stoplistを使用しており、ユーザーLANGUAGE句にシンボルを指定した場合は、削除しようとしているsub_lexerのシンボルに言語列が設定されているドキュメントがない場合にのみ成功します。
関連項目:
-
- 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の特性を持ちません。大/小文字の情報や、ドキュメントに確認されるトークンなどです。これらの特性を維持するには、ドキュメントを再索引付けする必要があります。
-
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ón rápido', 'e'); commit; exec ctx_ddl.sync_index('simple_idx'); REM now query the Spanish data with base lettering: select * from simple where contains(text, 'rapido')>0;
索引の最適化
索引を最適化するには、CTX_DDL.OPTIMIZE_INDEXを使用してください。
索引の同期化
索引を同期化するには、CTX_DDL.SYNC_INDEXを使用してください。
タグ<author>
で識別されるゾーン・セクションauthor
を索引に追加するには、次の文を入力します。
ALTER INDEX myindex REBUILD PARAMETERS('add zone section author tag author');
タグ<fluff>
で識別される停止セクションを、AUTO_SECTION_GROUP
を使用する索引に追加するには、次の文を入力します。
ALTER INDEX myindex REBUILD PARAMETERS('add stop section fluff');
次のテキストがXMLドキュメントで使用されているとします。
<book title="Tale of Two Cities">It was the best of times.</book>
タイトル属性ごとに別のセクションを作成し、その新しい属性セクションにbooktitle
という名前を付けるとします。そのためには、次の文を入力します。
ALTER INDEX myindex REBUILD PARAMETERS('add attr section booktitle tag title@book');
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パラメータで「問合せテンプレート」を使用します。
パフォーマンス
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
の検索を定義します。
-
問合せテンプレート(
CONTEXT
文法を使用する場合)
CATSEARCH問合せ演算子
CATSEARCH
演算子では、次の問合せ操作のみがサポートされます。
-
論理積(
AND
) -
論理
OR
(|) -
論理
NOT
(-) -
" "(引用符で囲んだ句)
-
ワイルド・カード
表1-4に、これらの演算子の構文を示します。
表1-4 CATSEARCH問合せ演算子
操作 | 構文 | 操作の説明 |
---|---|---|
論理積( |
a b c |
a、bおよびcを含む行を戻します。 |
論理 |
a | b | c |
a、bまたはcを含む行を戻します。 |
論理 |
a - b |
aを含み、bを含まない行を戻します。 |
空白なしのハイフン |
a-b |
通常の文字として処理されるハイフンです。 たとえば、ハイフンがskipjoinとして定義されている場合、web-siteなどのワードは、単一の問合せ語句websiteとして処理されます。 同様に、ハイフンがprintjoinとして定義されている場合、web-siteなどのワードは、 |
" " |
"a b c" |
句"a b c"を含む行を戻します。 たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。 |
( ) |
(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
パラメータにカッコ'()'は使用できません。
例
-
表を作成します。
次の文では、索引付けする表を作成します。
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');
-
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');
-
表を問い合せます。
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
次の問合せでは、語句Sony、DVDおよび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
パラメータに問合せテンプレートを使用します。
関連項目:
構文
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を含むドキュメント、catがdogの近くにあるドキュメント、およびcatとdogを含むドキュメントを戻します。
これは、次のテンプレートを使用して実行されます。
<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-5 TRANSFORMのパラメータ
パラメータ | 説明 |
---|---|
|
元の問合せから生成される語句のタイプを指定します。 |
|
すべての語句の先頭に付加するリテラル文字列を指定します。 |
|
すべての語句の末尾に付加するリテラル文字列を指定します。 |
|
プリフィックスおよびサフィックスを適用した後、すべての語句に接続するリテラル文字列を指定します。 |
ノート:
TRANSFORM
ルールを使用したクエリー・リライト・テンプレートで指定されるテキスト問合せの入力文字列にOracle Text問合せ演算子(AND
、OR
、SOUNDEX
など)が含まれる場合、エラーが発生します。また、テキスト問合せの入力文字列に特殊文字(%
や$
など)を使用する場合、エスケープ文字の後に指定する必要があります。そうしないと、エラーが発生します。
問合せ結果セット記述子テンプレート
結果セット記述子を取得する場合に、このテンプレートを使用します。問合せテンプレートに、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-6に、テンプレート属性の有効な値を示します。
表1-6 テンプレート属性の値
タグ属性 | 説明 | 有効な値 | 意味 |
---|---|---|---|
grammar= |
問合せの文法を指定します。 |
|
問合せの文法。 |
datatype= |
スコアとして戻す数値の型を指定します。 |
|
0から100の整数としてスコアを戻します。 0から100の高精度浮動小数点数としてスコアを戻します。 |
algorithm= |
使用するスコアリング・アルゴリズムを指定します。 |
|
デフォルトを戻します。 ドキュメント内の出現回数としてスコアを戻します。 |
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問合せ演算子」を参照してください。
戻り値
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 pen、blue NEAR pen、blue AND pen、blue 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;
関連項目
『Oracle Textアプリケーション開発者ガイド』のCONTEXT文法に関する項
1.5 CREATE INDEX
CREATE INDEX
文を使用して、Oracle Text索引を作成します。
この項では、Oracle Textドメイン索引およびコンポジット・ドメイン索引の作成に関連する部分でのCREATE
INDEX
文について説明します。CREATE
INDEX
文の詳細は、Oracle Database SQL言語リファレンスを参照してください。
用途
Oracle Textの索引を作成するにはOracle Textの索引は、CONTEXT
、CTXCAT
または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;
CONTAINS
、CATSEARCH
またはMATCHES
問合せを入力するには、適切なOracle Textの索引を作成する必要があります。
次の型のOracle Textの索引を作成できます。
CONTEXT
索引は、Oracle Text索引の基本タイプです。1つのテキスト列に対する索引です。CONTEXT
索引は、ソース・テキストが、大規模な多数の一貫性のあるドキュメントで構成される場合に有効です。この索引は、SELECT
文のWHERE
句でCONTAINS
演算子を使用して問い合せます。この索引は、DML操作後に手動で同期化する必要があります。「CONTEXT索引タイプの構文」を参照してください。
CTXCAT
CTXCAT
索引は、1つのテキスト列と1つ以上の他の列に対する結合された索引です。CTXCAT
タイプは通常、カタログ内の品目名、名前、価格、説明など、小規模なドキュメントまたはテキストの断片を索引付けするために使用されます。SELECT
文のWHERE
句でCATSEARCH
演算子を使用して、この索引を問い合せます。この型の索引は、複合問合せのために最適化されます。この索引はトランザクション型です。元表に対するDML操作によって、索引自体が自動的に更新されます。CTXCAT
索引は、一般にCONTEXT
に比べて大きく、作成および更新に時間がかかり、使用できる索引付けオプションが限られています。「CTXCAT索引タイプ」を参照してください。
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
によってドキュメントを識別します。ノート:
サポートされる主キーの型は、
NUMBER
、VARCHAR2
、DATE
、CHAR
、VARCHAR
およびRAW
です。指定する列は、
CHAR
、VARCHAR
、VARCHAR2
、BLOB
、CLOB
(4294967295バイトに制限)、BFILE
、XMLType
またはURIType
のうちいずれかの型であることが必要です。ノート:
Oracle Database 12c リリース2 (12.2)では、Oracle Text索引は、宣言された照合
BINARY
、USING_NLS_COMP
、USING_NLS_SORT
またはUSING_NLS_SORT_CS
を使用する列に対してのみ作成できます。Oracle Textの動作は、すべてのサポートされる照合で同様です。パーティション表を指定できます。
LOCAL
句を指定しない場合は、グローバルの非パーティション索引が作成されます。DATE
列、NUMBER
列およびNESTED TABLE列は、索引付けできません。また、Object列にも索引付けできませんが、属性が基本データ型であれば、Object列の属性に索引付けできます。仮想プライベート・データベース(VPD)保護表で索引を作成しようとすると、次のいずれかの基準に該当しないかぎり失敗します。
-
VPDポリシーが作成され、
INDEX
文タイプに適用されない場合 -
ポリシー関数が現在のユーザーに対して
NULL
条件を戻す場合 -
ユーザー(索引所有者)が
SYS
の場合 -
ユーザーに
EXEMPT
ACCESS
POLICY
権限がある場合
ノート:
VPDポリシーを作成する場合、または元表のコンテキスト索引を作成した後にDBMS_REDACT
を使用した場合、$I
などのDR$
索引表には、リダクションされた列の索引付けされた情報が含まれます。CONTAINS
問合せでは、同様に結果も返されます。機密データの索引付けを防ぐには、コンテキスト索引を作成する前にセキュリティ・リダクションとVPDポリシーを作成するか、セキュリティ・ポリシーが追加されるたびにコンテキスト索引を再構築します。
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
の場合))とともにプッシュ・ダウンしようとします。これらの列に使用できる型は、
CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
のみです。また、最大長が249バイト以内に指定されている場合のみ、CHAR
型、VARCHAR2
型およびRAW
型がサポートされます。CHAR
列またはVARCHAR2
列の最大長を文字数で指定する場合(たとえば、VARCHAR2
(50CHAR
))、それをFLOOR
(249/max_char_width
)より長くすることはできません。ここでのmax_char_width
は、データベース文字セット内の文字の最大幅です。たとえば、データベース文字セットがAL32UTF8の場合は、指定する最大列長を62文字より長くはできません。サポートされている型(CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
)のADT
属性も使用できます。これ以外のデータ型の場合はエラーが発生します。たとえば、式func(cola)
および仮想列は使用できません。FILTER
BY
列リストでtxt_column
を使用できます。FILTER
BY
列のDML操作は常にトランザクション型です。
- ORDER BY oby_column
-
構造化
ORDER
BY
複合問合せの基準となる構造化された索引列です。構造化されたoby_columnのリストを、CONTAINS()
問合せのORDER
BY
句に指定できます。これらの列に使用できる型は、
CHAR
、NUMBER
、DATE
、VARCHAR2
またはRAW
のみです。249
バイトより長いVARCHAR2
およびRAW
列は、最初の249
バイトに切り捨てられます。たとえば、式func(cola)
および仮想列は使用できません。指定した列の順序が重要です。コストベース・オプティマイザ(CBO)は、テキスト問合せの
ORDER
BY
句に次の項目のいずれかが含まれている場合にのみ、コンポジット・ドメイン索引にsortをプッシュしようとします。-
CREATE INDEX文のORDER BY句によって宣言されるORDER BY列を並べ替えた全体
-
CREATE INDEX文のORDER BY句によって宣言されるORDER BY列を並べ替えた接頭辞のみ
-
CREATEINDEX文の実行時にORDERBY句によって宣言され順序付けされたORDERBY列のプリフィックスが後に続くscore
-
CREATE INDEX文のORDER BY句によって宣言されるORDER BY列を並べ替えた接頭辞に続くスコア
次の例では、
ORDER
のBY
列に関して、コストベース・オプティマイザ(CBO)の動作を示しています。CREATE INDEX foox ON foo(D) INDEXTYPE IS CTXSYS.CONTEXT FILTER BY B, C ORDER BY A, B desc;
次の問合せについて考えてみます。
SELECT A, SCORE(1) FROM foo WHERE CONTAINS(D, 'oracle',1)>0 AND C>100 ORDER BY col_list;
ノート:
NLS_SORT
またはNLS_COMP
パラメータ(つまり、alter session set NLS_SORT = <some lang>;
)を設定している場合、CBOはsortまたは関連構造化述語をCDIにプッシュしません。この動作は、通常の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
句でも使用することはできません。この場合はエラーが発生します。 -
CHAR
、VARCHAR2
および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
句(あるいはその両方)を指定してコンポジット・ドメイン索引が作成されているテキスト表のエクスポートとインポートに関する制限事項は、次のとおりです。
-
通常の
exp
およびimp
では、コンポジット・ドメイン索引のエクスポートおよびインポートはサポートされません。実行を試行すると、「EXP-00113: 機能コンポジット・ドメイン索引はサポートされていません。」
というエラーが発生します。 -
コンポジット・ドメイン索引が作成されているテキスト表をエクスポートするには、データ・ポンプ・エクスポートおよびインポート・ユーティリティ(それぞれ
expdp
およびimpdp
コマンドで起動)、またはDBMS_DATAPUMP
PL/SQLパッケージを使用する必要があります。
関連項目:
コンポジット・ドメイン索引のFILTER
BY
列およびORDER
BY列でのALTER
INDEX
とALTER
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のメモリーを使用できるようにする必要があります。
関連項目:
-
『Oracle Textアプリケーション開発者ガイド』の「パフォーマンス・チューニング」
パフォーマンス
パラレル索引付けによって、索引付けするデータが大量にある場合およびオペレーティング・システムが複数の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] [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)] [TRANSACTIONAL] [OPTIMIZE (MANUAL | AUTO_DAILY | EVERY "interval-string")]'
CTX_DDL.CREATE_PREFERENCE でデータストア、フィルタ、レクサー、ワードリストおよび記憶域プリファレンスを作成します。作成後、それらをparamstringに指定します。
- ASYNCHRONOUS_UPDATE | SYNCHRONOUS_UPDATE
-
Oracle Textで、索引付られた列を更新したドキュメント内に古い索引のエントリを保持するかどうか指定します。デフォルトは
SYNCHRONOUS_UPDATE
です。索引の更新は同期され、索引の同期が終了するまで古い索引のエントリは検索操作で使用不可能です。ASYNCHRONOUS_UPDATE
は、索引が同期化されるまで、問合せは古い索引エントリを使用して古いドキュメントの内容を戻します。索引の同期化後、再構築された索引を使用して更新されたドキュメントの内容が戻されます。このオプションは、パーティション・レベルで設定できません。
次の例では、非同期更新が使用可能な
CONTEXT
索引idx
を作成します。CREATE INDEX myidx ON mytab1(item_info) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('asynchronous_update');
ノート: 非同期更新は、動作が遅くなるためDML操作でサポートされません。
- DATASTORE datastore_pref
-
データストア・プリファレンスの名前を指定します。データストア・プリファレンスを使用して、テキストの格納場所を指定します。「データストア型」を参照してください。
- FILTER filter_pref
-
フィルタ・プリファレンスの名前を指定します。フィルタ・プリファレンスを使用して、書式化されたドキュメントのフィルタ処理方法をプレーン・テキストまたはHTMLに指定します。「フィルタ型」を参照してください。
- CHARSET COLUMN charset_column_name
-
文字セット列の名前を指定します。文字セット列は、テキスト列と同じ表内にある必要があり、
CHAR
、VARCHAR
またはVARCHAR2
型である必要があります。この列を使用して、データベースの文字セットに変換するドキュメントの文字セットを指定します。この値には大/小文字区別はありません。JA16EUCなどのグローバリゼーション・サポート文字セット文字列を指定する必要があります。ドキュメントがプレーン・テキストまたはHTMLである場合、
AUTO_FILTER
およびCHARSET
フィルタはこの列を使用して、索引付けのためにドキュメントの文字セットをデータベースの文字セットに変換します。プレーン・テキストまたはHTMLドキュメントが、異なる複数の文字セットを持つ、またはデータベースの文字セットとは異なる文字セットである場合は、この列を使用してください。
NLS_LENGTH_SEMANTICS
パラメータのCHAR
設定はデータベース・レベルではサポートされていません。このパラメータは、次の列に対してサポートされます。-
CHARSET
COLUMN
。たとえば:VARCHAR2 <size> CHAR CHAR <size> CHAR
-
VARCHAR2
およびCHAR
列で作成される索引 -
CREATE
INDEX
のFILTER
BY
句およびORDER
BY
句に対するVARCHAR2
およびCHAR
列 -
FORMAT
COLUMN
-
- FORMAT COLUMN format_column_name
-
フォーマット列の名前を指定します。フォーマット列は、テキスト列と同じ表内にある必要があり、
CHAR
、VARCHAR
または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
列に指定できるオプションは、PLAINTEXT
、FILTERED
、NONE
の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_PARAMETERS
のDEFAULT_INDEX_MEMORY
に指定された値です。memsize
パラメータは、索引付けに使用するメモリー量を指定します。使用量が指定値を超えると、索引がディスクにフラッシュされます。大きいメモリー量を指定すると、I/Oが削減されるため索引付けのパフォーマンスが向上します。また、断片化も削減されるため問合せのパフォーマンスおよびメンテナンスが向上します。小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリーが不足している場合に有効なことがあります。
- POPULATE | NOPOPULATE
-
索引を空にするか移入するかを指定します。デフォルトは
POPULATE
です。ノート:
POPULATE
|NOPOPULATE
オプションのみ、デフォルト値をCTX_ADM.SET_PARAMETERで設定できません。空の索引は、元表を更新または元表に挿入することで移入されます。索引を追加的に作成したり、元表内のドキュメントを選択的に索引付けするときに、空の索引の作成が必要な場合があります。空の索引は、ドキュメント・セットからテーマおよび要点の出力のみを必要とする場合にも作成します。
- SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)
-
元表に対する挿入、更新または削除が発生したときに
CONTEXT
索引を同期させるには、SYNC
を指定します。次のSYNC
メソッドのいずれかを指定できます。表1-7 SYNCのタイプ
SYNCタイプ 説明 MANUAL
自動同期化は行われません。これはデフォルトです。
CTX_DDL.SYNC_INDEX
を使用して、索引を手動で同期化する必要があります。EVERY "interval-string"
スケジューラ・ジョブの場合と同じ構文をとるinterval-stringの値で指定された一定の間隔で、索引を自動的に同期化します。
EVERY
を使用した自動同期化の場合、索引作成者にCREATE JOB
権限が必要です。interval-stringが、前の同期化ジョブを完了するのに十分な長さの期間に設定されていることを確認してください。長さが十分でないと、同期化ジョブが応答しなくなる可能性があります。interval-stringは、二重引用符で囲む必要があります。interval-string内の一重引用符は、別の一重引用符をエスケープ文字で指定する必要があります。
自動同期化構文の例は、「自動索引同期化の有効化」を参照してください。
ON COMMIT
コミット・トランザクションの直後に索引を同期化します。コミット・トランザクションは、同期化が完了するまで戻りません。Oracle Databaseリリース18cより以前、同期は個別のトランザクションとして実行されていました。データがコミットされていても索引が変更されていない時間間隔(通常は短い間隔)がありました。Oracle Databaseリリース18cからは、同期が同じトランザクションの一部として実行されます。
この操作は、memoryパラメータで指定されたメモリーを使用します。
Oracle Databaseリリース18cより以前、同期操作には独自のトランザクション・コンテキストがありました。この操作が失敗しても、データ・トランザクションはコミットされていました。Oracle Databaseリリース18cからは、リカバリ不能な索引同期エラーが発生した場合に、データ・トランザクション全体がロールバックされます。リカバリ可能な(個別の行の)同期エラーは
CTX_USER_INDEX_ERRORS
ビューに記録されますが、トランザクションは完了します。「索引エラーの表示」を参照してください。ON COMMIT
構文の例は、「自動索引同期化の有効化」を参照してください。ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(
ON COMMIT
、EVERY
またはMANUAL
)が設定されます。プライマリ・パラメータ文字列に指定されたSYNCのタイプは、パーティションが独自のタイプを指定した場合を除いて、すべての索引パーティションに適用されます。自動(
EVERY
)同期化の場合、ユーザーは、メモリー・サイズおよびパラレル同期化を指定できます。構文は次のとおりです。... EVERY interval_string MEMORY mem_size PARALLEL paradegree ...
ON
COMMIT
同期化は、シリアルでのみ実行され、索引作成時に指定されたサイズと同じメモリー・サイズを使用する必要があります。関連項目:
-
ジョブ・スケジューリングの詳細は、『Oracle Database管理者ガイド』を参照してください。
-
DBMS_SCHEDULER
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
-
- 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-8 CREATE INDEX OPTIMIZEのタイプ
OPTIMIZEタイプ 説明 MANUAL
自動最適化は提供されません。
CTX_DDL.OPTIMIZE_INDEX
を使用して、手動で索引を最適化する必要があります。AUTO_DAILY
CREATE INDEXのパラメータ・リストにOPTIMIZE (AUTO_DAILY)
を指定すると、繰り返し実行されるトークン最適化ジョブと繰り返し実行されるフル最適化ジョブがスケジュールされます。-
トークン最適化ジョブは、最も断片化されている上位10個のトークン(自動的に決定される)を最適化するために、土曜日の夜以外の毎日深夜午前12時から午前3時に実行するようにスケジュールされます。午前3時より前に開始されていないジョブはスキップされます。このようなスキップされたジョブは、翌日の午前12時に実行するようスケジュールされている他のジョブよりも前に開始されます。
- フル最適化ジョブは、索引表を最適化して$Nをクリーン・アップするために、毎週土曜日の深夜午前12時から実行するようにスケジュールされます。
デフォルトでは、既存の索引に
OPTIMIZE (AUTO_DAILY)
は設定されません。自動バックグランド索引最適化を有効にするには、ALTER INDEX
を使用する必要があります。EVERY "interval-string"
最も断片化されている上位10個のトークンのトークン最適化を定期的な間隔で自動実行します。この間隔は、スケジューラ・ジョブと同じ構文のinterval-stringの値で指定します。
interval-stringが、前の最適化ジョブを完了できる十分な長さの期間に設定されていることを確認してください。interval-string値は二重引用符で囲む必要があり、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;
関連項目:
-
このデフォルト設定の詳細は、「デフォルトの索引付けパラメータ」を参照してください
次の例では、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);
ノート:
Oracle Textのパーティション数の制限は、Oracle Databaseの表ごとの最大パーティション数と同じです。
次の例では、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-9に記載されたサポートされている索引プリファレンスです。
表1-9 サポートされているCTXCAT索引プリファレンス
プリファレンス・クラス | サポートされている型 |
---|---|
データストア |
このプリファレンス・クラスは、 |
フィルタ |
このプリファレンス・クラスは、 |
レクサー |
BASIC_LEXER( |
ワードリスト |
|
記憶域 |
|
ストップリスト |
1つの言語のストップリストのみがサポートされます( |
セクション・グループ |
フィールド・セクションのみが |
サポートされないプリファレンスとパラメータ
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_LEXER
、CHINESE_LEXER
、JAPANESE_LEXER
、KOREAN_MORPH_LEXER
レクサーを使用できます。(「分類型」および「レクサー型」を参照してください。)問合せ処理の場合、このレクサーがサポートしている演算子は、
ABOUT
、STEM
、AND
、NEAR
、NOT
、OR
およびWITHIN
です。シソーラスを使用した演算子(
BT*
、NT*
、PT
、RT
、SYN
、TR
、TRSYS
、TT
など)がサポートされています。ただし、これらの演算子は、MATCHES
関数の入力時ではなく、索引付け時にシソーラスのスナップショットを使用して拡張されます。したがって、索引付けの後にシソーラスを変更する場合は、問合せセットの再索引付けが必要になります。 - storage_pref
-
問合せに対して索引の記憶域プリファレンスを指定します。記憶域プリファレンスを使用して、索引表の格納方法を指定します。「記憶域型」を参照してください。
- section_group
-
セクション・グループを指定します。このパラメータは問合せには影響を与えません。分類するドキュメントのセクションに適用されます。
CTXRULE
索引タイプに対して、次のセクション・グループがサポートされています。
-
BASIC_SECTION_GROUP
-
HTML_SECTION_GROUP
-
XML_SECTION_GROUP
-
AUTO_SECTION_GROUP
「セクション・グループ型」を参照してください。
CTXRULE
では、特殊セクションはサポートされません。また、NDATA
セクションもサポートされません。
CTXRULE索引の作成例
ドキュメント・ルーティング・アプリケーションでのCTXRULE
索引タイプの使用方法の詳細は、『Oracle Textアプリケーション開発者ガイド』を参照してください。
1.6 CREATE SEARCH INDEX
CREATE SEARCH INDEX
文を使用して、JSON検索索引を作成します。
用途
ノート:
検索索引ではシャドウ索引はサポートされていません。
パーティション化された検索索引ではシステム管理のパーティション化が使用されるため、索引パーティションの指定はサポートされていません。
IS JSON
チェック制約があるVARCHAR2
、CLOB
またはBLOB
データ型の列に対してJSON検索索引を作成できます。JSONデータを索引付けするには、CREATE SEARCH INDEX
文でFOR JSON
句を指定する必要があります。
ノート:
JSON検索索引は、IS JSON
チェック制約がある列に対してのみ作成できます。
例
create table t1 (txn_date date, po CLOB, constraint c1 check (po is json));
create search index idx on t1(po) for JSON parameters(‘DATAGUIDE ON sync (on commit)’);
構文
より簡易な代替構文を使用してJSONに検索索引を作成できます。
CREATE SEARCH INDEX [schema.]index ON [schema.]table(json_column) FOR JSON
[LOCAL]
PARAMETERS(
[DATAGUIDE ON [CHANGE (ADD_VC | function_name)] | OFF]
[STORAGE storage_pref]
[SEARCH_ON (NONE | TEXT | TEXT_VALUE)]
[MEMORY memsize]
[SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)]
[OPTIMIZE (MANUAL | EVERY "interval-string" | AUTO_DAILY)]
)
[PARALLEL N]
[UNUSABLE];
PARAMETERS
句を省略すると、DATAGUIDE
、SEARCH_ON
およびSYNC
のデフォルト値は、それぞれON
、TEXT_VALUE
およびON COMMIT
です。
- [schema.]index
-
作成するJSON検索索引の名前を指定します。
- [schema.]table(json_col)
-
索引付けする表およびJSON列の名前を指定します。
json_col
は、索引が作成されるJSON列の名前です。この列には、
IS JSON
チェック制約が含まれる必要があります。 - LOCAL
-
パーティション表にローカル・パーティションJSON検索索引を作成します。索引は、元表のパーティション化スキームを使用してパーティション化されます。
レンジ、リスト、ハッシュ、時間隔、レンジ・コンポジット(レンジ、リストおよびハッシュ)、リスト・コンポジット(レンジ、リストおよびハッシュ)およびハッシュ・コンポジット(レンジ、リストおよびハッシュ)のパーティション化スキームを使用して、表をパーティション化できます。参照パーティション表の元表が、サポートされているスキームのいずれかを使用してパーティション化されている場合、参照パーティション化を使用してローカルJSON検索索引を作成できます。
ノート:
時間隔コンポジット・パーティション表にローカルJSON検索索引は作成できません。次の例は、3つにパーティション化された表を作成し、それを移入して、パーティション化されたJSON検索索引を作成する方法を示しています。
PROMPT create partitioned table and populate it CREATE TABLE part_tab (a int, b CLOB check (b IS 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;
関連項目:
- 「ローカル・パーティション索引の作成」
- 『Oracle Databaseデータ・カートリッジ開発者ガイド』のシステム管理のドメイン索引 - サポートされているスキームに関する項
- DATAGUIDE ON | OFF
-
既存のJSON検索索引のデータ・ガイドのサポートを指定します。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 | TEXT | TEXT_VALUE)
-
JSON検索索引の検索プリファレンスを指定します。検索オプションを有効にすると、更新されたプリファレンスで索引が再構築されます。
次のオプションのいずれかを指定します。-
NONE
: 全文検索および範囲検索に使用される表が移入されないことを示します。索引のデータ・ガイドのみが保持されます。この索引は、JSON_TEXTCONTAINS
など、JSON問合せ演算子では使用されません。 -
TEXT
: 全文検索問合せで、検索索引を使用することを示します。 -
TEXT_VALUE
: 数値および日時の値に対して、全文索引と範囲ベースの索引の両方が作成されることを示します。
TEXT_VALUE
を指定すると、索引付け時間および索引領域に関する負荷が大きくなります。 -
- 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_PARAMETERS
のDEFAULT_INDEX_MEMORY
に指定された値です。memsize
パラメータは、索引付けに使用するメモリー量を指定します。使用量が指定値を超えると、索引がディスクにフラッシュされます。大きいメモリー量を指定すると、I/Oが削減されるため索引付けのパフォーマンスが向上します。また、断片化も削減されるため問合せのパフォーマンスおよびメンテナンスが向上します。小さいメモリー量を指定すると、ディスクI/Oおよび索引の断片化が増加しますが、ランタイム・メモリーが不足している場合に有効なことがあります。
- SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)
-
元表に対する挿入、更新または削除がある場合は、
CONTEXT
索引の自動同期化を行うためにSYNC
を指定します。表1-7で説明するように、SYNC
メソッドのいずれかを指定できます。ローカル・パーティション索引の各パーティションには、SYNCの独自のタイプ(
ON COMMIT
、EVERY
または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
を指定します。表1-8の説明に従って、OPTIMIZE
メソッドを指定できます。AUTO_DAILY | EVERY "interval-string"
の設定では、パラレル最適化を指定できます。構文は次のとおりです。... [AUTO_DAILY | EVERY "interval-string"] PARALLEL paradegree ...
1.7 DROP INDEX
ノート:
この項では、テキスト・ドメイン索引の削除に関連するDROP
INDEX
文について説明します。
DROP
INDEX
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
用途
DROP
INDEX
を使用して、指定したテキスト索引を削除します。
構文
DROP INDEX [schema.]index [force];
例
次の例では、カレント・ユーザーのデータベース・スキーマ内にあるdoc_index
iという名前の索引を削除します。
DROP INDEX doc_index;
1.8 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
1.9 MATCH_SCORE
文でMATCH_SCORE
演算子を使用して、MATCHES
問合せによって生成されたスコアが戻されるようにします。
MATCH_SCORE
演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblink
を追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblink
は、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)
SVM_CLASSIFIER
分類型が使用されている場合、この演算子は0から100の範囲のスコアを戻します。一致スコアを使用して、カテゴリ固有のしきい値を特定のカテゴリに適用します。
SVM_CLASSIFIER
分類が使用されていない場合、この演算子は100(ドキュメントが基準と一致)または0(ドキュメントが不一致)のいずれかを戻します。
例
一致スコアを取得するには、次の構文を使用します。
select cat_id, match_score(1) from training_result where matches(profile, text,1)>0;
関連項目
1.10 SCORE
SELECT
文でSCORE
演算子を使用して、CONTAINS問合せによって生成されたスコア値が戻されるようにします。SCORE
演算子は、SELECT
、ORDER
BY
またはGROUP
BY
句で使用できます。
SCORE
演算子ではデータベース・リンクもサポートされます。名前の末尾に@dblink
を追加すると、リモート表またはマテリアライズド・ビューを識別できます。dblink
は、リモート表またはマテリアライズド・ビューが含まれているデータベースへのデータベース・リンクの完全名または部分名であることが必要です。(リモート・ビューの問合せはサポートされていません。)
例
1つのCONTAINS
SCORE
演算子を(SELECT
句などで)コールする場合は、次のように、CONTAINS
句がSCOREラベル値を参照するように指定します。
SELECT SCORE(1), title from newsindex WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC;
複数のCONTAINS
newsデータベースでは、ニュース記事のタイトルおよび本文が別々に格納および索引付けされるとします。次の問合せは、タイトルにOracleというワードおよび本文にjavaというワードを含むすべてのドキュメントを戻します。戻された記事は、最初のCONTAINS
(Oracle)に対するスコア順にソートされた後、次のCONTAINS
(java)のスコア順にソートされます。
SELECT title, body, SCORE(10), SCORE(20)
FROM news WHERE CONTAINS (news.title, 'Oracle', 10) > 0 OR
CONTAINS (news.body, 'java', 20) > 0 ORDER BY SCORE(10), SCORE(20);