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の索引タイプ
索引タイプ | 説明 | サポートされるプリファレンスとパラメータ | 問合せ演算子 | 説明 |
---|---|---|---|---|
|
テキストが大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。MS Word、HTMLまたはプレーン・テキストなどの多様な形式のドキュメントを索引付けできます。 様々な方法で索引をカスタマイズできます。 この索引タイプでは、元表のDMLの後に |
このサポート対象のパラメータには、索引パーティション句、形式列、キャラクタ・セット列および言語列が含まれます。 |
文法は
|
すべてのドキュメント・サービスと問合せサービスがサポートされています。 パーティション・テキスト表の索引付けがサポートされています。
|
|
複合問合せのパフォーマンスを改善するには、この索引タイプを使用します。通常は、この索引タイプを使用して、小さいドキュメントやテキスト断片を索引付けします。複合問合せのパフォーマンスを改善するために、項目名、価格および説明などの元表の他の列を索引に組み込むことができます。 この索引タイプはトランザクションに基づき、元表に対するDMLの後に自動的に更新されます。 |
形式列、キャラクタ・セット列および言語列はサポートされていません。 表のパーティション化および索引のパーティション化はサポートされていません。 |
文法は
テーマ問合せがサポートされています。 |
この索引は大きいため、
|
|
ドキュメント分類アプリケーションまたはルーティング・アプリケーションの作成には、 |
「CTXRULEパラメータおよび制限事項」を参照してください。 |
|
単一のドキュメント(プレーン・テキスト、HTMLまたはXML)は、 |
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の索引を作成するメリットは、CONTAINS
、CATSEARCH
およびMATCHES
などのOracle Textの演算子を使用したテキスト問合せの応答時間が短縮されることです。これらの演算子は、それぞれCONTEXT
、CTXCAT
およびCTXRULE
の各索引タイプを問い合せます。
注意:
透過的なデータ暗号化の可能な列ではドメイン索引はサポートされないため、Oracle Textで使用することはできません。ただし、透過的なデータ暗号化に対応する表領域に格納されている表の列に対しては、Oracle Text索引を作成することができます。
関連項目:
-
XMLIndex
およびXMLType
データの索引付けの詳細は、『Oracle XML DB開発者ガイド』を参照
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
のパラメータ文字列で指定した索引付けプリファレンス型またはセクション・グループにそれぞれ対応しています。
Oracle Textは、次のオブジェクトとエンジンを使用してデータ・ストリームを処理します。
3.1.3.1 データストア・オブジェクト
ストリームはデータストアから始まり、データストアでは、指定したデータストア・プリファレンスに従って、システムに格納されているとおりにドキュメントが読み込まれます。たとえば、データストアをFILE_DATASTORE
と定義した場合、ストリームは、オペレーティング・システムからのファイルの読込みで開始されます。ドキュメントは、インターネット上またはOracle Databaseに格納することもできます。ファイルが物理的にどこに存在していても、Oracle Databaseにはそのファイルを指すテキスト表が必要です。
3.1.3.2 フィルタ・オブジェクト
次に、ストリームはフィルタ内を通過します。フィルタで行われる処理の内容は、指定したFILTER
プリファレンスによって決定されます。次のいずれかの処理がストリームに対して行われます。
3.1.3.3 セクショナ・オブジェクト
フィルタ処理後、マークアップされたテキストはセクショナを通過し、ストリームはテキスト情報とセクション情報に分割されます。セクション情報には、テキスト・ストリーム内でセクションが開始する場所と終了する場所の情報が含まれています。抽出されるセクションのタイプは、セクション・グループのタイプによって決定されます。
セクション情報は、直接索引付けエンジンに渡され、後で使用されます。テキストはレクサーに渡されます。
3.1.3.4 レクサー・オブジェクト
Oracle Textのレクサー・タイプのいずれかを使用してレクサー・プリファレンスを作成し、索引付けをするテキストの言語を指定します。レクサーは、使用言語に基づいて、テキストをトークンに分解します。通常、分解されたトークンはワードです。レクサーは、トークンの抽出に、レクサー・プリファレンスに定義されたパラメータを使用します。これらのパラメータには、トークンの分割に使用する空白などの文字の定義や、テキストをすべて大文字に変換するか、あるいは大/小文字混合のままで残すかなどの定義が含まれています。
テーマの索引付けが使用可能の場合、レクサーはテキストを分析してテーマ・トークンを作成し、索引付けを行います。
3.1.4 索引付き列の更新について
Oracle Database 12cリリース2 (12.2)より前のリリースでは、テキスト索引に基づく列に更新があった場合、インデックスが同期されるまでドキュメントの検索操作は実行できなくなります。ユーザーの問合せではこのドキュメントの検索を実行できません。Oracle Database 12cリリース2 (12.2)より、索引の同期をすぐに実行せずに、更新後にドキュメントを検索可能にする必要があることを指定できるようになりました。索引の同期前に、問合せで古い索引エントリを使用して古いドキュメントの内容をフェッチします。索引の同期化後、ユーザー問合せで更新済ドキュメントの内容をフェッチします。
索引のASYNCHRONOUS_UPDATE
オプションを使用して、更新後にドキュメントの古い内容を維持し、この索引を使用してユーザーの問合せに回答できます。
関連項目:
-
『Oracle Textリファレンス』の
ALTER INDEX
に関する説明 -
『Oracle Textリファレンス』の
CREATE INDEX
に関する説明
3.1.5 パーティション表とパーティション索引
パーティション・テキスト表にCONTEXT
パーティション索引を作成できます。パーティション表は、レンジでパーティション化する必要があります。ハッシュ・パーティション、コンポジット・パーティションおよびリスト・パーティションは、サポートされていません。
日付でデータをパーティション化したパーティション・テキスト表を作成できます。たとえば、使用しているアプリケーションで日付付きのニュース記事の大規模なライブラリをメンテナンスしている場合は、月別または年度別に情報をパーティション化できます。パーティション化によって、問合せ、DMLおよびバックアップとリカバリの操作を単一のパーティションに対して行うことができるため、大規模データベースが管理しやすくなります。
複数の表セットを持つローカルのCONTEXT
索引では、Oracle TextはOracle Databaseがサポートする数のパーティションをサポートします。
パーティション表の問合せには、通常の表の問合せと同様に、SELECT
文のWHERE
句でCONTAINS
を使用します。表全体または単一のパーティションを問い合せることができます。ただし、ORDER
BY
SCORE
句を使用する場合は、問合せを単一のパーティションに制限する範囲述語を組み込まないかぎり、単一のパーティションを問い合せることをお薦めします。
3.1.7 パラレル索引付け
Oracle Textでは、CREATE
INDEX
を使用したパラレル索引付けがサポートされています。
非パーティション表にパラレル索引付け文を入力すると、元表が一時パーティションに分割され、子プロセスが起動し、パーティションに子が割り当てられます。その後、子ごとに、それぞれのパーティションの行が索引付けされます。元表をパーティションに分割する方法はOracleによって判断され、ユーザーが直接制御することはありません。また、実際に起動される子プロセス数もOracleによって判断され、マシンの性能、システム負荷、init.ora
設定およびその他の要因に依存します。これらの変数により、実際の並列度は、要求された並列度に一致しない可能性があります。
索引付けはI/O集中型の操作であるため、分散ディスク・アクセスと複数CPUを使用する場合は、パラレル索引付けが索引付けに要する時間を短縮するための最も効果的な操作となります。パラレル索引付けは、CREATE
INDEX
を使用した初期索引のパフォーマンスにのみ影響します。ALTER
INDEX
を使用したDMLのパフォーマンスには影響せず、問合せパフォーマンスにもほとんど影響しません。
パラレル索引付けは、初期の索引付け時間を短縮するため、次の状況で役立ちます。
3.2 Oracle Textの索引付けの考慮事項
Oracle Textの索引を作成するには、CREATE
INDEX
文を使用します。索引の作成時にパラメータ文字列を指定しないと、索引は、デフォルトのパラメータを使用して作成されます。CONTEXT
、CTXCAT
またはCTXRULE
の各索引を作成できます。
この項の内容は次のとおりです。
また、デフォルトを変更し、問合せアプリケーションにあわせて索引をカスタマイズできます。CREATE
INDEX
で索引をカスタマイズするために使用するパラメータとプリファレンスのタイプは、次の一般的なカテゴリに分類されます。
3.2.1 テキストの場所
Oracle Text問合せアプリケーションの基本的な前提条件は、移入されたテキスト表があることです。テキスト表は、ドキュメント・コレクションに関する情報が格納される場所であり、索引付けをする際に必要です。
CONTEXT
索引を作成する場合、次の要素のいずれかを使用して、テキスト表に行を移入できます。
図3-2は、これらの方法を示しています。
CTXCAT
またはCTXRULE
索引を作成する場合は、最初に示した方法のみがサポートされます。
デフォルトでは、索引付け操作は、ドキュメント・テキストが直接テキスト表にロードされているものとして動作します。これが、前述の1番目の方法です。
CONTEXT
索引を作成する場合、ファイル名やURLからなるドキュメントについては、それぞれに対応するデータ記憶域索引プリファレンスを使用することにより、識別方法を変更できます。
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
タイプを使用して、ネストされた表にテキストを格納できます。
3.2.1.3 ファイルのパス名の格納
テキスト表には、ファイル・システムに格納されているファイルのパス名を格納できます。その場合は、索引付けの際にFILE_DATASTORE
プリファレンス型を使用します。このデータ格納方法は、CONTEXT
索引でのみサポートされています。
3.2.1.4 URLの格納
URL名を格納して、Webサイトを索引付けできます。URL名を格納する場合は、索引付け時に、URL_DATASTORE
プリファレンス型を使用します。このデータ格納方法は、CONTEXT
索引でのみサポートされています。
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つの索引に使用する場合、ニーズに合せて索引を構成できない場合があります。スタイルシート情報が索引に追加されないようにすることはできません。
3.2.1.8 DATASTOREタイプの要約
CREATE INDEX
で索引付けするときに、データストア・プリファレンスを使用してその場所を指定します。使用しているアプリケーションに従って適切なデータストアを使用します。
表3-2は、データストア・プリファレンス型を使用してテキストを格納するすべての方法を説明しています。
表3-2 DATASTOREタイプの要約
データストア・タイプ | 使用する状況 |
---|---|
|
データをテキスト列に内部的に格納する場合。各行は単一のドキュメントとして索引付けされます。 テキスト列には、 |
|
データをテキスト表の複数の列に格納する場合。列が連結され、各行に1つずつ仮想ドキュメントが作成されます。 |
|
データをテキスト列に内部的に格納する場合。ドキュメントがディテール表のテキスト列にある1つ以上の行で構成され、ヘッダー情報はマスター表に格納されます。 |
|
データをオペレーティング・システム・ファイルに外部的に格納する場合。ファイル名が、テキスト列の各行に1つずつ格納されます。 |
|
データをネストした表に格納する場合。 |
|
データをイントラネットまたはインターネット上にあるファイルに外部的に格納する場合。URLはテキスト列に格納されます。 |
|
ドキュメントが、索引付け時にユーザー定義ストアド・プロシージャによって合成されます。 |
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
3.2.2.2 複合形式列のフィルタ処理
Microsoft Word、プレーン・テキストおよびHTMLのドキュメントを含む列などの複合形式列がある場合は、テキスト表に形式列を組み込んで、プレーン・テキストやHTMLのフィルタ処理をバイパスできます。形式列では、各行にTEXT
またはBINARY
のタグを付けることができます。TEXT
タグを付けた行は、フィルタ処理されません。
たとえば、HTMLおよびプレーン・テキストの行にTEXT
タグを付け、Microsoft Wordの行にBINARY
タグを付けることができます。その形式列をCREATE INDEX
のPARAMETERS句で指定します。
第3の形式列の型IGNORE
は、ドキュメントに索引を付ける必要がない場合のために用意されています。これは、英語と日本語の両方によるプレーン・テキスト・ドキュメントを含む複合形式の表があり、英語のドキュメントのみを処理する場合や、プレーン・テキスト・ドキュメントとイメージの両方を含む複合形式の表などに役立ちます。IGNORE
はデータストア・レベルで実装されるため、すべてのフィルタとともに使用できます。
3.2.3 索引付け時の行のバイパス
テキスト表内の索引付け対象外の行(イメージ・データなどを含む行)はバイパスできます。バイパスする場合は、表に形式列を作成し、IGNORE
に設定します。その形式列の名前を、CREATE INDEX
のPARAMETERS句で指定します。
3.2.4 ドキュメントのキャラクタ・セット
索引付けエンジンは、フィルタ処理済のテキストを、データベース・キャラクタ・セットであるとみなします。AUTO_FILTER
フィルタ型を使用すると、書式設定されたドキュメントは、データベース・キャラクタ・セットでテキストに変換されます。
ソースがテキストで、ドキュメント・キャラクタ・セットがデータベース・キャラクタ・セットでない場合は、AUTO_FILTER
フィルタ型を使用して索引付けのためにテキストを変換できます。
3.2.4.1 キャラクタ・セットの検出
CHARSET
列がAUTO
に設定されている場合、AUTO_FILTER
フィルタは、ドキュメントのキャラクタ・セットを検出し、相違点がある場合は、検出されたキャラクタ・セットをデータベース・キャラクタ・セットに変換します。
3.2.5 ドキュメントの言語
Oracle Textでは、ほとんどの言語を索引付けできます。デフォルトでは、索引付けするテキストの言語は、データベース設定で指定した言語であるとみなされます。ドキュメントの言語によって、次のいずれかのレクサー型を使用します。
英語、フランス語、ドイツ語およびスペイン語のような空白で区切られた言語の索引付けには、BASIC_LEXER
プリファレンス型を使用します。これらの言語の中には、代替スペル、複合語の索引付けおよび基本文字変換を使用できるものがあります。
英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするには、MULTI_LEXER
プリファレンス型を使用します。
特定の言語を索引付けするために独自のレクサーを作成するには、USER_LEXER
プリファレンス型を使用します。
異なる言語のドキュメントを含む表を索引付けし、またドキュメント内の言語を自動検出するには、WORLD_LEXER
プリファレンス型を使用します。
3.2.5.1 BASIC_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を問い合せると、websiteとweb-siteを含むドキュメントが検索されます。
3.2.6.3 その他の文字
その他の文字は、トークン分割(startjoin、endjoin、whitespace)、句読点識別(punctuation)、数値トークン化(numjoin)、改行後のワード継続(continuation)などの別のトークン化動作を制御する文字として指定できます。これらのカテゴリの文字にはデフォルトがありますが、変更できます。
関連項目:
BASIC_LEXER
型の詳細は、『Oracle Textリファレンス』を参照してください。
3.2.7 大/小文字を区別した索引付けおよび問合せ
デフォルトでは、すべてのテキスト・トークンが大文字に変換された後で索引付けされます。つまり、大/小文字を区別しない問合せになります。たとえば、3つのワードcat、CATおよびCatをそれぞれ個別に問い合せても、すべて同じドキュメントが戻ります。
デフォルトを変更し、索引レコード・トークンをテキストの表示どおりに設定できます。大/小文字を区別する索引を作成した場合は、ドキュメントに一致するように大/小文字を正確に区別して問合せを指定する必要があります。たとえば、ドキュメントにCatが含まれている場合は、このドキュメントに一致するように、問合せをCatと指定する必要があります。catまたはCATと指定すると、ドキュメントは戻りません。
大/小文字を区別する索引付けを使用可能または使用禁止にするには、BASIC_LEXER
プリファレンスのmixed_case
属性を使用します。
3.2.8 ドキュメント・サービス・プロシージャのパフォーマンスと正引き索引
Oracle Textは、ドキュメントで単語を検索するとき逆向きの索引を使用し、そのドキュメントからスニペットを計算して結果を表示します。スニペットを計算するために、検索結果の一部として戻される各ドキュメントは再索引付けされます。ドキュメントのサイズが非常に大きい場合には、検索処理が大幅に遅くなります。
正引き索引は、ドキュメントが非常に大きい場合のパフォーマンスの問題を解消します。正引き索引は、逆向きの索引表$I
のトークン・オフセットを参照するマッピング表$O
を使用します。各トークン・オフセットは、元のドキュメントで文字オフセットに変換され、文字オフセット周辺のテキストを使用してテキスト・スニペットが生成されます。
正引き索引はスニペットを計算するときドキュメントのインメモリー索引付けを使用しないため、非常にサイズの大きいドキュメントで単語を検索するとき、逆向きの索引に比べてパフォーマンスが大幅に向上します。
正引き索引では、Oracle TextのCTX_DOC
パッケージで次のプロシージャのパフォーマンスが向上します。
-
CTX_DOC.SNIPPET
-
CTX_DOC.HIGHLIGHT
-
CTX_DOC.MARKUP
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
属性/列に指定できる値は、PLAINTEXT
、FILTERED
、NONE
のいずれかです。
-
PLAINTEXT
を指定すると、ドキュメントのコピーはプレーン・テキスト形式で$D
索引表に保存されます。プレーン・テキスト形式は、セクショナの出力形式として定義されています。SNIPPET
プロシージャを使用するときに、この値を指定します。 -
FILTERED
を指定すると、ドキュメントのコピーはフィルタ済形式で$D
索引表に保存されます。フィルタ済形式は、フィルタの出力形式として定義されています。MARKUP
プロシージャまたはHIGHLIGHT
プロシージャを使用するときに、この値を指定します。 -
NONE
を指定すると、ドキュメントのコピーが$D
索引表に保存されません。次の場合には、この値を指定します。-
SNIPPET
、MARKUP
または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 テーマの索引付け
3.2.9.2 発音区別記号を持つ文字の基本文字変換
一部の言語には、ティルデ、ウムラウトおよびアクセントなどの発音区別記号を持つ文字が含まれています。索引付け操作で、発音区別記号を含むワードが基本文字書式に変換された場合は、一致のスコアを取得するために、問合せに発音区別記号を含める必要はありません。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、索引内のenergíaおよびenergiaが一致します。
ただし、基本文字の索引付けが使用禁止になっていると、energíaを問い合せても、一致するのはenergíaのみです。
言語の基本文字の索引付けは、BASIC_LEXER
プリファレンス型のbase_letter
属性を使用して、使用可能および使用禁止にできます。
3.2.9.3 代替スペル
3.2.9.4 複合語
ドイツ語とオランダ語のテキストには、複合語が含まれています。これらの言語の場合、デフォルトではコンポジット索引が作成されます。その結果、ある語句を問い合せると、その語句を複合語の要素として含むワードが戻ります。
たとえば、ドイツ語で、語句Bahnhof(列車の駅)を問い合せると、Bahnhofを含むドキュメント、あるいはHauptbahnhof、NordbahnhofまたはOstbahnhofなど、Bahnhofが複合語の要素として含まれているワードを含むドキュメントが戻ります。
コンポジット索引の作成は、BASIC_LEXER
プリファレンス型のcomposite
属性を使用して、使用可能および使用禁止にできます。
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&P 500</value> <type>xIndex</type> </entity> </entities> </dictionary>
このファイルでは大文字/小文字は重要でありませんが、"S&P"の"&"をXMLエンティティ&
としてどのように指定する必要があるか注意してください。そうでない場合、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_stems
がYES
に設定されている場合は、複合語ステミングが自動的に実行されます。複合語は常に、それを構成する語に分割されます。
ステミング問合せのパフォーマンスを改善するには、BASIC_LEXER
のindex_stems
属性を使用可能にして、ステミング索引を作成します。
関連項目:
ファジー・マッチングとステミングの詳細は、『Oracle Textリファレンス』を参照してください
3.2.11.1 BASIC_LEXERのindex_stemsの言語属性の値
BASIC_LEXER
のindex_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 ワイルド・カード問合せのパフォーマンスの向上
ワイルド・カード問合せを使用すると、%ing、cos%または%benz%のような後方一致、前方一致および中間一致の各問合せを入力できます。通常の索引付けでは、これらの問合せは、問合せパフォーマンスを無視して、大きなワード・リストに拡張されることがあります。
ワイルド・カード問合せでは、トークン・プリフィックスとサブストリングが索引に記録されていると、応答時間が短縮されます。
デフォルトでは、トークン・プリフィックスとサブストリングは、Oracle Textの索引に記録されません。使用している問合せアプリケーションがワイルド・カード問合せを頻繁に使用する場合は、トークン・プリフィックスとサブストリングの索引付けを考慮してください。この索引付けを実行するには、wordlistプリファレンス型を使用します。ワイルド・カード検索のパフォーマンスを向上させるために必要なトレードオフは、索引が大きくなることです。
関連項目:
-
『Oracle Textリファレンス』のワイルド・カード問合せパフォーマンスを受入れ可能な制限内に保持する方法に関する説明
3.2.13 ドキュメントのセクション検索
HTMLやXMLのように、内部構造を持つドキュメントの場合は、ドキュメントのセクションを定義および索引付けできます。ドキュメントのセクションを索引付けすると、問合せの範囲を事前定義したセクションに絞り込むことができます。たとえば、問合せに対して、Headingsとして定義したセクション内の語句dogを含むドキュメントすべてを検索するように指定できます。
セクションは、索引付け前に定義し、セクション・グループ・プリファレンスを使用して指定する必要があります。
Oracle Textには、システム定義のHTMLおよびXML用のセクションが定義されたセクション・グループが用意されています。また、索引付け時に、XMLドキュメントからセクションをシステムで自動的に作成するように指定できます。
3.2.14 ストップワードとストップテーマ
ストップワードは、索引付け対象外のワードです。ストップワードとは通常、特定の言語で情報量の低いワードを指します。英語では、thisやthatのようなワードです。
デフォルトでは、特定言語の索引付け用に、ストップリストと呼ばれるストップワードのリストが用意されています。CTX_DDL
パッケージを使用してこのリストを変更したり、独自のリストを作成できます。ストップリストは、CREATE INDEX
のパラメータ文字列に指定します。
ストップテーマは、テーマ索引またはテーマの構成要素に使用できないワードです。ストップテーマは、CTX_DDL
パッケージを使用して追加できます。
ドキュメントのテーマは、ABOUT
演算子を使用して問い合せることができます。また、PL/SQLパッケージCTX_DOC
を使用して、プログラムで取り出すこともできます。
3.2.16 問合せのパフォーマンスとラージ・オブジェクト(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では、CONTEXT
、CTXCAT
およびCTXRULE
タイプの索引を作成できます。
Oracle Database 12cリリース2 (12.2)より、オプションで古い索引エントリを維持し、パラメータ文字列オプションASYNCHRONOUS_UPDATE
.を使用して元の内容を検索できるようになりました。
この項の内容は次のとおりです。
3.3.1 TEXT索引の作成手順の概要
デフォルトでは、システムはドキュメントがテキスト列に格納されるとみなします。この要件が満たされている場合は、プリファレンスを明示的に指定せずに、SQL文CREATE
INDEX
を使用して、テキスト索引を拡張可能な索引タイプCONTEXT
として作成できます。システムでは、テキスト列のデータ型およびドキュメントの形式が自動的に検出されます。次に、検出内容に合わせてインデックス作成プリファレンスが設定されます。
関連項目:
Oracle Textの索引を作成する手順は、次のとおりです。
-
デフォルトを使用しない場合は、必要に応じて、カスタムの索引プリファレンス、セクション・グループまたはストップリストを指定します。次の表は、これらの索引クラスを説明しています。
-
必要に応じて、独自のカスタム・プリファレンス、セクション・グループまたはストップリストを作成します。
-
SQL文
CREATE
INDEX
を使用してテキスト索引を作成し、索引名を指定し、必要に応じてプリファレンスを指定します。
関連項目:
-
『Oracle Textリファレンス』のOracle Textの索引付けの考慮事項およびCREATE INDEXに関する項
-
「プリファレンスの作成 」
3.3.2 プリファレンスの作成
必要に応じて、独自のカスタム索引プリファレンスを作成し、デフォルトを変更できます。ファイルの格納場所やドキュメントのフィルタ処理方法などの索引情報を指定するには、プリファレンスを使用します。プリファレンスを作成した後、属性を設定します。
3.3.2.1 データストア例
次の各項では、ダイレクト、複数列、URLおよびファイルのデータストアの設定例を示します。
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_proxy
、no_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のセクションの作成
3.3.4 ストップワードおよびストップリストの使用
ストップワードは、索引付け対象外のワードです。ストップワードは、通常、英語のthisやthatのような下位レベルの情報を提供するワードを指します。
システムには、すべての言語に対してストップリストというストップワードのリストが用意されています。デフォルトでは、索引付け時に使用言語に対して、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.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
を使用すると、すべての言語に対してシステムのデフォルト動作が次のようになります。
-
索引付けされるテキストは、テキスト列に直接格納されるとみなします。テキスト列の型は、
CLOB
、BLOB
、BFILE
、VARCHAR2
またはCHAR
になります。 -
列型を検出し、バイナリの列型(
BLOB
およびBFILE
)に対してフィルタ処理を使用します。ほとんどのドキュメント形式がフィルタ処理でサポートされています。列がプレーン・テキストの場合、システムはフィルタ処理を使用しません。 -
データベース設定で指定した言語に対するデフォルトのストップリストを使用します。ストップリストは、索引付け時にシステムが無視するワードを識別します。
デフォルトの索引付け動作は、ユーザー独自のプリファレンスを作成し、このカスタム・プリファレンスを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
を上書きします。
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.6 CTXCAT索引の作成
CTXCAT
索引タイプは、小さなテキスト断片や関連情報の索引付けに最適です。適切に作成されている場合は、この索引タイプを使用するほうが、CONTEXT
索引に比べて構造化問合せのパフォーマンスが向上します。
3.3.6.2 CTXCATサブ索引とそのコスト
CTXCAT
索引には、索引セットの構成要素として定義したサブ索引が含まれます。1つ以上の列にサブ索引を作成すると、複合問合せのパフォーマンスが向上します。ただし、索引セットにサブ索引を追加すると、コストがかかります。Oracle TextがCTXCAT
索引の作成に要する時間は、その総サイズによって異なります。CTXCAT
索引の総サイズに直接関係する要因は、次のとおりです。
-
索引付けするテキストの合計数
-
索引セットに含まれるサブ索引の数
-
サブ索引を構成する元表の列数
索引セットに多数のコンポーネント索引がある場合、更新が必要な索引が増えるため、DMLのパフォーマンスは低下します。
CTXCAT
索引の作成には追加の索引付け時間とディスク領域が必要になるため、索引セットにコンポーネント索引を追加する前に、それぞれのコンポーネント索引によってアプリケーションに提供される問合せパフォーマンス上のメリットを慎重に考慮する必要があります。
注意:
BASIC_STORAGE
I_ROWID_INDEX_CLAUSE
を使用すると、CTXCAT
索引の作成を高速化できます。この句については、『Oracle Textリファレンス』で説明しています。
3.3.6.3 CTXCATサブ索引の作成
オンライン・オークション・サイトでは、品目の説明、価格、入札終了日などの情報を格納し、参照する必要があるため、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
でのソートの条件が付与されたもの、およびprice
とbid_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つの構造化列p
とq
に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') ;
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 Politics、Musicおよび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の使用
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.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
文を使用すると、失敗した索引作成操作を再開できます。通常は、失敗した索引を調査して修正した後、その索引作成を再開します。ただし、失敗した索引をすべて再開できるとはかぎりません。
索引の最適化は定期的にコミットされます。したがって、最適化操作が失敗しても、コミット・ポイントまでのすべての最適化作業は保存されています。
次の文は、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
では、トランザクション・ベースの問合せはサポートされていません。
3.4.4.2 ローカル・パーティション索引の再作成
索引がローカルにパーティション化されている場合は、1回の手順で索引を再作成できません。最初にシャドウ・ポリシーを作成してから、すべてのパーティションに対してRECREATE_INDEX_ONLINE
プロシージャを実行する必要があります。パーティションの索引の再作成で索引パーティション・データおよび索引パーティション・メタデータをスワップするかどうかを示すSWAP
またはNOSWAP
を指定できます。
パラメータ文字列でNOPOPULATE
を指定した場合、このプロシージャを使用して、各パーティションのメタデータ(記憶域プリファレンスなど)を更新できます。これは、時間が限定された同期化によってシャドウ索引を追加的に構築する場合に便利です。NOPOPULATE
を指定すると、暗黙的にNOSWAP
が実施されます。
-
すべてのパーティションで
NOSWAP
が使用されている場合、既存の索引とほぼ同じサイズの記憶域が必要です。索引パーティションの再作成中にスワッピングは実行されないため、パーティションに対する問合せは通常処理されます。複数のパーティションにわたる問合せは、スワッピングの段階に到達するまで、パーティションをまたがって一貫した結果を戻します。 -
SWAP
を指定してパーティションを再構築する場合、その操作に必要な記憶域は、既存の索引パーティションとほぼ同じサイズです。索引パーティション・データおよび索引パーティション・メタデータは再作成後にスワッピングされるため、複数のパーティションにわたる問合せはパーティション間で一貫した結果を戻しませんが、各索引パーティションに関しては常に正しい結果となります。 -
SWAP
が指定されている場合、パーティションに対するDMLおよび同期化は、スワッピング・プロセス中にブロックされます。
3.4.4.3 時間制限付き同期化によるグローバル索引の再作成
索引の再作成を制御して、営業時間外にSYNC_INDEX
の時間制限を設定し、索引を追加的に再作成できます。CREATE_SHADOW_INDEXプロシージャを
POPULATE_PENDING
およびmaxtimeとともに使用します。
3.4.4.5 同時スワッピングによるローカル索引の再作成
ローカル・パーティション索引をオンラインで再作成して、プリファレンスを作成または変更できます。索引およびパーティションのメタデータのスワッピングは、この処理の最後に実行されます。複数のパーティションにわたる問合せは、最後にEXCHANGE_SHADOW_INDEX
が実行されているときを除く再作成の処理中、パーティションをまたがって一貫した結果を戻します。
3.4.5 索引の再構築
ALTER
INDEX
を使用すると、有効な索引を再構築できます。索引の再構築では、索引のほとんどの設定は変更できません。新しいプリファレンスを使用して索引付けする場合に、索引を再構築することがあります。一般的に、索引を削除して、CREATE
INDEX
を使用して再作成した後に、索引を再構築するメリットはありません。
関連項目:
索引の設定の変更の詳細は、「「索引の再作成」を参照してください
例: 索引の再構築
次の文は、索引を再構築し、レクサー・プリファレンスをmy_lexer
で置き換えます。
ALTER INDEX newsindex REBUILD PARAMETERS('replace lexer my_lexer');
3.5 CONTEXT索引に関するDML操作の管理
元表のDML操作とは、元表に対するドキュメントの挿入、更新または削除操作のことです。この項では、DML操作時にOracle TextのCONTEXT
索引を監視、同期化および最適化する方法を説明します。この項では、次の項目について説明します。
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万行)を超えた場合に実行されます。したがって、マージ操作の最適化を明示的に実行したり、自動最適化ジョブをスケジュールする必要はありません。
3.5.2.2 SYNC_INDEXのmaxtimeパラメータ
3.5.2.3 SYNC_INDEXのロック・パラメータ
sync_index
のロック・パラメータにより、索引に対してすでに他の同期化が実行中の場合に同期化がどのような処理をするかを構成できます。
-
sync_index
が索引名なしに起動された場合、ロック・パラメータは無視されます。 -
ロック・パラメータは、自動同期化(sync on commitまたはsync everyなど)には反映されません。
-
ロック・モードが
LOCK_WAIT
の場合、ロックが取得できない場合には永久に待機され、maxtimeの設定は無視されます。
次の2通りの場合があります。
オプション | 説明 |
---|---|
|
別の同期化が実行されている場合、実行中の同期化が完了するまで待機してから新規の同期化を開始します。 |
|
別の同期化が実行されている場合、すぐにエラーなしで戻ります。 |
|
別の同期化が実行されている場合、すぐにエラーが発生します(DRG-51313: DMLまたは最適化ロックの待機中にタイムアウトになりました)。 |
3.5.3 索引の最適化
索引の同期化を頻繁に行うと、最終的にCONTEXT
索引が断片化します。索引の断片化は、問合せ応答時間に悪影響を与える場合があります。したがって、索引の断片化を減少させ、最善の問合せパフォーマンスを実現するために、時間をおいてCONTEXT
索引を最適化する必要があります。
自動最適化ジョブをスケジュールするには、stage_itab_max_rows
を0
に設定して、SYNC_INDEX
を使用して実行される自動マージを無効にする必要があります。
索引の最適化を理解するには、索引の構造と同期化の内容を理解する必要があります。この項では、次の項目について説明します。
3.5.3.1 CONTEXT索引の構造
CONTEXT
CONTEXT索引は、各ワードにそのワードを含むドキュメントのリストが格納された逆向きの索引です。たとえば、初期の索引付け操作が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リファレンス』を参照してください