3 Oracle Textでの索引付け

Oracle Textでは、開発するアプリケーションのタイプに応じて複数のタイプの索引を作成できます。

この章では、以下のトピックについて説明します。

3.1 Oracle Text索引について

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

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

3.1.1 Oracle Textの索引タイプ

Oracle Textでは、CREATE INDEXを使用して複数のタイプの索引を作成できます。表3-1は、各索引タイプ、その用途およびサポートしている機能を示しています。

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

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

CONTEXT

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

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

この索引タイプでは、元表のDMLの後にCTX_DDL.SYNC_INDEXが必要です。

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

このサポート対象のパラメータには、索引パーティション句、形式列、キャラクタ・セット列および言語列が含まれます。

CONTAINS

文法はCONTEXT文法と呼ばれ、豊富な操作をサポートします。

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

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

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

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

CTXCAT

複合問合せのパフォーマンスを改善するには、この索引タイプを使用します。通常は、この索引タイプを使用して、小さいドキュメントやテキスト断片を索引付けします。複合問合せのパフォーマンスを改善するために、項目名、価格および説明などの元表の他の列を索引に組み込むことができます。

この索引タイプはトランザクションに基づき、元表に対するDMLの後に自動的に更新されます。CTX_DDL.SYNC_INDEXは必要ありません。

INDEX SET

LEXER

STOPLIST

STORAGE

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

形式列、キャラクタ・セット列および言語列はサポートされていません。

表のパーティション化および索引のパーティション化はサポートされていません。

CATSEARCH

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

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

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

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

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

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

CTXRULE

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

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

MATCHES

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

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

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

複合問合せのパフォーマンスを向上させるために、FILTER BY句またはORDER BY句(またはその両方)を持つCONTEXT索引を作成して、複合問合せの構造化基準に使用するリレーショナル列を指定できます。この索引は、CONTAINS演算子で問い合せます。

使用しているアプリケーションが、日付や価格などの関連基準に基づいて、小さいドキュメントや記述的なテキスト断片を検索する複合問合せを利用する回数が多い場合は、CTXCAT索引タイプを使用します。この索引は、CATSEARCH演算子で問い合せます。

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

注意:

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

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

Oracle Textの索引を作成するメリットは、CONTAINSCATSEARCHおよびMATCHESなどのOracle Textの演算子を使用したテキスト問合せの応答時間が短縮されることです。これらの演算子は、それぞれ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 データストア・オブジェクト

ストリームはデータストアから始まり、データストアでは、指定したデータストア・プリファレンスに従って、システムに格納されているとおりにドキュメントが読み込まれます。たとえば、データストアをFILE_DATASTOREと定義した場合、ストリームは、オペレーティング・システムからのファイルの読込みで開始されます。ドキュメントは、インターネット上または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 Database 12cリリース2 (12.2)より、索引の同期をすぐに実行せずに、更新後にドキュメントを検索可能にする必要があることを指定できるようになりました。索引の同期前に、問合せで古い索引エントリを使用して古いドキュメントの内容をフェッチします。索引の同期化後、ユーザー問合せで更新済ドキュメントの内容をフェッチします。

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

関連項目:

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

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

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

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

注意:

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

関連項目:

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

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

3.1.6 オンラインでの索引の作成

継続的に更新が発生し、索引付けのために元表をロックすることが実用的でない場合は、CREATE INDEXONLINEパラメータを使用して、オンラインで索引を作成できます。この方法を使用すると、DML操作が頻繁に発生するアプリケーションで、索引のために元表の更新を一時停止する必要がありません。

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

関連項目:

オンラインでの索引の作成の詳細は、『Oracle Textリファレンス』を参照してください。

3.1.7 パラレル索引付け

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

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

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

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

3.1.8 索引付けとビュー

Oracle SQLの標準では、ビューに対する索引の作成はサポートされていません。複数の表にコンテンツを含むドキュメントの索引付けが必要な場合は、USER_DATASTOREオブジェクトを使用してデータ記憶域プリファレンスを作成できます。このオブジェクトを使用して、索引時に複数の表のドキュメントを合成するプロシージャを定義できます。

関連項目:

USER_DATASTOREの詳細は、『Oracle Textリファレンス』を参照してください。

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

3.2 Oracle Textの索引付けの考慮事項

Oracle Textの索引を作成するには、CREATE INDEX文を使用します。索引の作成時にパラメータ文字列を指定しないと、索引は、デフォルトのパラメータを使用して作成されます。CONTEXTCTXCATまたはCTXRULEの各索引を作成できます。

この項の内容は次のとおりです。

また、デフォルトを変更し、問合せアプリケーションにあわせて索引をカスタマイズできます。CREATE INDEXで索引をカスタマイズするために使用するパラメータとプリファレンスのタイプは、次の一般的なカテゴリに分類されます。

3.2.1 テキストの場所

Oracle Text問合せアプリケーションの基本的な前提条件は、移入されたテキスト表があることです。テキスト表は、ドキュメント・コレクションに関する情報が格納される場所であり、索引付けをする際に必要です。

CONTEXT索引を作成する場合、次の要素のいずれかを使用して、テキスト表に行を移入できます。

  • テキスト情報(ドキュメントまたはテキスト断片)

  • ファイル・システムにあるドキュメントのパス名

  • Webドキュメントを指定するURL

図3-2は、これらの方法を示しています。

CTXCATまたはCTXRULE索引を作成する場合は、最初に示した方法のみがサポートされます。

図3-2 様々なテキスト格納方法

図3-2の説明が続きます
「図3-2 様々なテキスト格納方法」の説明

デフォルトでは、索引付け操作は、ドキュメント・テキストが直接テキスト表にロードされているものとして動作します。これが、前述の1番目の方法です。

CONTEXT索引を作成する場合、ファイル名やURLからなるドキュメントについては、それぞれに対応するデータ記憶域索引プリファレンスを使用することにより、識別方法を変更できます。

3.2.1.1 サポートされている列型

Oracle Textでは、VARCHAR2CLOBBLOBCHARBFILEXMLTypeおよびURIType型の列を使用して、CONTEXT索引を作成できます。

注意:

NCLOBDATEおよびNUMBERの列型は索引付けできません。

3.2.1.2 テキスト表へのテキストの格納

Oracle Textには、テキストを表に直接格納する方法がいくつかあります。

3.2.1.2.1 CONTEXTデータ記憶域

ドキュメントは様々な方法でテキスト表に格納できます。

1つの列にドキュメントを格納するにはDIRECT_DATASTOREデータ格納タイプ、複数の列にドキュメントを格納するにはMULTI_COLUMN_DATASTOREタイプを使用できます。複数の列にテキストが格納されている場合、Oracle Textは索引付けを行うためにこれらの列を連結して仮想ドキュメントを作成します。

また、ドキュメントのマスター/ディテール関係を作成し、1つのドキュメントを複数の行に格納することもできます。マスター/ディテール索引を作成するには、DETAIL_DATASTOREデータ格納タイプを使用します。

また、NESTED_DATASTOREタイプを使用して、ネストされた表にテキストを格納できます。

Oracle Textでは、XMLドキュメントの格納に使用できるXMLTypeデータ型の索引付けをサポートしています。

3.2.1.2.2 CTXCATデータ記憶域

テキスト表には、複数列にまたがって、名前、説明およびアドレスといったテキスト断片を格納し、CTXCAT索引を作成することもできます。CTXCAT索引は、複合問合せのパフォーマンスを改善します。

3.2.1.3 ファイルのパス名の格納

テキスト表には、ファイル・システムに格納されているファイルのパス名を格納できます。その場合は、索引付けの際にFILE_DATASTOREプリファレンス型を使用します。このデータ格納方法は、CONTEXT索引でのみサポートされています。

3.2.1.4 URLの格納

URL名を格納して、Webサイトを索引付けできます。URL名を格納する場合は、索引付け時に、URL_DATASTOREプリファレンス型を使用します。このデータ格納方法は、CONTEXT索引でのみサポートされています。

3.2.1.5 関連するドキュメント情報の格納

テキスト表に列を追加すると、問合せアプリケーションで必要な、主キー、日付、説明または作成者などの構造化情報を格納できます。

3.2.1.6 形式列とキャラクタ・セット列

ドキュメントが複合形式または複合キャラクタ・セットの場合は、次の列を追加できます。

  • 索引付け時のフィルタ処理に必要な形式(TEXTまたはBINARY)を記録する形式列。形式列をIGNOREに設定すると、索引付け時に無視する行を指定できます。この機能は、テキスト索引付けと互換性のないイメージなどのデータが含まれた行をバイパスする場合に役立ちます。

  • 行ごとにドキュメントのキャラクタ・セットを記録するキャラクタ・セット列。

索引の作成時に、形式列またはキャラクタ・セット列の名前を、CREATE INDEXのPARAMETERS句に指定する必要があります。

キャラクタ・セット列または言語列にキーワードAUTOまたはAUTOMATICが含まれるすべての行について、Oracle Textは統計的手法を適用して、ドキュメントのキャラクタ・セットおよび言語をそれぞれ判断し、ドキュメントの索引付けを適切に変更します。

3.2.1.7 サポートされているドキュメント形式

システムでは、HTML、PDF、Microsoft Wordおよびプレーン・テキストを含むほとんどのドキュメント形式を索引付けできるため、ユーザーはサポートされている任意のドキュメント・タイプをテキスト列にロードできます。

テキスト列に複合形式がある場合は、必要に応じて、索引付け時のフィルタ処理に役立つ形式列をオプションで組み込むことができます。その形式列を使用して、ドキュメントをBINARY (形式設定済)またはTEXT (形式未設定、HTMLなど)のいずれかに指定できます。HTMLドキュメントとXMLドキュメントを1つの索引に使用する場合、ニーズに合せて索引を構成できない場合があります。スタイルシート情報が索引に追加されないようにすることはできません。

関連項目:

サポートされているドキュメント形式の詳細は、『Oracle Textリファレンス』を参照してください。

3.2.1.8 DATASTOREタイプの要約

CREATE INDEXで索引付けするときに、データストア・プリファレンスを使用してその場所を指定します。使用しているアプリケーションに従って適切なデータストアを使用します。

表3-2は、データストア・プリファレンス型を使用してテキストを格納するすべての方法を説明しています。

表3-2 DATASTOREタイプの要約

データストア・タイプ 使用する状況

DIRECT_DATASTORE

データをテキスト列に内部的に格納する場合。各行は単一のドキュメントとして索引付けされます。

テキスト列には、VARCHAR2、CLOB、BLOB、CHARまたはBFILEを使用できます。XMLType列は、CONTEXT索引タイプでサポートされています。

MULTI_COLUMN_DATASTORE

データをテキスト表の複数の列に格納する場合。列が連結され、各行に1つずつ仮想ドキュメントが作成されます。

DETAIL_DATASTORE

データをテキスト列に内部的に格納する場合。ドキュメントがディテール表のテキスト列にある1つ以上の行で構成され、ヘッダー情報はマスター表に格納されます。

FILE_DATASTORE

データをオペレーティング・システム・ファイルに外部的に格納する場合。ファイル名が、テキスト列の各行に1つずつ格納されます。

NESTED_DATASTORE

