3.1 Oracle Text索引について

ここでは、Oracle Textの索引のタイプ、索引の構造、索引付け処理および制限事項について説明します。

次の各トピックで、Oracle Textの索引の詳細を説明します。

3.1.1 Oracle Textの索引タイプ

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

表3-1 Oracle Textの索引タイプ

索引タイプ 説明 サポートされるプリファレンスとパラメータ 問合せ演算子 ノート

CONTEXT

テキストが、MS WordやHTML、プレーン・テキストといった形式の大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。

様々な方法で索引をカスタマイズできます。

この索引のタイプは、元表への挿入、更新および削除操作の後にCTX_DDL.SYNC_INDEXが必要となります。

INDEX SETを除くすべてのCREATE INDEXプリファレンスとパラメータがサポートされています。

サポートされているパラメータ: 索引パーティション句の形式列、文字セット列および言語列

CONTAINS

CONTEXT文法では豊富な操作がサポートされています。

CTXCAT文法は問合せテンプレートとともに使用します。

すべてのドキュメント・サービスと問合せサービスがサポートされています。

パーティション・テキスト表の索引付けがサポートされています。

CREATE INDEXFILTER BY句およびORDER BY句をサポートし、構造化列を索引付けすることで、複合問合せをより効率的に処理します。

SEARCH INDEX

テキストが、MS WordやHTML、プレーン・テキストといった形式の大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。

様々な方法で索引をカスタマイズできます。

この索引のタイプは、元表への挿入、更新および削除操作の後にCTX_DDL.SYNC_INDEXが必要となります。

INDEX SETを除くすべてのCREATE INDEXプリファレンスとパラメータがサポートされています。

サポートされているパラメータ: 索引パーティション句の形式列、文字セット列および言語列

CONTAINS

SEARCH INDEX構文では豊富な操作がサポートされています。

CONTEXTおよびCTXCAT構文は問合せテンプレートとともに使用します。

すべてのドキュメント・サービスと問合せサービスがサポートされています。

パーティション・テキスト表の索引付けがサポートされています。

索引記憶域表について、シャードされたデータベースおよびシステム管理パーティション化がサポートされています。

CTXCAT

この索引は、小さいドキュメントやテキスト断片の複合問合せのパフォーマンスを向上させるために使用します。複合問合せのパフォーマンス向上のためには、元表に、品目名や価格、説明といったその他の列を含めます。

この索引タイプはトランザクションです。挿入や更新、削除が元表に対して実行された後、自動的に更新されます。CTX_DDL.SYNC_INDEXは必要ありません。

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

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

INDEX SET

LEXER

STOPLIST

STORAGE

WORDLIST (日本語データについてのみprefix_index属性がサポートされています。)

未サポート: 形式列、文字セット列および言語列

表と索引のパーティション化。

CATSEARCH

CTXCAT文法は、論理操作、句問合せおよびワイルドカード操作をサポートしています。

CONTEXT文法は問合せテンプレートとともに使用します。

テーマ問合せがサポートされています。

この索引は大きいため、CONTEXT索引よりも作成に時間がかかります。

CTXCAT索引のサイズは、索引付け対象のテキストの合計量、索引セット内の索引数および索引付けされた列の数に関連します。索引セットに索引を追加する前に、使用する問合せとリソースを慎重に考慮してください。

CTXCAT索引は、索引のパーティション化、ドキュメント・サービス(ハイライト表示、マークアップ、テーマおよび要旨)または問合せサービス(実行計画、問合せフィードバックおよびワードのブラウズ)をサポートしていません。

CTXRULE

ドキュメント分類アプリケーションまたはルーティング・アプリケーションの作成には、この索引を使用します。この索引は、分類またはルーティングの条件が定義されている問合せの表に対して作成します。

CTXRULEパラメータおよび制限事項を参照してください。

MATCHES

MATCHES演算子は、単一ドキュメント(プレーン・テキスト、HTMLまたはXML)の分類に使用します。MATCHESはドキュメントを問合せのセットに変換し、索引内の一致する行を検索します。

単純な分類またはルールベースの分類を使用して、ドキュメント分類アプリケーションを作成するには、CTXRULEタイプの索引を作成します。この索引は、MATCHES演算子を使用してプレーン・テキスト、HTMLまたはXMLドキュメントを分類します。定義する問合せセットは、索引付け対象のテキスト表に格納します。

Oracle Textの索引は、Oracle Databaseのドメイン索引です。問合せアプリケーションを作成するには、テキスト列と構造化データ列の組合せを持つCONTEXTタイプの索引を作成し、CONTAINS演算子を使用してその索引を問い合せます。

索引は、移入済のテキスト表から作成します。問合せアプリケーションでは、表にテキストまたは格納済テキストの場所へのポインタが含まれている必要があります。テキストは通常ドキュメントの集まりですが、小さいテキスト断片の場合もあります。

ノート:

XMLデータを使用する新しいアプリケーションを作成する場合は、CTXRULEではなくXMLIndexを使用することをお薦めします。