データをネストした表に格納する場合。

URL_DATASTORE

データをイントラネットまたはインターネット上にあるファイルに外部的に格納する場合。URLはテキスト列に格納されます。

USER_DATASTORE

ドキュメントが、索引付け時にユーザー定義ストアド・プロシージャによって合成されます。

URLの索引付けの場合、索引付け時間とドキュメントの取出し時間が長くなります。これは、システムがネットワークからドキュメントを取り出す必要があるためです。

注意:

トリガーおよびMULTI_COLUMN_DATASTOREまたはUSER_DATASTOREの問題のトラブルシューティングでは、次のMy Oracle Supportの記事「No pending rows using triggers on Text indexed columns with MULTI_COLUMN_DATASTORE or USER_DATASTORE to bring in the various columns for indexing」(Doc ID 1613741.1)を参照してください。

関連項目:

データストア例

3.2.2 ドキュメント形式とフィルタ処理

Microsoft WordやPDFなどの書式設定されたドキュメントを索引付けするには、テキストにフィルタ処理する必要があります。システムで使用されるフィルタ処理のタイプは、FILTERプリファレンス型によって決まります。デフォルトでは、ドキュメントの形式が自動的に検出され、それらをテキストにフィルタリングするAUTO_FILTERフィルタ型が使用されます。

Oracle Textでは、ほとんどの形式を索引付けできます。また、複合形式を持つドキュメントを含む列も索引付けできます。

関連項目:

AUTO_FILTERでサポートされているドキュメントとグラフィック形式の詳細は、『Oracle Textリファレンス』を参照してください

3.2.2.1 フィルタ処理が不要なHTML

HTMLやプレーン・テキストのファイルを索引付けする場合は、AUTO_FILTER型を使用しないでください。最も効率のよい方法として、NULL_FILTERプリファレンス型を使用します。

3.2.2.2 複合形式列のフィルタ処理

Microsoft Word、プレーン・テキストおよびHTMLのドキュメントを含む列などの複合形式列がある場合は、テキスト表に形式列を組み込んで、プレーン・テキストやHTMLのフィルタ処理をバイパスできます。形式列では、各行にTEXTまたはBINARYのタグを付けることができます。TEXTタグを付けた行は、フィルタ処理されません。

たとえば、HTMLおよびプレーン・テキストの行にTEXTタグを付け、Microsoft Wordの行にBINARYタグを付けることができます。その形式列をCREATE INDEXのPARAMETERS句で指定します。

第3の形式列の型IGNOREは、ドキュメントに索引を付ける必要がない場合のために用意されています。これは、英語と日本語の両方によるプレーン・テキスト・ドキュメントを含む複合形式の表があり、英語のドキュメントのみを処理する場合や、プレーン・テキスト・ドキュメントとイメージの両方を含む複合形式の表などに役立ちます。IGNOREはデータストア・レベルで実装されるため、すべてのフィルタとともに使用できます。

3.2.2.3 カスタム・フィルタ処理

独自のカスタム・フィルタを作成し、ドキュメントをフィルタ処理して索引付けできます。ファイル・システムから実行する外部フィルタ、またはPL/SQLやJavaストアド・プロシージャのような内部フィルタのいずれも作成できます。

外部カスタム・フィルタ処理を行う場合は、USER_FILTERフィルタ・プリファレンス型を使用します。

内部フィルタ処理を行う場合は、PROCEDURE_FILTERフィルタ型を使用します。

関連項目:

PROCEDURE_FILTER例

3.2.3 索引付け時の行のバイパス

テキスト表内の索引付け対象外の行(イメージ・データなどを含む行)はバイパスできます。バイパスする場合は、表に形式列を作成し、IGNOREに設定します。その形式列の名前を、CREATE INDEXのPARAMETERS句で指定します。

3.2.4 ドキュメントのキャラクタ・セット

索引付けエンジンは、フィルタ処理済のテキストを、データベース・キャラクタ・セットであるとみなします。AUTO_FILTERフィルタ型を使用すると、書式設定されたドキュメントは、データベース・キャラクタ・セットでテキストに変換されます。

ソースがテキストで、ドキュメント・キャラクタ・セットがデータベース・キャラクタ・セットでない場合は、AUTO_FILTERフィルタ型を使用して索引付けのためにテキストを変換できます。

3.2.4.1 キャラクタ・セットの検出

CHARSET列がAUTOに設定されている場合、AUTO_FILTERフィルタは、ドキュメントのキャラクタ・セットを検出し、相違点がある場合は、検出されたキャラクタ・セットをデータベース・キャラクタ・セットに変換します。

3.2.4.2 複合キャラクタ・セット列

ドキュメント・セットに、JA16EUCおよびJA16SJISなどの異なるキャラクタ・セットを持つドキュメントが含まれている場合は、キャラクタ・セット列を作成して、そのドキュメントを索引付けできます。この列に、ドキュメントのキャラクタ・セットの名前を行ごとに移入します。その列の名前を、CREATE INDEX文のPARAMETERS句で指定します。

3.2.5 ドキュメントの言語

Oracle Textでは、ほとんどの言語を索引付けできます。デフォルトでは、索引付けするテキストの言語は、データベース設定で指定した言語であるとみなされます。ドキュメントの言語によって、次のいずれかのレクサー型を使用します。

英語、フランス語、ドイツ語およびスペイン語のような空白で区切られた言語の索引付けには、BASIC_LEXERプリファレンス型を使用します。これらの言語の中には、代替スペル、複合語の索引付けおよび基本文字変換を使用できるものがあります。

英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするには、MULTI_LEXERプリファレンス型を使用します。

特定の言語を索引付けするために独自のレクサーを作成するには、USER_LEXERプリファレンス型を使用します。

異なる言語のドキュメントを含む表を索引付けし、またドキュメント内の言語を自動検出するには、WORLD_LEXERプリファレンス型を使用します。

日本語、中国語および韓国語のトークン化および索引付け用に特別に設計された他のレクサー型も使用できます。

関連項目:

言語の索引付けおよびレクサー型の詳細は、『Oracle Textリファレンス』を参照してください。

3.2.5.1 BASIC_LEXER以外の言語機能

BASIC_LEXER、日本語、中国語および韓国語の各レクサーを使用して、Oracle Textではほとんどの言語にレクサー・ソリューションを提供しています。他の言語の場合は、ユーザー定義のレクサー・インタフェースを使用して、独自のレクサー・ソリューションを作成できます。このインタフェースを使用すると、索引付けまたは問合せ中にドキュメントを処理するPL/SQLプロシージャまたはJavaプロシージャを作成できます。

さらに、ユーザー定義レクサーを使用して、独自のテーマ・レクサー・ソリューションまたは言語処理エンジンを作成することもできます。

関連項目:

ユーザー定義レクサーの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.5.2 マルチ言語列の索引付け

英語、ドイツ語および日本語で書かれたドキュメントを含む列など、異なる言語のドキュメントを含むテキスト列を索引付けできます。マルチ言語列を索引付けするには、テキスト表に言語列が必要です。MULTI_LEXERプリファレンス型を使用します。

また、マルチ言語列の索引付け時に、マルチ言語ストップリストを取り込むこともできます。

3.2.6 特殊文字の索引付け

BASIC_LEXERプリファレンス型を使用する場合は、ハイフンやピリオドなど英数字以外の文字を索引付けでどのように扱うかを、それらの文字を含むトークンに対して指定できます。たとえば、Web-siteのようなワードを索引付けする場合、ハイフン文字(-)を組み込むかまたは除外するかを指定できます。

これらの文字は、索引付け時に要求する動作に基づいて、BASIC_LEXERカテゴリに分類されます。索引付け用に設定したレクサーの動作は、問合せ解析用のレクサーの動作と同じです。

次に、設定できる特殊文字をいくつか示します。

3.2.6.1 printjoin文字

索引付け時に英数字以外の文字をトークンに組み込む場合は、その文字をprintjoinとして定義します。

たとえば、索引にハイフンやアンダースコアの文字を組み込む場合は、その文字をprintjoinとして定義します。この場合、web-siteのようなワードは、web-siteとして索引付けされます。websiteを問い合せても、web-siteは検索されません。

3.2.6.2 skipjoin文字

英数字以外の文字を含むトークンを使用して索引付けしない場合は、その文字をskipjoinとして定義します。

たとえば、ハイフン(-)文字をskipjoinとして定義した場合、ワードweb-site は、websiteとして索引付けされます。web-siteを問い合せると、websiteweb-siteを含むドキュメントが検索されます。

3.2.6.3 その他の文字

その他の文字は、トークン分割(startjoin、endjoin、whitespace)、句読点識別(punctuation)、数値トークン化(numjoin)、改行後のワード継続(continuation)などの別のトークン化動作を制御する文字として指定できます。これらのカテゴリの文字にはデフォルトがありますが、変更できます。

関連項目:

BASIC_LEXER 型の詳細は、『Oracle Textリファレンス』を参照してください。

3.2.7 大/小文字を区別した索引付けおよび問合せ

デフォルトでは、すべてのテキスト・トークンが大文字に変換された後で索引付けされます。つまり、大/小文字を区別しない問合せになります。たとえば、3つのワードcatCATおよびCatをそれぞれ個別に問い合せても、すべて同じドキュメントが戻ります。

デフォルトを変更し、索引レコード・トークンをテキストの表示どおりに設定できます。大/小文字を区別する索引を作成した場合は、ドキュメントに一致するように大/小文字を正確に区別して問合せを指定する必要があります。たとえば、ドキュメントにCatが含まれている場合は、このドキュメントに一致するように、問合せをCatと指定する必要があります。catまたはCATと指定すると、ドキュメントは戻りません。

大/小文字を区別する索引付けを使用可能または使用禁止にするには、BASIC_LEXERプリファレンスのmixed_case属性を使用します。

関連項目:

BASIC_LEXERの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.8 ドキュメント・サービス・プロシージャのパフォーマンスと正引き索引

Oracle Textは、ドキュメントで単語を検索するとき逆向きの索引を使用し、そのドキュメントからスニペットを計算して結果を表示します。スニペットを計算するために、検索結果の一部として戻される各ドキュメントは再索引付けされます。ドキュメントのサイズが非常に大きい場合には、検索処理が大幅に遅くなります。

正引き索引は、ドキュメントが非常に大きい場合のパフォーマンスの問題を解消します。正引き索引は、逆向きの索引表$Iのトークン・オフセットを参照するマッピング表$Oを使用します。各トークン・オフセットは、元のドキュメントで文字オフセットに変換され、文字オフセット周辺のテキストを使用してテキスト・スニペットが生成されます。

正引き索引はスニペットを計算するときドキュメントのインメモリー索引付けを使用しないため、非常にサイズの大きいドキュメントで単語を検索するとき、逆向きの索引に比べてパフォーマンスが大幅に向上します。

正引き索引では、Oracle TextのCTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。

  • CTX_DOC.SNIPPET

  • CTX_DOC.HIGHLIGHT

  • CTX_DOC.MARKUP

正引き索引の有効化

次の例は、正引き索引の機能を有効にするために、BASIC_STORAGE記憶域タイプのforward_index属性値をTRUEに設定します。

exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
exec ctx_ddl.set_attribute('mystore','forward_index','TRUE');

スニペットを使用して正引き索引を使用

forward_indexオプションを使用して生成されたスニペットが、forward_indexオプションを使用しないで生成されたスニペットとわずかに異なる場合があります。そのような違いは一般的には最小限で、スニペットの品質には影響しません。このような違いは、forward_indexの使用時の、スニペットの一部としての「少数の余分な空白」や「改行」といった種類のものです。

コピー保存を使用して正引き索引を使用

正引き索引を効果的に使用するには、すべてのドキュメントのコピーを$D表に格納します。格納する形式は、使用するCTX_DOCパッケージのプロシージャに応じてプレーン・テキスト形式またはフィルタ済形式です。たとえば、SNIPPETプロシージャを使用するときにはプレーン・テキスト形式で、MARKUPまたはHIGHLIGHTプロシージャを使用するときにはフィルタ済形式でドキュメントを格納します。

ドキュメントのコピーを$D表に格納するには、Oracle Textのコピー保存機能を使用します。save_copy基本記憶域属性を使用するか、save_copy列索引パラメータを使用して、Oracle Textでコピー保存機能を実装できます。

  • save_copy基本記憶域属性を使用する場合:

    次の例では、BASIC_STORAGE記憶域タイプのsave_copy属性値をPLAINTEXTに設定します。これで、ドキュメントで単語を検索するとき、テキスト・ドキュメントのコピーを$D表に保存できます。

    exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
    exec ctx_ddl.set_attribute('mystore','save_copy','PLAINTEXT');
     
  • save_copy column索引パラメータを使用する場合:

    次の例では、save_copy column索引パラメータを使用してテキスト・ドキュメントのコピーを$D表に保存します。

    create table docs(
      id       number,
      txt      varchar2(64),
      save     varchar2(3)
    );
    
    insert into docs values(1, 'hello world', 'PLAINTEXT');
    
    create index idx on docs(txt) indextype is ctxsys.context
        parameters('save_copy column save');
    

    create index文で$D表を作成し、「hello world」というドキュメント1を$D表にコピーしています。

注意:

save_copy属性/列に指定できる値は、PLAINTEXTFILTEREDNONEのいずれかです。

  • PLAINTEXTを指定すると、ドキュメントのコピーはプレーン・テキスト形式で$D索引表に保存されます。プレーン・テキスト形式は、セクショナの出力形式として定義されています。SNIPPETプロシージャを使用するときに、この値を指定します。

  • FILTEREDを指定すると、ドキュメントのコピーはフィルタ済形式で$D索引表に保存されます。フィルタ済形式は、フィルタの出力形式として定義されています。MARKUPプロシージャまたはHIGHLIGHTプロシージャを使用するときに、この値を指定します。

  • NONEを指定すると、ドキュメントのコピーが$D索引表に保存されません。次の場合には、この値を指定します。

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

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

コピー保存を使用せずに正引き索引を使用

すべてのドキュメントのコピーを$D表に保存しなくても、つまりコピー保存の機能を使用しなくても、正引き索引の機能強化を活用できる場合があります。それは次のような場合です。

  • 一連のドキュメントにHTMLとプレーン・テキストが含まれている場合: すべてのドキュメントは、DIRECT_DATASTOREまたはMULTI_COLUMN_DATASTOREデータストア・タイプを使用して元表に格納する必要があります。

  • 一連のドキュメントにHTML、プレーン・テキストおよびバイナリが含まれている場合: すべてのドキュメントはDIRECT_DATASTOREデータストア・タイプを使用して元表に格納する必要があり、バイナリ・ドキュメントのみはフィルタ済形式で$D表に格納する必要があります。

正引き索引を使用せずにコピー保存を使用

コピー保存機能を使用すると、正引き索引の機能を有効にしていない場合でも、CTX_DOCパッケージで次のプロシージャのパフォーマンスが向上します。

  • CTX_DOC.FILTER

  • CTX_DOC.GIST

  • CTX_DOC.THEMES

  • CTX_DOC.TOKENS

関連項目:

BASIC_STORAGE索引付けタイプのforward_indexパラメータ句の詳細は、『Oracle Textリファレンス』を参照してください

3.2.9 各国語別の機能

索引付け時に、次の各国語別の機能を使用可能にできます。

3.2.9.1 テーマの索引付け

英語とフランス語の場合は、ドキュメントのテーマ情報を索引付けできます。ドキュメント・テーマは、ドキュメント内で詳しく展開されている概念のことです。テーマは、ABOUT演算子で問い合せることができます。

他の言語のナレッジ・ベースがロードされ、コンパイルされている場合は、その言語でテーマ情報を索引付けできます。

デフォルトでは、テーマは英語とフランス語で索引付けされます。テーマの索引付けは、BASIC_LEXERプリファレンス型のindex_themes属性を使用して、使用可能および使用禁止にできます。

関連項目:

3.2.9.2 発音区別記号を持つ文字の基本文字変換

一部の言語には、ティルデ、ウムラウトおよびアクセントなどの発音区別記号を持つ文字が含まれています。索引付け操作で、発音区別記号を含むワードが基本文字書式に変換された場合は、一致のスコアを取得するために、問合せに発音区別記号を含める必要はありません。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、索引内のenergíaおよびenergiaが一致します。

ただし、基本文字の索引付けが使用禁止になっていると、energíaを問い合せても、一致するのはenergíaのみです。

言語の基本文字の索引付けは、BASIC_LEXERプリファレンス型のbase_letter属性を使用して、使用可能および使用禁止にできます。

関連項目:

BASIC_LEXERの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.9.3 代替スペル

ドイツ語、デンマーク語およびスウェーデン語などの言語には、複数のスペルが容認されているワードがあります。たとえば、ドイツ語では、äという文字は、aeという文字で代替できます。ae文字は、代替書式と呼ばれます。

これらの言語の場合、デフォルトでは代替書式のワードが索引付けされます。問合せ語句もそれぞれの代替書式に変換されます。その結果、これらのワードをいずれのスペルでも問い合せることができます。

言語の代替スペルは、BASIC_LEXERプリファレンス型のalternate_spelling属性を使用して、使用可能および使用禁止にできます。

関連項目:

BASIC_LEXERの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.9.4 複合語

ドイツ語とオランダ語のテキストには、複合語が含まれています。これらの言語の場合、デフォルトではコンポジット索引が作成されます。その結果、ある語句を問い合せると、その語句を複合語の要素として含むワードが戻ります。

たとえば、ドイツ語で、語句Bahnhof(列車の駅)を問い合せると、Bahnhofを含むドキュメント、あるいはHauptbahnhofNordbahnhofまたはOstbahnhofなど、Bahnhofが複合語の要素として含まれているワードを含むドキュメントが戻ります。

コンポジット索引の作成は、BASIC_LEXERプリファレンス型のcomposite属性を使用して、使用可能および使用禁止にできます。

関連項目:

BASIC_LEXERの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.9.5 韓国語、日本語および中国語の索引付け

これらの言語の索引付けには、次の特殊なレクサーを使用します。

表3-3 アジア言語のレクサー

言語 レクサー

韓国語

KOREAN_MORPH_LEXER

日本語

JAPANESE_LEXERJAPANESE_VGRAM_LEXER

中国語

CHINESE_LEXER、CHINESE_VGRAM_LEXER

これらのレクサーには、索引付けを制御するための固有の属性セットがあります。

関連項目:

これらのレクサーの詳細は、『Oracle Textリファレンス』を参照してください。

3.2.10 エンティティ抽出およびCTX_ENTITYについて

エンティティ抽出とは、テキスト内の名前付きエンティティを識別して抽出する機能です。エンティティは、主に名詞および名詞句です。これらには、名前、場所、時間、コード化された文字列(電話番号や郵便番号など)、割合、金額およびその他多くのものが含まれます。CTX_ENTITYパッケージは、組込み辞書および英語テキストのルールのセットを使用して、エンティティ抽出を実装します。機能は、ユーザー提供のアドオン辞書およびルール・セットを使用して、英語やその他の言語用に拡張できます。

関連項目:

エンティティ抽出の使用の詳細は、『Oracle Textリファレンス』CTX_ENTITYパッケージに関する項およびエンティティ抽出ユーザー辞書ローダー(ctxload)に関する項を参照してください。

この項には次の例が含まれます:

3.2.10.1 エンティティ抽出の基本的な使用例

この項の例では、非常に単純なエンティティ抽出の基本例について説明します。この例では、次のテキストを含むclobがあることを前提とします。

New York, United States of America
The Dow Jones Industrial Average climbed by 5% yesterday on news of a new software release from database giant Oracle Corporation.

この例では、CTX_ENTITY.EXTRACTを使用して、CLOB値のすべてのエンティティを検索します。(行の場合は、テキストがどのようにclobになるか、または出力clobをどのように提供するかを心配する必要はありません)

エンティティ抽出には、オプションの指定を可能にする新しいタイプのポリシーの抽出ポリシーが必要です。行に対して、次のようにデフォルトのポリシーを作成します。

ctx_entity.create_extract_policy( 'mypolicy' );

次に、extractをコールして作業を実行できます。これには、ポリシー名、処理するドキュメント、言語および出力clobの4つの引数が必要です(たとえば、dbms_lob.createtemporaryコールして初期化しておく必要があります)。

ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob )

outclobには、抽出されたエンティティを識別するXMLが含まれます。内容を表示すると(適切にフォーマットされるように、XMLTYPEとして選択することをお薦めします)、次のように表示されます。

<entities>
  <entity id="0" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>city</type>
  </entity>
  <entity id="1" offset="150" length="18" source="SuppliedRule">
    <text>Oracle Corporation</text>
    <type>company</type>
  </entity>
  <entity id="2" offset="10" length="24" source="SuppliedDictionary">
    <text>United States of America</text>
    <type>country</type>
  </entity>
  <entity id="3" offset="83" length="2" source="SuppliedRule">
    <text>5%</text>
    <type>percent</type>
  </entity>
  <entity id="4" offset="113" length="8" source="SuppliedDictionary">
    <text>software</text>
    <type>product</type>
  </entity>
  <entity id="5" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>state</type>
  </entity>
</entities>

これは、XML対応プログラムで処理する場合は問題ありません。ただし、よりSQLフレンドリなビューにする場合は、Oracle XML DB機能を使用して次のように変換できます。

select xtab.offset, xtab.text, xtab.type, xtab.source
from xmltable( '/entities/entity'
PASSING xmltype(outclob)
  COLUMNS 
    offset number       PATH '@offset',
    lngth number        PATH '@length',
    text   varchar2(50) PATH 'text/text()',
    type   varchar2(50) PATH 'type/text()',
    source varchar2(50) PATH '@source'
) as xtab order by offset;

これによって、次の出力が生成されます。

    OFFSET TEXT                      TYPE                 SOURCE
---------- ------------------------- -------------------- --------------------
         0 New York                  city                 SuppliedDictionary
         0 New York                  state                SuppliedDictionary
        10 United States of America  country              SuppliedDictionary
        83 5%                        percent              SuppliedRule
       113 software                  product              SuppliedDictionary
       150 Oracle Corporation        company              SuppliedRule