Oracle Text索引は、標準SQLを使用して、Oracle Databaseの拡張索引の1タイプとして作成します。つまり、Oracle Textの索引は、Oracle Databaseの索引と同じように機能します。この索引には参照名があり、標準SQL文を使用して操作できます。

Oracle Textの索引を作成するメリットは、CONTAINSCATSEARCHおよびMATCHESなどの演算子を使用したテキスト問合せの応答時間が短縮されることです。これらの演算子は、それぞれCONTEXTCTXCATおよびCTXRULEの各索引タイプを問い合せます。

ノート:

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

関連項目:

3.1.2 Oracle TextのCONTEXT索引の構造

Oracle Textでは、すべてのワードをトークンに変換してテキストを索引付けします。Oracle TextのCONTEXT索引の一般的な構造は、逆向きの索引であり、各トークンにそのトークンを含むドキュメント(行)のリストが格納されています。

たとえば、初期の索引付け操作が1つ終了すると、ワードDOGのエントリは次のようになります。

ワード ドキュメント内の表示

DOG

DOC1 DOC3 DOC5

つまり、ワードDOGは、ドキュメント1、3および5を格納する行に含まれています。

マージ済のワードとテーマの索引付け

Oracle Textでは、英語およびフランス語の場合はデフォルトで、ワード情報とともにテーマ情報も索引付けします。テーマ情報は、ABOUT演算子を使用して問い合せることができます。テーマの索引付けを使用可能および使用禁止に設定することもできます。

関連項目:

テーマ情報の索引付けについてさらに学習するには、プリファレンスの作成を参照してください

3.1.3 Oracle Textの索引付け処理

この項では、Oracle Textの索引付け処理について説明します。CREATE INDEX文を使用して索引付け処理を開始し、パラメータとプリファレンスに基づいて、トークンに対してOracle Textの索引を作成します。

図3-1は、索引付け処理を示しています。データは、様々な索引付けオブジェクトによって操作されます。各オブジェクトは、CREATE INDEXまたはALTER INDEXのパラメータ文字列で指定した索引付けプリファレンス型またはセクション・グループにそれぞれ対応しています。

図3-1 Oracle Textの索引付け処理

図3-1の説明が続きます
「図3-1 Oracle Textの索引付け処理」の説明

Oracle Textは、次のオブジェクトとエンジンを使用してデータ・ストリームを処理します。

3.1.3.1 データストア・オブジェクト

ストリームはデータストアから始まり、データストアでは、指定したデータストア・プリファレンスに従って、システムに格納されているとおりにドキュメントが読み込まれます。

たとえば、データストアをDIRECTORY_DATASTOREとして定義した場合、ストリームはまずOracleディレクトリ・オブジェクトからファイルを読み取ります。ドキュメントは、インターネット上またはOracle Databaseに格納することもできます。ファイルが物理的にどこに存在していても、Oracle Databaseのテキスト表はそのファイルを指している必要があります。

3.1.3.2 フィルタ・オブジェクト

次に、ストリームはフィルタ内を通過します。FILTERプリファレンスにより処理方法が決定されます。次のいずれかの処理がストリームに対して行われます。

  • NULL_FILTERプリファレンス型を指定した場合、または形式列の値がIGNOREの場合、フィルタリングは行われません。プレーン・テキスト、HTMLまたはXMLのドキュメントには、フィルタ処理は不要です。

  • AUTO_FILTERプリファレンス型を指定した場合、または形式列の値がBINARYの場合、書式設定済ドキュメント(バイナリ)はマークアップ・テキストにフィルタ処理されます。

3.1.3.3 セクショナ・オブジェクト

フィルタ処理後、マークアップされたテキストはセクショナを通過し、ストリームはテキスト情報とセクション情報に分割されます。セクション情報には、テキスト・ストリーム内でセクションが開始する場所と終了する場所の情報が含まれています。抽出されるセクションのタイプは、セクション・グループのタイプによって決定されます。

テキストはレクサーに渡されます。セクション情報は、直接索引付けエンジンに渡され、後で使用されます。

3.1.3.4 レクサー・オブジェクト

Oracle Textのレクサー・タイプのいずれかを使用してレクサー・プリファレンスを作成し、索引付けをするテキストの言語を指定します。レクサーは、使用言語に基づいて、テキストをトークンに分解します。通常、分解されたトークンはワードです。レクサーは、トークンの抽出に、レクサー・プリファレンスに定義されたパラメータを使用します。これらのパラメータには、トークンを分割する文字(空白など)の定義が含まれています。パラメータには、テキストをすべて大文字に変換するか、大/小文字混在のままにしておくかも含まれます。

テーマの索引付けを有効にすると、レクサーはテキストを分析してテーマ・トークンを作成し、索引付けを行います。

3.1.3.5 索引付けエンジン

索引付けエンジンは、トークンを含んでいるドキュメントにそのトークンをマップする逆向きの索引を作成します。このフェーズでは、指定したストップリストを使用して索引からストップワードまたはストップテーマを除外します。Oracle Textでは、WORDLISTプリファレンスで定義されるパラメータも使用されます。これらのパラメータは、プリフィックス索引またはサブストリング索引を作成する方法を指定します(有効化されている場合)。