異なるタイプのエンティティがすべて必要ない場合は、フェッチするタイプを選択できます。これを実行するには、エンティティ・タイプのカンマ区切りのリストを使用して、4番目の引数をextractプロシージャに追加します。次に例を示します。

ctx_entity.extract( 'mypolicy', mydoc, 'ENGLISH', outclob, 'city, country' ) 
 
That would give us the XML
 
<entities>
  <entity id="0" offset="0" length="8" source="SuppliedDictionary">
    <text>New York</text>
    <type>city</type>
  </entity>
  <entity id="2" offset="10" length="24" source="SuppliedDictionary">
    <text>United States of America</text>
    <type>country</type>
  </entity>
</entities>
3.2.10.2 ユーザー定義のルールを使用した新しいエンティティ・タイプの作成例

この項の例では、ユーザー定義のルールを使用して、新しいエンティティ・タイプを作成する方法を示します。ルールは、正規表現ベースの構文を使用して定義されます。ルールが抽出ポリシーに追加され、ポリシーが使用されると適用されます。

ルールは、株式指数などの増加を識別します。増加を表現する方法は多数あります。ルールは、次のいずれかの式に一致させる必要があります。

  climbed by 5%
  increased by over 30 percent
  jumped 5.5%

したがって、これらいずれかに一致する正規表現を作成し、新しいタイプのエンティティを作成します。ユーザー定義のエンティティは、xの文字で開始する必要があるため、次のようにエンティティxPositiveGainをコールします。

  ctx_entity.add_extract_rule( 'mypolicy', 1,
    '<rule>'                                                          ||
      '<expression>'                                                  ||
         '((climbed|gained|jumped|increasing|increased|rallied)'      ||
         '( (by|over|nearly|more than))* \d+(\.\d+)?( percent|%))'    ||
      '</expression>'                                                 ||
      '<type refid="1">xPositiveGain</type>'                          ||
    '</rule>');

この例では、refidを使用することに注意してください。これにより、正規表現内のカッコのペアを参照することで、正規表現のどの部分が実際に一致するかがわかります。この場合は、エンティティ式が必要なため、最も外側(および最初に出現する)カッコ(refid=1)になります。

この場合は、ポリシーをCTX_ENTITY.COMPILEでコンパイルする必要があります。

  ctx_entity.compile('mypolicy');

これにより、従来どおりそれを使用できます。

  ctx_entity.extract('mypolicy', mydoc, null, myresults)

この(省略した)出力は次のとおりです。

<entities>
  ...
  <entity id="6" offset="72" length="18" source="UserRule" ruleid="1">
    <text>climbed by over 5%</text>
    <type>xPositiveGain</type>
  </entity>
</entities>

最後に、別のユーザー定義のエンティティを追加しますが、この場合は辞書を使用しています。Dow Jonesの個別平均をタイプxIndexのエンティティとして認識するとします。S&P 500も同様に追加します。これを実行するには、次を含むXMLファイルを作成します。

<dictionary>
  <entities>
    <entity>
      <value>dow jones industrial average</value>
      <type>xIndex</type>
    </entity>
    <entity>
      <value>S&amp;P 500</value>
      <type>xIndex</type>
    </entity>
  </entities>
</dictionary>

このファイルでは大文字/小文字は重要でありませんが、"S&P"の"&"をXMLエンティティ&amp;としてどのように指定する必要があるか注意してください。そうでない場合、XMLは有効になりません。

このXMLファイルは、CTXLOADユーティリティを使用してシステムにロードされます。ファイルがdict.loadと呼ばれる場合は、次のコマンドを使用します。

ctxload -user username/password -extract -name mypolicy -file dict.load

CTX_ENTITY.COMPILEを使用してポリシーをコンパイルする必要があります。

3.2.11 ファジー・マッチングおよびステミング

問合せでファジー・マッチングを使用すると、類似するスペルのワードが一致します。Oracle Textでは、複数の言語用のエンティティ抽出を提供しています。

ステミングを使用すると、同じ語幹を持つワードが一致します。たとえば、$speakを問い合せると、speak、speaks、spokeおよびspokenを含むすべてのドキュメントに検索が拡張されます。

ファジー・マッチングとステミングは、Oracle Textが使用言語に対してこの機能をサポートしている場合は、索引で自動的に使用可能になります。

ファジー・マッチングはデフォルトのパラメータで有効になっていますが、類似度スコアの下限および拡張される語句の最大数が指定されています。索引時にこのデフォルト・パラメータを変更できます。

ドキュメントの言語を自動検出して必要な変換を実行するには、AUTO_LEXERのindex_stems属性を使用可能にして、ステミング索引を作成します。ドキュメント言語に対応するステマーが使用され、そのステマーは常に、ドキュメントの再コールを最大化するように構成されます。また、ドイツ語、フィンランド語、スウェーデン語およびオランダ語のように複合語を使用する言語のドキュメントでindex_stemsYESに設定されている場合は、複合語ステミングが自動的に実行されます。複合語は常に、それを構成する語に分割されます。

ステミング問合せのパフォーマンスを改善するには、BASIC_LEXERindex_stems属性を使用可能にして、ステミング索引を作成します。

関連項目:

ファジー・マッチングとステミングの詳細は、『Oracle Textリファレンス』を参照してください

3.2.11.1 BASIC_LEXERのindex_stemsの言語属性の値

BASIC_LEXERindex_stems属性では、次の値を使用できます。

値(続き)

ARABIC

NYNORSK

BOKMAL

PERSIAN

CROATIAN

SERBIAN

DANISH

SLOVAK

FINNISH

SLOVENIAN

HEBREW

THAI

CATALAN

HUNGARIAN

CZECH

ITALIAN

DERIVATIONAL

ITALIAN_NEW

DERIVATIONAL_NEW

NONE

DUTCH

POLISH

DUTCH_NEW

PORTUGUESE

ENGLISH

ROMANIAN

ENGLISH_NEW

RUSSIAN

FRENCH

SPANISH

FRENCH_NEW

SPANISH_NEW

GERMAN

SWEDISH

GERMAN_NEW

TURKISH

GREEK

3.2.11.2 AUTO_LEXERのindex_stemsの言語属性の値

AUTO_LEXERのindex_stems属性の値は、TRUEかFALSEです。AUTO_LEXERのindex_stems属性は、次の言語をサポートしています。

言語 言語(続き)

ARABIC

NYNORSK

BOKMAL

PERSIAN

CROATIAN

SERBIAN

DANISH

SLOVAK

FINNISH

SLOVENIAN

HEBREW

THAI

CATALAN

KOREAN

CZECH

POLISH

DUTCH

PORTUGUESE

ENGLISH

ROMANIAN

FRENCH

RUSSIAN

GERMAN

SIMPLIFIED CHINESE

GREEK

SPANISH

HUNGARIAN

SWEDISH

ITALIAN

TRADITIONAL CHINESE

JAPANESE

TURKISH

3.2.12 ワイルド・カード問合せのパフォーマンスの向上

ワイルド・カード問合せを使用すると、%ingcos%または%benz%のような後方一致、前方一致および中間一致の各問合せを入力できます。通常の索引付けでは、これらの問合せは、問合せパフォーマンスを無視して、大きなワード・リストに拡張されることがあります。

ワイルド・カード問合せでは、トークン・プリフィックスとサブストリングが索引に記録されていると、応答時間が短縮されます。

デフォルトでは、トークン・プリフィックスとサブストリングは、Oracle Textの索引に記録されません。使用している問合せアプリケーションがワイルド・カード問合せを頻繁に使用する場合は、トークン・プリフィックスとサブストリングの索引付けを考慮してください。この索引付けを実行するには、wordlistプリファレンス型を使用します。ワイルド・カード検索のパフォーマンスを向上させるために必要なトレードオフは、索引が大きくなることです。

関連項目:

3.2.13 ドキュメントのセクション検索

HTMLやXMLのように、内部構造を持つドキュメントの場合は、ドキュメントのセクションを定義および索引付けできます。ドキュメントのセクションを索引付けすると、問合せの範囲を事前定義したセクションに絞り込むことができます。たとえば、問合せに対して、Headingsとして定義したセクション内の語句dogを含むドキュメントすべてを検索するように指定できます。

セクションは、索引付け前に定義し、セクション・グループ・プリファレンスを使用して指定する必要があります。

Oracle Textには、システム定義のHTMLおよびXML用のセクションが定義されたセクション・グループが用意されています。また、索引付け時に、XMLドキュメントからセクションをシステムで自動的に作成するように指定できます。

3.2.14 ストップワードとストップテーマ

ストップワードは、索引付け対象外のワードです。ストップワードとは通常、特定の言語で情報量の低いワードを指します。英語では、thisthatのようなワードです。

デフォルトでは、特定言語の索引付け用に、ストップリストと呼ばれるストップワードのリストが用意されています。CTX_DDLパッケージを使用してこのリストを変更したり、独自のリストを作成できます。ストップリストは、CREATE INDEXのパラメータ文字列に指定します。

ストップテーマは、テーマ索引またはテーマの構成要素に使用できないワードです。ストップテーマは、CTX_DDLパッケージを使用して追加できます。

ドキュメントのテーマは、ABOUT演算子を使用して問い合せることができます。また、PL/SQLパッケージCTX_DOCを使用して、プログラムで取り出すこともできます。

3.2.14.1 言語の検出およびストップリスト

問合せ時、問合せの言語は、問合せテンプレートまたはセッション言語(問合せテンプレートによって言語が指定されていない場合)から継承されます。

3.2.14.2 マルチ言語のストップリスト

言語固有のストップワードを保持するマルチ言語のストップリストを作成することもできます。マルチ言語のストップリストは、英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするためにMULTI_LEXERを使用している場合に有効です。

索引作成時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時に、セッション言語の設定によって、アクティブなストップワードが特定されます。これは、マルチレクサーの使用時にアクティブなレクサーが特定されるのと同様です。

3.2.15 索引のパフォーマンス

索引のパフォーマンスに影響する要因には、メモリー割当て、ドキュメント形式、並列度およびパーティション表などがあります。

3.2.16 問合せのパフォーマンスとラージ・オブジェクト(LOB)列の格納

問合せで頻繁にアクセスされるが、ほとんど更新されないラージ・オブジェクト(LOB)データ型の構造化列を含む表の場合は、このような列を表外に格納することで問合せのパフォーマンスを向上させることができます。

注意:

属性をリモートLOB列にマップすることはできません。

3.2.17 複合問合せのパフォーマンス

CONTAINS()問合せでテキスト以外の列に構造化述語も含まれている場合は、テキスト索引でそれらの列の値も索引付けすることも検討できます。そのようにする場合は、CREATE INDEX文のFILTER BY句でそれらの列を指定します。これにより、パフォーマンス向上のためにOracle Textで構造化述語もまたテキスト索引によって処理するかどうかを決定できます。

また、CONTAINS()問合せで1つ以上の構造化列にORDER BY基準が含まれている場合、テキスト索引はそれらの列の値も索引付けできます。CREATE INDEX文のORDER BY句でそれらの列を指定します。これにより、問合せ応答時間の向上のためにOracle Textでテキスト索引にソートを入れるかどうかを決定できます。

3.3 Oracle Textの索引の作成

Oracle Textでは、CONTEXTCTXCATおよびCTXRULEタイプの索引を作成できます。

Oracle Database 12cリリース2 (12.2)より、オプションで古い索引エントリを維持し、パラメータ文字列オプションASYNCHRONOUS_UPDATE.を使用して元の内容を検索できるようになりました。

この項の内容は次のとおりです。

3.3.1 TEXT索引の作成手順の概要

デフォルトでは、システムはドキュメントがテキスト列に格納されるとみなします。この要件が満たされている場合は、プリファレンスを明示的に指定せずに、SQL文CREATE INDEXを使用して、テキスト索引を拡張可能な索引タイプCONTEXTとして作成できます。システムでは、テキスト列のデータ型およびドキュメントの形式が自動的に検出されます。次に、検出内容に合わせてインデックス作成プリファレンスが設定されます。

Oracle Textの索引を作成する手順は、次のとおりです。

  1. デフォルトを使用しない場合は、必要に応じて、カスタムの索引プリファレンス、セクション・グループまたはストップリストを指定します。次の表は、これらの索引クラスを説明しています。

    クラス 説明

    データストア

    ドキュメントの保存方法

    フィルタ

    ドキュメントのプレーン・テキストへの変換方法

    レクサー

    索引付け対象の言語

    ワードリスト

    ステミング問合せおよびファジー問合せの拡張方法

    記憶域

    索引データの格納方法

    ストップ・リスト

    索引付け対象外のワードまたはテーマ

    セクション・グループ

    ドキュメント・セクションの定義方法

  2. 必要に応じて、独自のカスタム・プリファレンス、セクション・グループまたはストップリストを作成します。

  3. SQL文CREATE INDEXを使用してテキスト索引を作成し、索引名を指定し、必要に応じてプリファレンスを指定します。

3.3.2 プリファレンスの作成

必要に応じて、独自のカスタム索引プリファレンスを作成し、デフォルトを変更できます。ファイルの格納場所やドキュメントのフィルタ処理方法などの索引情報を指定するには、プリファレンスを使用します。プリファレンスを作成した後、属性を設定します。

3.3.2.1 データストア例

次の各項では、ダイレクト、複数列、URLおよびファイルのデータストアの設定例を示します。

関連項目:

データ記憶域の詳細は、『Oracle Textリファレンス』を参照してください。

3.3.2.1.1 DIRECT_DATASTOREの指定

次の例では、テキスト・データを格納するCLOB列がある表を作成します。その後、2行のテキスト・データを移入し、DIRECT_DATASTOREプリファレンス型を使用するシステム定義プリファレンスCTXSYS.DEFAULT_DATASTOREを使用して表を索引付けします。

create table mytable(id number primary key, docs clob); 

insert into mytable values(111555,'this text will be indexed');
insert into mytable values(111556,'this is a default datastore example');
commit;

create index myindex on mytable(docs) 
  indextype is ctxsys.context 
  parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');
3.3.2.1.2 MULTI_COLUMN_DATASTOREの指定

次の例では、これらのテキスト列は、連結されて索引付けされます。3つのテキスト列にmy_multiという複数列のデータストア・プリファレンスを作成します。

begin
ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('my_multi', 'columns', 'column1, column2, column3');
end;
3.3.2.1.3 URLデータ記憶域の指定

この例では、my_urlというURL_DATASTOREプリファレンスを作成し、http_proxyno_proxyおよびtimeoutの各属性を設定します。timeout属性は300秒に設定されます。属性を設定しない場合は、デフォルトが使用されます。

begin
 ctx_ddl.create_preference('my_url','URL_DATASTORE');
 ctx_ddl.set_attribute('my_url','HTTP_PROXY','www-proxy.us.example.com');
 ctx_ddl.set_attribute('my_url','NO_PROXY','us.example.com');
 ctx_ddl.set_attribute('my_url','TIMEOUT','300');
end;
3.3.2.1.4 ファイル・データ記憶域の指定

次の例では、FILE_DATASTOREを使用してデータ記憶域プリファレンスを作成します。このプリファレンスによって、索引付け対象のファイルがオペレーティング・システムに格納されていることをシステムに知らせます。この例では、CTX_DDL.SET_ATTRIBUTEを使用して、PATH属性をディレクトリ/docsに設定します。

begin
ctx_ddl.create_preference('mypref', 'FILE_DATASTORE');
ctx_ddl.set_attribute('mypref', 'PATH', '/docs'); 
end;
3.3.2.2 NULL_FILTER例: HTMLドキュメントの索引付け

ドキュメント・セット全体がHTMLである場合は、フィルタ・プリファレンスにNULL_FILTERを使用する(フィルタ処理を行わない)ことをお薦めします。

たとえば、HTMLドキュメント・セットを索引付けするには、NULL_FILTERおよびHTML_SECTION_GROUPに対するシステム定義プリファレンスを次のように指定できます。

create index myindex on docs(htmlfile) indextype is ctxsys.context 
  parameters('filter ctxsys.null_filter
  section group ctxsys.html_section_group');
3.3.2.3 PROCEDURE_FILTER例

次のシグネチャを使用して定義するフィルタ・プロシージャCTXSYS.NORMALIZEを考えてみます。

PROCEDURE NORMALIZE(id IN ROWID, charset IN VARCHAR2, input IN CLOB, 
output IN OUT NOCOPY VARCHAR2);

このプロシージャをフィルタとして使用するには、次のようにフィルタ・プリファレンスを設定します。

begin
ctx_ddl.create_preference('myfilt', 'procedure_filter');
ctx_ddl.set_attribute('myfilt', 'procedure', 'normalize');
ctx_ddl.set_attribute('myfilt', 'input_type', 'clob');
ctx_ddl.set_attribute('myfilt', 'output_type', 'varchar2');
ctx_ddl.set_attribute('myfilt', 'rowid_parameter', 'TRUE');
ctx_ddl.set_attribute('myfilt', 'charset_parameter', 'TRUE');
end;
3.3.2.4 BASIC_LEXER例: printjoin文字の設定

printjoin文字は、索引トークンに組み込まれる英数字以外の文字を指します。web-siteのようなワードを、web-siteとして索引付けする場合に使用します。

次の例では、BASIC_LEXERを使用して、printjoin文字をハイフンとアンダースコアに設定します。

begin
ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
ctx_ddl.set_attribute('mylex', 'printjoins', '_-');
end;

前述のように、printjoin文字を設定した索引を作成するには、次の文を入力します。

create index myindex on mytable ( docs ) 
  indextype is ctxsys.context 
  parameters ( 'LEXER mylex' ); 
3.3.2.5 MULTI_LEXER例: マルチ言語表の索引付け

異なる言語のドキュメントを含む列を索引付けするには、MULTI_LEXERプリファレンス型を使用します。たとえば、テキスト列に英語、ドイツ語およびフランス語のドキュメントが格納されている場合は、このプリファレンス型を使用できます。

最初に、次のように、主キー、テキスト列および言語列を持つマルチ言語表を作成します。

create table globaldoc (
   doc_id number primary key,
   lang varchar2(3),
   text clob
);

表に格納されているドキュメントのほとんどが英語で、ドイツ語または日本語のドキュメントがいくつかあるとします。3つの言語を処理するには、英語、ドイツ語および日本語に対して1つずつの、3つのサブレクサーを作成する必要があります。

ctx_ddl.create_preference('english_lexer','basic_lexer');
ctx_ddl.set_attribute('english_lexer','index_themes','yes');
ctx_ddl.set_attribute('english_lexer','theme_language','english');

ctx_ddl.create_preference('german_lexer','basic_lexer');
ctx_ddl.set_attribute('german_lexer','composite','german');
ctx_ddl.set_attribute('german_lexer','mixed_case','yes');
ctx_ddl.set_attribute('german_lexer','alternate_spelling','german');

ctx_ddl.create_preference('japanese_lexer','japanese_vgram_lexer');

マルチレクサー・プリファレンスを作成します。

ctx_ddl.create_preference('global_lexer', 'multi_lexer');

格納されているドキュメントのほとんどが英語であるため、CTX_DDL.ADD_SUB_LEXERを使用して、英語のレクサーをデフォルトに設定します。

ctx_ddl.add_sub_lexer('global_lexer','default','english_lexer');

ここで、CTX_DDL.ADD_SUB_LEXERプロシージャを使用して、ドイツ語および日本語のレクサーをそれぞれの言語に追加します。また、言語列がISO標準言語コード639-2で表現されている場合は、これらを代替値として追加します。

ctx_ddl.add_sub_lexer('global_lexer','german','german_lexer','ger');
ctx_ddl.add_sub_lexer('global_lexer','japanese','japanese_lexer','jpn');

次のように、PARAMETERS句にマルチレクサー・プリファレンスおよび言語列を指定して、索引globalxを作成します。

create index globalx on globaldoc(text) indextype is ctxsys.context
parameters ('lexer global_lexer language column lang');
3.3.2.6 BASIC_WORDLIST例: サブストリングとプリフィックスの索引付けの有効化

次の例では、プリフィックスとサブストリングの索引付けに対してワードリスト・プリファレンスを設定します。プリフィックスとサブストリングのコンポーネントを索引に設定すると、ワイルド・カード問合せのパフォーマンスが向上します。

プリフィックス索引付けに対して、3から4文字の長さのトークン・プリフィックスを作成するように指定します。

begin 
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); 
ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE');
ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH', '3');
ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', '4');
ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');
end;

3.3.3 セクション検索のためのセクション・グループの作成

HTMLやXMLのように、ドキュメントに内部構造がある場合は、索引付け操作前に埋込みタグを使用してドキュメントのセクションを定義できます。この定義によって、WITHIN演算子を使用してセクション内で問合せができます。セクションは、セクション・グループの構成要素として定義します。

例: HTMLのセクションの作成

次のコードは、HTML_SECTION_GROUP型のhtmgroupというセクション・グループを定義します。次に、htmgroupに、<H1>タグで識別するheadingというゾーン・セクションを作成します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;

3.3.4 ストップワードおよびストップリストの使用

ストップワードは、索引付け対象外のワードです。ストップワードは、通常、英語のthisthatのような下位レベルの情報を提供するワードを指します。

システムには、すべての言語に対してストップリストというストップワードのリストが用意されています。デフォルトでは、索引付け時に使用言語に対して、Oracle Textのデフォルトのストップリストが使用されます。

デフォルトのストップリストCTXSYS.DEFAULT_STOPLISTを編集するか、次のPL/SQLプロシージャを使用して独自のリストを作成できます。

  • CTX_DDL.CREATE_STOPLIST

  • CTX_DDL.ADD_STOPWORD

  • CTX_DDL.REMOVE_STOPWORD

CREATE INDEXのPARAMETERS句に、カスタムのストップリストを指定します。

また、索引を作成した後で、ALTER INDEX文でストップワードを動的に追加することもできます。

3.3.4.1 マルチ言語のストップリスト

言語固有のストップワードを保持するマルチ言語のストップリストを作成できます。マルチ言語のストップリストは、英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするためにMULTI_LEXERを使用している場合に有効です。

マルチ言語ストップリストを作成するには、CTX_DDL.CREATE_STOPLISTプロシージャを使用し、MULTI_STOPLISTというストップリスト・タイプを指定します。CTX_DDL.ADD_STOPWORDを使用して言語固有のストップワードを追加します。