3.1.4 索引付き列の更新について

索引の同期をすぐに実行することなく、索引が同期されるまで、ドキュメントを検索操作可能な状態に保つことができます。

Oracle Database 12cリリース2 (12.2)より前のリリースでは、Oracle Text索引に基づく列に更新があった場合、インデックスが同期されるまでドキュメントの検索操作は実行できなくなります。ユーザーの問合せではこのドキュメントの検索を実行できません。Oracle Database 12cリリース2 (12.2)より、索引の同期をすぐに実行せずに、更新後にドキュメントを検索可能にする必要があることを指定できるようになりました。索引の同期前に、問合せで古い索引エントリを使用して古いドキュメントの内容をフェッチします。索引の同期化後、ユーザー問合せで更新済ドキュメントの内容をフェッチします。

索引のASYNCHRONOUS_UPDATEオプションを使用して、更新後にドキュメントの古い内容を維持し、この索引を使用してユーザーの問合せに回答できます。

ノート:

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

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

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

関連トピック

3.1.5 パーティション表とパーティション索引

パーティション・テキスト表にCONTEXTパーティション索引を作成する際には、範囲により表をパーティション化する必要があります。ハッシュ・パーティション、コンポジット・パーティションおよびリスト・パーティションは、サポートされていません。

日付でデータをパーティション化したパーティション・テキスト表を作成できます。たとえば、使用しているアプリケーションで日付付きのニュース記事の大規模なライブラリをメンテナンスしている場合は、月別または年度別に情報をパーティション化できます。パーティション化によって、問合せ、挿入、更新および削除、ならびにバックアップとリカバリの操作を単一のパーティションに対して行うことができるため、大規模データベースが管理しやすくなります。

複数の表セットを持つローカルのCONTEXT索引では、Oracle TextはOracle Databaseがサポートする数のパーティションをサポートします。

ノート:

Oracle Textでサポートされるパーティションの数は約1024K-1です。この制限は十分すぎるため、パーティション化された表のCONTEXT索引には適用できません。

関連項目:

パーティション化の詳細は、『Oracle Database概要』を参照してください。

パーティション表の問合せには、通常の表の問合せと同様に、SELECT文のWHERE句でCONTAINSを使用します。表全体または単一のパーティションを問い合せることができます。ただし、ORDER BY SCORE句を使用する場合は、問合せを単一のパーティションに制限する範囲述語を組み込まないかぎり、単一のパーティションを問い合せることをお薦めします。

3.1.6 オンライン索引

継続的に更新が発生し、索引付けのために元表をロックすることが実用的でない場合は、CREATE INDEX文のONLINEパラメータを使用して、オンラインで索引を作成できます。このように、頻繁に挿入、更新または削除が行われるアプリケーションにおいて、索引付けのために元表の更新を停止する必要はありません。

ただし、索引付け処理の最初と最後に元表が短時間ロックされます。

関連項目:

オンラインでの索引の作成についてさらに学習するには、『Oracle Textリファレンス』を参照してください。

3.1.7 パラレル索引付け

Oracle Textでは、CREATE INDEX文を使用したパラレル索引付けがサポートされています。

非パーティション表にパラレル索引付け文を入力すると、元表が一時パーティションに分割され、子プロセスが起動し、パーティションに子が割り当てられます。その後、子ごとに、それぞれのパーティションの行が索引付けされます。元表をパーティションに分割する方法はOracleによって判断され、ユーザーが直接制御することはありません。また、実際に起動される子プロセス数もOracleによって判断され、マシンの性能、システム負荷、init.ora設定およびその他の要因に依存します。これらの変数により、実際の並列度は、要求された並列度に一致しない可能性があります。

索引付けは集中型I/Oの操作であるため、分散ディスク・アクセスと複数CPUを使用する場合は、パラレル索引付けが索引付けに要する時間を短縮するための最も効果的な操作となります。パラレル索引付けは、CREATE INDEX文を使用した初期索引のパフォーマンスのみに影響します。ALTER INDEXを使用した挿入、更新および削除の操作には影響せず、問合せのパフォーマンスへの影響は最小限です。

パラレル索引付けは、初期の索引付け時間を短縮するため、次の状況で役立ちます。

3.1.8 索引付けとビュー

コンテンツが様々な表に含まれているドキュメントに索引付けする必要がある場合は、ユビキタス検索索引を作成します。

DBMS_SEARCH PL/SQLパッケージを使用すると、スキーマ内の複数の表およびビューにユビキタス検索索引を作成できます。この索引は、コンポーネント表との主キーおよび外部キー制約関係があるビューにのみ作成できます。

別の方法として、USER_DATASTOREオブジェクトを使用してデータ記憶域プリファレンスを作成することもできます。このオブジェクトを使用して、索引時に複数の表のドキュメントを合成するプロシージャを定義できます。

Oracle Textでは、マテリアライズド・ビュー(MVIEW)に対するCONTEXTCTXCATおよびCTXRULEの各索引の作成がサポートされています。