3.3.4.2 ストップテーマとストップクラス

独自のストップワードの定義に加えて、ストップテーマ(索引付け対象外のテーマ)も定義できます。この機能が使用できるのは、英語およびフランス語のみです。

数値が索引付け対象外であることも指定できます。索引付け対象外の数値のような英数字のクラスは、ストップクラスと呼ばれます。

独自のストップワード、ストップテーマおよびストップクラスを記録するには、それらを追加するためのストップリストを1つ作成します。そのストップリストをCREATE INDEXPARAMETERS句で指定します。

3.3.4.3 ストップリスト管理のためのPL/SQLプロシージャ

次のプロシージャを使用してストップリスト、ストップワード、ストップテーマおよびストップクラスを管理します。

  • CTX_DDL.CREATE_STOPLIST

  • CTX_DDL.ADD_STOPWORD

  • CTX_DDL.ADD_STOPTHEME

  • CTX_DDL.ADD_STOPCLASS

  • CTX_DDL.REMOVE_STOPWORD

  • CTX_DDL.REMOVE_STOPTHEME

  • CTX_DDL.REMOVE_STOPCLASS

  • CTX_DDL.DROP_STOPLIST

    関連項目:

    これらのプロシージャの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

3.3.5 CONTEXT索引の作成

CONTEXT索引タイプは、Microsoft Word、HTMLまたはプレーン・テキストのような形式の大量のまとまったドキュメントを索引付けする場合に最適です。CONTEXT索引では、様々な方法で索引をカスタマイズすることもできます。ドキュメントはテキスト表にロードする必要があります。

この項の内容は次のとおりです。

3.3.5.1 CONTEXT索引およびDML

CONTEXT索引は、トランザクション・ベースでは更新されません。レコードが削除される場合、索引の変更はただちに行われます。つまり、変更を行った瞬間から独自のセッションはレコードを検索しなくなり、他のユーザーはコミット後すぐにレコードを検索しません。挿入と更新の場合、索引の同期化が行われるまで、新しい情報はテキスト検索には表示されません。したがって、元表で挿入または更新を行う場合、CTX_DDL.SYNC_INDEXを使用して明示的に索引を同期化する必要があります。

関連項目:

索引の同期化

3.3.5.2 「デフォルトのCONTEXT索引例」

次の文は、docs表内のtext列にmyindexというデフォルトのCONTEXT索引を作成します。

CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;

パラメータを明示的に指定せずにCREATE INDEXを使用すると、すべての言語に対してシステムのデフォルト動作が次のようになります。

  • 索引付けされるテキストは、テキスト列に直接格納されるとみなします。テキスト列の型は、CLOBBLOBBFILEVARCHAR2またはCHARになります。

  • 列型を検出し、バイナリの列型(BLOBおよびBFILE)に対してフィルタ処理を使用します。ほとんどのドキュメント形式がフィルタ処理でサポートされています。列がプレーン・テキストの場合、システムはフィルタ処理を使用しません。

    注意:

    システムで正しくドキュメントをフィルタ処理するために、使用している環境がAUTO_FILTERフィルタをサポートするように正しく設定されていることを確認してください。

    AUTO_FILTERフィルタを使用するための環境の構成方法は、『Oracle Textリファレンス』を参照してください。

  • 索引付けするテキストの言語は、データベース設定で指定した言語であるとみなします。

  • データベース設定で指定した言語に対するデフォルトのストップリストを使用します。ストップリストは、索引付け時にシステムが無視するワードを識別します。

  • 使用言語でのファジーおよびステミング問合せを有効にします(その言語に対してこの機能が使用可能な場合)。

デフォルトの索引付け動作は、ユーザー独自のプリファレンスを作成し、このカスタム・プリファレンスをCREATE INDEXのパラメータ文字列に指定することによって、いつでも変更できます。

3.3.5.3 ALTER INDEXおよびCREATE INDEXによる索引の追加的な作成

ALTER INDEX文およびCREATE INDEX文は、CONTEXTグローバル索引の追加的な作成をサポートします。

  • グローバル索引を作成するために、CREATE INDEXは、REBUILD句のNOPOPULATEキーワードをサポートしています。REPLACEパラメータ内のNOPOPULATEキーワードを使用すると、索引を追加的に作成できます。これは、索引付け処理を連続的に実行するのが困難な大規模なインストールでテキスト索引を作成する場合に便利です。

  • ローカル索引パーティションを作成するために、ALTER INDEX ... REBUILD partition ... parameters('REPLACE ...')パラメータ文字列は、NOPOPULATEキーワードをサポートするように修正されています。

  • ローカル索引パーティションを作成するために、CREATE INDEX ... LOCAL ... (partition ... parameters ('NOPOPULATE'))がサポートされています。パーティション・レベルのPOPULATEキーワードまたはNOPOPULATEキーワードは、索引レベルで指定されたPOPULATEまたはNOPOPULATEを上書きします。

関連項目:

ALTER INDEX文およびCREATE INDEX文の構文の詳細は、『Oracle Textリファレンス』を参照してください。

3.3.5.4 POPULATE_PENDINGによるCONTEXT索引の追加的な作成

索引付け処理を連続的に実行するのが困難な大規模なインストールの場合、CTX_DDL.POPULATE_PENDINGプロシージャを使用できます。これにより、索引の作成をより細かく制御できます。望ましい方法は、空の索引を作成して、すべてのROWIDを保留キューに配置し、CTX_DDL.SYNC_INDEXを介して索引を構築する方法です。

このプロシージャにより、元表および表パーティション内のすべてのROWIDが保留中のキューに移入されます。

関連項目:

CTX_DDL.POPULATE_PENDINGの詳細は、『Oracle Textリファレンス』を参照してください。

3.3.5.5 カスタムのCONTEXT索引例: HTMLドキュメントの索引付け

URLで指定されたHTMLドキュメント・セットを索引付けする場合は、CREATE INDEX文でシステム定義プリファレンスであるNULL_FILTERを指定できます。

HTML_SECTION_GROUPを使用するセクション・グループhtmgroupおよびURL_DATASTOREを使用するデータストアmy_urlを次のように指定できます。

begin
 ctx_ddl.create_preference('my_url','URL_DATASTORE');
 ctx_ddl.set_attribute('my_url','HTTP_PROXY','www-proxy.us.example.com');
 ctx_ddl.set_attribute('my_url','NO_PROXY','us.example.com');
 ctx_ddl.set_attribute('my_url','Timeout','300');
end;

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'heading', 'H1');
end;

ドキュメントを次のように索引付けできます。

CREATE INDEX myindex on docs(htmlfile) indextype is ctxsys.context 
parameters(
'datastore my_url filter ctxsys.null_filter section group htmgroup'
);

関連項目:

カスタムのCONTEXT索引の作成例はプリファレンスの作成を参照してください

3.3.5.6 CONTEXT索引例: FILTER BYおよびORDER BYによる問合せ処理

複合問合せで問合せ処理を効率化し応答時間を短縮するため、次の例に示すようにFILTER BY句およびORDER BY句を使用できます。

CREATE INDEX myindex on docs(text) INDEXTYPE is CTXSYS.CONTEXT
FILTER BY category, publisher, pub_date
ORDER BY pub_date desc;

この例では、問合せ処理を効率化するため、問合せ時にFILTER BY category, publisher, pub_date句を指定することで、これらの列上に関連の述語があった場合に、Oracle Textがそれらをテキスト索引の行ソースに入れることを考慮しています。

また、問合せに一致するORDER BY条件がある場合、応答時間を短縮するために、ORDER BY pub_date descを指定することで、Oracle Textにより、SORTをテキスト索引の行ソースに入れるかどうかが決定されます。

3.3.5.7 リリース12cのDATASTOREトリガー

複数の列にOracle TextのCONTEXT索引を作成する場合は、通常、索引付けのための様々な列を得るためにMULTI_COLUMN_DATASTOREまたはUSER_DATASTOREを使用します。Oracle Textでは、指定した特定の列の内容が変更された場合にのみ索引が更新されます。

3.3.6 CTXCAT索引の作成

CTXCAT索引タイプは、小さなテキスト断片や関連情報の索引付けに最適です。適切に作成されている場合は、この索引タイプを使用するほうが、CONTEXT索引に比べて構造化問合せのパフォーマンスが向上します。

3.3.6.1 CTXCAT索引およびDML

CTXCAT索引は、トランザクション・ベースで更新されます。元表でDML(挿入、更新および削除)を実行すると、索引が自動的に同期化されます。CONTEXT索引と異なり、CTX_DDL.SYNC_INDEXは不要です。

注意:

トリガーを起動せずに挿入を実行するアプリケーション(SQL*Loaderなど)では、前述の索引の自動同期化は行われません。

3.3.6.2 CTXCATサブ索引とそのコスト

CTXCAT索引には、索引セットの構成要素として定義したサブ索引が含まれます。1つ以上の列にサブ索引を作成すると、複合問合せのパフォーマンスが向上します。ただし、索引セットにサブ索引を追加すると、コストがかかります。Oracle TextがCTXCAT索引の作成に要する時間は、その総サイズによって異なります。CTXCAT索引の総サイズに直接関係する要因は、次のとおりです。

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

  • 索引セットに含まれるサブ索引の数

  • サブ索引を構成する元表の列数

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

CTXCAT索引の作成には追加の索引付け時間とディスク領域が必要になるため、索引セットにコンポーネント索引を追加する前に、それぞれのコンポーネント索引によってアプリケーションに提供される問合せパフォーマンス上のメリットを慎重に考慮する必要があります。

注意:

BASIC_STORAGEI_ROWID_INDEX_CLAUSEを使用すると、CTXCAT索引の作成を高速化できます。この句については、『Oracle Textリファレンス』で説明しています。

3.3.6.3 CTXCATサブ索引の作成

オンライン・オークション・サイトでは、品目の説明、価格、入札終了日などの情報を格納し、参照する必要があるため、CTXCAT索引作成のよい例です。

図3-3 Auction表のスキーマとCTXCAT索引

図3-3の説明が続きます
「図3-3 Auction表のスキーマとCTXCAT索引」の説明

図3-3は、次のスキーマを使用したAUCTIONという表を示しています。

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

サブ索引を作成するには、サブ索引を格納する索引セットを作成します。

begin
ctx_ddl.create_index_set('auction_iset');
end;

次に、アプリケーションが入力する可能性がある構造化問合せを特定します。CATSEARCH問合せ演算子では、必須のテキスト句とオプションの構造化句を使用します。

この例では、すべての問合せにテキスト列であるtitle列の句が組み込まれています。

構造化句は、次のカテゴリに分類されるとします。

構造化句 問合せを満たすサブ索引の定義 カテゴリ

'price < 200'

'price = 150'

'order by price'

'price'

A

'price = 100 order by bid_close'

'order by price, bid_close'

'price, bid_close'

B

構造化問合せ句カテゴリA

構造化問合せ句には、次のように、price列のみの式が含まれています。

SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'price < 200')> 0;
SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'price = 150')> 0;
SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'order by price')> 0;

これらの問合せは、サブ索引Bを使用して満たすことができます。しかし、効率を上げるために、priceのみにサブ索引を作成することもできます。それをここではサブ索引Aとします。

begin
ctx_ddl.add_index('auction_iset','price'); /* sub-index A */
end;

構造化問合せ句カテゴリB

構造化問合せ句には、priceについての等式にbid_closeでのソートの条件が付与されたもの、およびpricebid_closeの両方で(この順に)ソートの条件が付与されたものが含まれます。

SELECT FROM auction WHERE CATSEARCH(
   title, 'camera','price = 100 
   ORDER BY bid_close')> 0;
SELECT FROM auction 
   WHERE CATSEARCH(
   title, 'camera','order by price, bid_close')> 0;

これらの問合せは、次のように定義したサブ索引で満たすことができます。

begin
ctx_ddl.add_index('auction_iset','price, bid_close'); /* sub-index B */
end;

結合されたBツリー索引と同様に、CTX_DDL.ADD_INDEXを使用して指定する列の順序は、特定の問合せを満たすために使用される索引スキャンの効率性および実行可能性に影響します。たとえば、2つの構造化列pqにBツリー索引が'p,q'として指定されている場合、Oracle Textでは、この索引をスキャンして'ORDER BY q,p'をソートできません。

3.3.6.4 CTXCAT索引の作成

次の例では、前述の例を結合し、2つのサブ索引を持つ索引セット・プリファレンスを作成します。

begin
ctx_ddl.create_index_set('auction_iset');
ctx_ddl.add_index('auction_iset','price'); /* sub-index A */
ctx_ddl.add_index('auction_iset','price, bid_close'); /* sub-index B */
end;

図3-3は、サブ索引AおよびBをAUCTION表から作成する方法を示しています。各サブ索引はそれぞれテキスト列と名前付き構造化列のBツリー索引です。たとえば、サブ索引Aは、title列とbid_close列の索引です。

結合されたカタログ索引は、CREATE INDEXを使用して次のように作成します。

CREATE INDEX auction_titlex ON AUCTION(title) 
  INDEXTYPE IS CTXSYS.CTXCAT 
  PARAMETERS ('index set auction_iset')
;

関連項目:

CREATEINDEXを使用したCTXCAT索引の作成方法の詳細は、『Oracle Textリファレンス』を参照してください。

3.3.7 CTXRULE索引の作成

ドキュメント分類アプリケーションの作成には、CTXRULE索引を使用します。ドキュメント分類アプリケーションでは、ドキュメントの内容に基づいて着信ドキュメントのストリームが分類されます。表または問合せでCTXRULE索引を作成すると、ドキュメント・ルーティングが実行されます。問合せによりカテゴリが定義されます。単一ドキュメントの分類には、MATCHES演算子を使用できます。

この項では、CTXRULE索引および単一のドキュメント分類アプリケーションを作成するための次の手順について説明します。

関連項目:

ドキュメントの分類およびCTXRULE索引の詳細は、「Oracle Textでのドキュメントの分類」を参照してください

3.3.7.1 手順1: 問合せ表の作成

最初に、分類を定義する問合せ表を作成します。ここでは、カテゴリ名と問合せテキストを保持する表myqueriesを次のように作成します。

CREATE TABLE myqueries (
queryid NUMBER PRIMARY KEY,
category VARCHAR2(30),
query VARCHAR2(2000)
);

表に分類と各分類を定義する問合せを移入します。たとえば、US PoliticsMusicおよびSoccerなどの主題の分類を考えます。

INSERT INTO myqueries VALUES(1, 'US Politics', 'democrat or republican');
INSERT INTO myqueries VALUES(2, 'Music', 'ABOUT(music)');
INSERT INTO myqueries VALUES(3, 'Soccer', 'ABOUT(soccer)');

CTX_CLS.TRAINの使用

ルール(または問合せ)の表の生成には、CTX_CLS.TRAINプロシージャも使用できます。このプロシージャは入力としてドキュメント・トレーニング・セットを取ります。

関連項目:

CTX_CLS.TRAINの詳細は、『Oracle Textリファレンス』を参照してください。

3.3.7.2 手順2: CTXRULE索引の作成

CREATE INDEXを使用して、CTXRULE索引を作成します。必要に応じて、次のように、lexer、storage、section groupおよびwordlistの各パラメータを指定できます。

CREATE INDEX myruleindex ON myqueries(query)
     INDEXTYPE IS CTXRULE PARAMETERS
           ('lexer lexer_pref 
             storage storage_pref 
             section group section_pref 
             wordlist wordlist_pref');
3.3.7.3 手順3: ドキュメントの分類

問合せセットに作成されたCTXRULE索引を使用すれば、MATCHES演算子を使用したドキュメント分類が可能です。

着信ドキュメントは表newsに格納されるとします。

CREATE TABLE news ( 
newsid NUMBER,
author VARCHAR2(30),
source VARCHAR2(30),
article CLOB);

MATCHESで「BEFORE INSERT」トリガーを作成すると、各ドキュメントをそれぞれの分類に基づいて、別の表news_routeにルーティングできます。

BEGIN
  -- find matching queries
  FOR c1 IN (select category
               from myqueries
              where MATCHES(query, :new.article)>0) 
  LOOP
    INSERT INTO news_route(newsid, category)
      VALUES (:new.newsid, c1.category);
  END LOOP;
END;

3.3.8 JSONの検索索引の作成

表列名の検索索引を作成します。

Oracle Textは、JSONで検索索引を作成するための簡易な代替構文をサポートします。

3.4 Oracle Text索引の管理

この項では、エラーや索引付け時の障害が発生した場合の索引のメンテナンスについて説明します。この項の内容は、次のとおりです。

3.4.1 索引エラーの表示

索引付け操作は失敗したり、正常に完了しないことがあります。行の索引付け操作でエラーが発生すると、システムはそのエラーを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;

このビューは、新しい索引を作成したときに、自動的にクリアされます。

関連項目:

索引エラー・ビューの詳細は、『Oracle Textリファレンス』を参照してください

3.4.2 索引の削除

CREATE INDEXを使用して索引を再作成する前に、既存の索引を削除する必要があります。

索引を削除するには、SQLのDROP INDEX文を使用します。

無効なPARAMETERS文字列を使用して索引を作成する場合は、索引を再作成する前に削除する必要があります。

たとえば、newsindexという索引を削除するには、次のSQL文を入力します。

DROP INDEX newsindex; 

索引付け操作が異常終了したときなど、Oracle Textが索引の状態を判断できない場合は、前述のコマンドでは索引を削除できません。この場合は、次のコマンドを使用します。

DROP INDEX newsindex FORCE;

関連項目:

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

3.4.3 失敗した索引付けの再開

ALTER INDEX文を使用すると、失敗した索引作成操作を再開できます。通常は、失敗した索引を調査して修正した後、その索引作成を再開します。ただし、失敗した索引をすべて再開できるとはかぎりません。

索引の最適化は定期的にコミットされます。したがって、最適化操作が失敗しても、コミット・ポイントまでのすべての最適化作業は保存されています。

関連項目:

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

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

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

3.4.4 索引の再作成

この項では、索引設定の変更を可能にする、索引の再作成に使用できるプロシージャについて説明します。再作成のプロセス中、通常、索引を問い合せることができます。

3.4.4.1 グローバル索引の再作成

Oracle Textでは、RECREATE_INDEX_ONLINEを提供して新規プリファレンスによるCONTEXT索引を再作成できる一方、再作成処理中の元表DMLおよび問合せ機能が保持されています。RECREATE_INDEX_ONLINEを単一手順のプロシージャで使用して、グローバル索引用のCONTEXT索引をオンラインで作成できます。既存の索引を残したまま新規索引が作成されるため、この操作には既存の索引とほぼ同じサイズの記憶域が必要です。また、RECREATE_INDEX_ONLINE操作はオンラインで実行されるため、操作中に元表でDMLを発行できます。再作成中に発行されるすべてのDMLは、オンラインの保留中のキューに記録されます。

  • 索引の再作成操作の完了後、再作成プロセス中のDMLによる新しい情報がすぐに反映されない場合があります。オンラインでの索引の作成の場合と同様に、索引の再作成操作の完了後は、索引を完全に最新にするために、それを同期化する必要があります。

  • 再作成中に索引に対して発行される同期化は、既存の古いデータに対して処理されます。この期間中、問合せがエラーを戻す場合、同期化はブロックされます。

  • 再作成中に索引に対して発行される最適化コマンドは、エラーも処理もなく、すぐに戻ります。

  • RECREATE_INDEX_ONLINEの間は、ほとんど常に、索引を問い合せることができます。問合せは、最後のスワップが終わるまで、既存の索引およびポリシーに基づいて結果を戻します。また、DML文を発行してそれを同期化した場合は、既存の索引の問合せ時に新しい行を表示できます。

関連項目:

RECREATE_INDEX_ONLINEプロシージャの詳細は、『Oracle Textリファレンス』を参照してください。

注意:

RECREATE_INDEX_ONLINEでは、トランザクション・ベースの問合せはサポートされていません。

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

索引がローカルにパーティション化されている場合は、1回の手順で索引を再作成できません。最初にシャドウ・ポリシーを作成してから、すべてのパーティションに対してRECREATE_INDEX_ONLINEプロシージャを実行する必要があります。パーティションの索引の再作成で索引パーティション・データおよび索引パーティション・メタデータをスワップするかどうかを示すSWAPまたはNOSWAPを指定できます。

パラメータ文字列でNOPOPULATEを指定した場合、このプロシージャを使用して、各パーティションのメタデータ(記憶域プリファレンスなど)を更新できます。これは、時間が限定された同期化によってシャドウ索引を追加的に構築する場合に便利です。NOPOPULATEを指定すると、暗黙的にNOSWAPが実施されます。

  • すべてのパーティションでNOSWAPが使用されている場合、既存の索引とほぼ同じサイズの記憶域が必要です。索引パーティションの再作成中にスワッピングは実行されないため、パーティションに対する問合せは通常処理されます。複数のパーティションにわたる問合せは、スワッピングの段階に到達するまで、パーティションをまたがって一貫した結果を戻します。

  • SWAPを指定してパーティションを再構築する場合、その操作に必要な記憶域は、既存の索引パーティションとほぼ同じサイズです。索引パーティション・データおよび索引パーティション・メタデータは再作成後にスワッピングされるため、複数のパーティションにわたる問合せはパーティション間で一貫した結果を戻しませんが、各索引パーティションに関しては常に正しい結果となります。

  • SWAPが指定されている場合、パーティションに対するDMLおよび同期化は、スワッピング・プロセス中にブロックされます。

関連項目:

RECREATE_INDEX_ONLINEの詳細は、『Oracle Textリファレンス』を参照してください。

3.4.4.3 時間制限付き同期化によるグローバル索引の再作成

索引の再作成を制御して、営業時間外にSYNC_INDEXの時間制限を設定し、索引を追加的に再作成できます。CREATE_SHADOW_INDEXプロシージャをPOPULATE_PENDINGおよびmaxtimeとともに使用します。

関連項目:

CREATE_SHADOW_INDEXの例については、『Oracle Textリファレンス』を参照してください。

3.4.4.4 スケジュールされたスワッピングによるグローバル索引の再作成

問合せの失敗およびDMLブロックを許容できる場合は、CTX_DDL.EXCHANGE_SHADOW_INDEXを使用して、営業時間外に索引の再作成を実行できます。

関連項目:

CTX_DDL.EXCHANGE_SHADOW_INDEXの例については、『Oracle Textリファレンス』を参照してください。

3.4.4.5 同時スワッピングによるローカル索引の再作成

ローカル・パーティション索引をオンラインで再作成して、プリファレンスを作成または変更できます。索引およびパーティションのメタデータのスワッピングは、この処理の最後に実行されます。複数のパーティションにわたる問合せは、最後にEXCHANGE_SHADOW_INDEX実行されているときを除く再作成の処理中、パーティションをまたがって一貫した結果を戻します。

3.4.4.6 同時スワッピングによるローカル索引再作成のスケジューリング

CTX.DDLパッケージのRECREATE_INDEX_ONLINEにより、ローカル・パーティション索引を追加的に再作成できます。ここで、パーティションは最後にすべてスワッピングされます。

関連項目:

RECREATE_INDEX_ONLINEを使用したこの処理の詳細および例は、『Oracle Textリファレンス』を参照してください。

3.4.4.7 パーティションごとのスワッピングによるローカル索引の再作成

同時にすべてのパーティションをスワッピングするかわりに、各パーティションをその完了時にスワッピングすることによって、新しいプリファレンスを使用して索引をオンラインで再作成できます。すべてのパーティションにわたる問合せは、その処理中に一貫性のない結果を戻す場合があります。このプロシージャでは、CREATE_SHADOW_INDEXRECREATE_INDEX_ONLINEとともに使用されます。

関連項目:

RECREATE_INDEX_ONLINEを使用した索引パーティションのスワッピングの例は、『Oracle Textリファレンス』を参照してください。

3.4.5 索引の再構築

ALTER INDEXを使用すると、有効な索引を再構築できます。索引の再構築では、索引のほとんどの設定は変更できません。新しいプリファレンスを使用して索引付けする場合に、索引を再構築することがあります。一般的に、索引を削除して、CREATE INDEXを使用して再作成した後に、索引を再構築するメリットはありません。

関連項目:

索引の設定の変更の詳細は、「索引の再作成を参照してください

例: 索引の再構築

次の文は、索引を再構築し、レクサー・プリファレンスをmy_lexerで置き換えます。

ALTER INDEX newsindex REBUILD PARAMETERS('replace lexer my_lexer');

3.4.6 プリファレンスの削除

カスタム索引プリファレンスが不要になった場合は、そのプリファレンスを削除できます。

索引プリファレンスの削除には、プロシージャCTX_DDL.DROP_PREFERENCEを使用します。

プリファレンスを削除しても、そのプリファレンスから作成された索引は影響を受けません。

関連項目:

CTX_DDL.DROP_PREFERENCEプロシージャの構文の詳細は、『Oracle Textリファレンス』を参照してください。

例: プリファレンスの削除

次のコードは、プリファレンスmy_lexerを削除します。

begin
ctx_ddl.drop_preference('my_lexer');
end;

3.5 CONTEXT索引に関するDML操作の管理

元表のDML操作とは、元表に対するドキュメントの挿入、更新または削除操作のことです。この項では、DML操作時にOracle TextのCONTEXT索引を監視、同期化および最適化する方法を説明します。この項では、次の項目について説明します。

注意:

CTXCAT索引はトランザクション・ベースで更新されるため、元表を変更すると即時に更新されます。この項で説明する手動同期化は、CTXCAT索引には不要です。

3.5.1 保留中のDMLの表示

元表のドキュメントを挿入、更新または削除すると、そのROWIDは、その索引が同期化されるまでDMLキューに保持されます。このキューを表示するには、CTX_USER_PENDINGビューを使用します。

たとえば、すべての索引で保留中のDMLを表示するには、次の文を入力します。

SELECT pnd_index_name, pnd_rowid, to_char(
        pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss'
        ) timestamp FROM ctx_user_pending;

この文によって、次の形式の出力結果が戻されます。

PND_INDEX_NAME                 PND_ROWID          TIMESTAMP
------------------------------ ------------------ --------------------
MYINDEX                        AAADXnAABAAAS3SAAC 06-oct-1999 15:56:50

関連項目:

CTX_USER_PENDINGビューの詳細は、『Oracle Textリファレンス』を参照してください

3.5.2 索引の同期化

索引を同期化すると、元表に対する保留中のすべての更新および挿入が処理されます。同期化は、PL/SQLでCTX_DDL.SYNC_INDEXプロシージャを使用して実行します。次の項では、索引の同期化で継続期間およびロック動作を制御する方法を説明します。

3.5.2.1 SYNC_INDEXによる索引の同期化

次の例では、2MBのメモリーを使用して索引を同期化します。

begin
ctx_ddl.sync_index('myindex', '2M');
end;

Oracle Database 12cリリース2 (12.2.0.1)より、stage_itabから$I表への行のマージはSYNC_INDEXを使用して自動的に実行されます。この行のマージは、stage_itab ($G)の行数がstage_itab_max_rowsパラメータ(デフォルトでは100万行)を超えた場合に実行されます。したがって、マージ操作の最適化を明示的に実行したり、自動最適化ジョブをスケジュールする必要はありません。

関連項目:

CTX_DDL.SYNC_INDEX文の構文の詳細は、『Oracle Textリファレンス』を参照してください。

3.5.2.2 SYNC_INDEXのmaxtimeパラメータ

sync_indexプロシージャには、optimize_indexのように、操作に対し分単位の提示された時間制限を指定するmaxtimeパラメータが含まれます。sync_indexは、指定の時間制限内に、キュー内のできるかぎり多くのドキュメントを処理します。

  • maxtimeNULLの場合は、CTX_DDL.MAXTIME_UNLIMITEDの場合と同じです。

  • 時間制限は、概算です。実際にかかる時間が指定した時間より短いかまたは長い場合があります。

  • 非推奨となっているALTER INDEX... syncコマンドには、変更はありません。

  • sync_indexが索引名なしに起動された場合、maxtimeパラメータは無視されます。

  • maxtimeパラメータは、自動同期化(sync on commitsync everyなど)には反映されません。

3.5.2.3 SYNC_INDEXのロック・パラメータ

sync_indexのロック・パラメータにより、索引に対してすでに他の同期化が実行中の場合に同期化がどのような処理をするかを構成できます。

  • sync_indexが索引名なしに起動された場合、ロック・パラメータは無視されます。

  • ロック・パラメータは、自動同期化(sync on commitまたはsync everyなど)には反映されません。

  • ロック・モードがLOCK_WAITの場合、ロックが取得できない場合には永久に待機され、maxtimeの設定は無視されます。

次の2通りの場合があります。

オプション 説明

CTX_DDL.LOCK_WAIT

別の同期化が実行されている場合、実行中の同期化が完了するまで待機してから新規の同期化を開始します。

CTX_DDL.LOCK_NOWAIT

別の同期化が実行されている場合、すぐにエラーなしで戻ります。

CTX_DDL.LOCK_NOWAIT_ERROR

別の同期化が実行されている場合、すぐにエラーが発生します(DRG-51313: DMLまたは最適化ロックの待機中にタイムアウトになりました)。

3.5.3 索引の最適化

索引の同期化を頻繁に行うと、最終的にCONTEXT索引が断片化します。索引の断片化は、問合せ応答時間に悪影響を与える場合があります。したがって、索引の断片化を減少させ、最善の問合せパフォーマンスを実現するために、時間をおいてCONTEXT索引を最適化する必要があります。

自動最適化ジョブをスケジュールするには、stage_itab_max_rows0に設定して、SYNC_INDEXを使用して実行される自動マージを無効にする必要があります。

索引の最適化を理解するには、索引の構造と同期化の内容を理解する必要があります。この項では、次の項目について説明します。

3.5.3.1 CONTEXT索引の構造

CONTEXTCONTEXT索引は、各ワードにそのワードを含むドキュメントのリストが格納された逆向きの索引です。たとえば、初期の索引付け操作が1つ終了すると、ワードDOGのエントリは次のようになります。

DOG DOC1 DOC3 DOC5
3.5.3.2 索引の断片化

新しいドキュメントが元表に追加されると、索引は新しい行の追加によって同期化されます。たとえば、ワードdogを含む新しいドキュメント(DOC 7など)を元表に追加し、索引を同期化すると、次のようになります。

DOG DOC1 DOC3 DOC5
DOG DOC7

続くDML操作によって、新しい行が次のように作成されるとします。

DOG DOC1 DOC3 DOC5
DOG DOC7
DOG DOC9
DOG DOC11

新しいドキュメントの追加と索引の同期化は、索引の断片化の原因になります。特に、バックグラウンドDMLの場合は索引を頻繁に同期化するため、一般的に、バッチ・モードでの同期化に比べて断片化が増加します。

バッチ処理の頻度を少なくすると、ドキュメント・リストが長くなり、索引内の行数も減ります。したがって、断片化も減少します。

CTX_DDL.OPTIMIZE_INDEXを使用して、FULL(完全)またはFAST(高速)モードで索引を最適化すると、索引の断片化を減少させることができます。

3.5.3.3 ドキュメントの無効性とガベージ・コレクション

ドキュメントを元表から削除すると、Oracle Textでは、そのドキュメントに削除済のマークが設定されます。ただし、索引は即時に変更されません。

古い情報が領域を占有していると問合せ時に余分なオーバーヘッドが発生するため、索引をFULLモードで最適化して古い情報を削除する必要があります。この処理はガベージ・コレクションと呼ばれます。元表に対する更新または削除を頻繁に行う場合は、ガベージ・コレクションのためにFULLモードで最適化を行う必要があります。

3.5.3.4 単一のトークンの最適化

索引全体の最適化以外に、単一のトークンも最適化できます。トークン・モードを使用すると、参照頻度の低いトークンの最適化に時間をかけずに、検索頻度の高い索引トークンを最適化できます。

たとえば、トークンDOGの更新と問合せが頻繁に行われる場合、索引内のこのトークンのみの最適化を指定できます。

トークンを最適化すると、そのトークンの問合せ応答時間が短縮できます。

索引の最適化を単一のトークンで行うには、CTX_DDL.OPTIMIZE_INDEXを使用します。

3.5.3.5 索引の断片化およびガベージ・データの表示

CTX_REPORT.INDEX_STATSプロシージャを使用すると、索引の統計レポートを作成できます。このレポートには、最適な行の断片化に関する情報、最も断片化されているトークン、および索引内のガベージ・データの量が含まれています。大規模な索引の場合はこのレポートの実行に時間がかかることがありますが、このレポートは索引を最適化する必要があるかどうかの判断に役立ちます。

関連項目:

CTX_REPORT.INDEX_STATSプロシージャの詳細は、『Oracle Textリファレンス』を参照してください

3.5.3.6 例: 索引の最適化

索引を最適化する場合は、CTX_DDL.OPTIMIZE_INDEXを使用することをお薦めします。

関連項目:

CTX_DDL.OPTIMIZE_INDEX文の構文と使用例の詳細は、『Oracle Textリファレンス』を参照してください。