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、プレーン・テキストといった形式の大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。

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

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

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

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

CONTAINS

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

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

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

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

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

CTXCAT

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

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

INDEX SET

LEXER

STOPLIST

STORAGE

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

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

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

CATSEARCH

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

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

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

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

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

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

CTXRULE

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

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

MATCHES

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

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

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

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

ノート:

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

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

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

ノート:

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

関連項目:

3.1.2 Oracle TextのCONTEXT索引の構造

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

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

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

DOG

DOC1 DOC3 DOC5

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

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

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

関連項目:

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

3.1.3 Oracle Textの索引付け処理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.1.3.5 索引付けエンジン

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

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

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

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

関連項目:

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

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

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

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

ノート:

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

関連項目:

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

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

3.1.6 オンライン索引

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

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

関連項目:

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

3.1.7 パラレル索引付け

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

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

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

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

3.1.8 索引付けとビュー

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

関連項目:

USER_DATASTOREについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

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

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

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

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

この項では、次の項目について説明します。

3.2.1 テキストの場所

テキスト問合せアプリケーションの基本的な前提条件は、ドキュメント・コレクションが移入されたテキスト表です。このテキスト表は索引付けに必要です。

CONTEXT索引を作成する場合、次の要素のいずれかを使用して、テキスト表に行を移入します。CTXCAT索引およびCTXRULE索引は最初のメソッドのみをサポートします。

  • テキスト情報(ドキュメントまたはテキスト断片。デフォルトでは、索引付け操作は、ドキュメント・テキストが直接テキスト表にロードされるものとして動作します。)

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

  • WebドキュメントのURL

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

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

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

3.2.2 サポートされている列タイプ

Oracle Textでは、VARCHAR2CLOB (制限4294967295バイトまで)、BLOBCHARBFILEXMLTypeおよびURIType型の列を使用して、CONTEXT索引を作成できます。

ノート:

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

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

CONTEXTデータ記憶域の場合、次のデータストア・タイプを使用してテキスト表にドキュメントを格納します。

  • DIRECT_DATASTORE: 1つの列

  • MULTI_COLUMN_DATASTORE: 複数の列(Oracle Textでは、各行に1つのドキュメントになるように、列を連結して仮想ドキュメントにします。)

  • DETAIL_DATASTORE: マスター/詳細関係(1つのドキュメントを複数の行に格納します。)

  • NESTED_DATASTORE: ネストした表

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

CTXCATデータ記憶域では、名前や説明、アドレスといった短いテキスト断片を多数の列に格納できます。CTXCAT索引は、複合問合せのパフォーマンスを改善します。

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

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

ノート:

Oracle Database 19c以降、Oracle TextのFILE_DATASTORE型は非推奨になりました。かわりに、DIRECTORY_DATASTOREを使用してください。

FILE_DATASTOREテキスト索引を、Oracle Database 19c以降で使用可能なDIRECTORY_DATASTORE索引タイプに置き換えることをお薦めします。DIRECTORY_DATASTOREにより、ディレクトリ・オブジェクトに基づいたファイル・アクセスが可能になるため、セキュリティが強化されます。

3.2.5 URLの格納

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

ノート:

Oracle Database 19c以降、Oracle TextのURL_DATASTORE型は非推奨になりました。かわりに、NETWORK_DATASTOREを使用してください。

URL_DATASTORE型は、インターネット上のファイル(HTTPまたはFTPを介してアクセス)に格納されているテキスト、およびローカル・ファイル・システムのファイル(ファイル・プロトコルを介してアクセス)に格納されているテキストに使用されます。NETWORK_DATASTOREに置き換えられ、ACLを使用した特定のサーバーへのアクセスが可能になります。この変更により、Oracle Textは、データベースからURLにアクセスするための標準的な操作およびセキュリティ・モデルにさらに近づいています。

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

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

3.2.7 形式列と文字セット列

ドキュメントが複合形式または複合文字セットで構成されている場合は、次の列を追加します。

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

  • 行ごとにドキュメントの文字セットを記録する文字セット列。

索引の作成時に、形式列または文字セット列の名前を、CREATE INDEXのPARAMETERS句に指定します。

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

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

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

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

関連項目:

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

3.2.9 DATASTOREタイプの要約

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

データストア・プリファレンス型を使用してテキストを格納する様々な方法を次に示します。

表3-2 DATASTOREタイプの要約

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

DIRECT_DATASTORE

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

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

MULTI_COLUMN_DATASTORE

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

DETAIL_DATASTORE

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

FILE_DATASTORE

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

ノート:

Oracle Database 19c以降、Oracle TextのFILE_DATASTORE型は非推奨になりました。かわりに、DIRECTORY_DATASTOREを使用してください。

DIRECTORY_DATASTORE

データはOracleディレクトリ・オブジェクトの外部に格納されます。ファイル名が、テキスト列の各行に1つずつ格納されます。

NESTED_DATASTORE

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

URL_DATASTORE

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

ノート:

Oracle Database 19c以降、Oracle TextのURL_DATASTORE型は非推奨になりました。かわりに、NETWORK_DATASTOREを使用してください。

NETWORK_DATASTORE

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

USER_DATASTORE

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

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

ノート:

トリガーとMULTI_COLUMN_DATASTOREまたはUSER_DATASTOREの問題をトラブルシューティングする場合は、My Oracle Supportドキュメント1613741.1を参照してください。

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

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

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

関連項目:

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

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

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

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

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

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

ドキュメントが索引付けされないようにする場合は、第3の形式列タイプIGNOREを使用できます。この列タイプは、たとえば、複合形式の表に日本語と英語のプレーン・テキスト・ドキュメントが含まれているものの、英語のドキュメントのみを処理する場合に便利です。この列タイプは、複合形式の表にプレーン・テキスト・ドキュメントとイメージが含まれている場合にも便利です。IGNOREはデータストア・レベルで実装されるため、すべてのフィルタとともに使用できます。

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

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

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

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

関連項目:

PROCEDURE_FILTER例

3.2.11 行のバイパス

テキスト表では、イメージ・データを含む行など、索引付けしない行をバイパスできます。行をバイパスするには、形式列を作成し、それをIGNOREに設定して、CREATE INDEX文のパラメータ句で形式列の名前を指定します。

3.2.12 ドキュメントの文字セット

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

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

文字セットの検出

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

複合文字セット列

ドキュメント・セットに文字セットが異なるドキュメント(JA16EUCやJA16SJISなど)が含まれている場合、ドキュメントを索引付けできます。たとえばCHARSET列を作成したとすると、この列に各行のドキュメント文字セット名を指定して、CREATE INDEX文のパラメータ句で列の名前を指定します。

3.3 ドキュメントの言語

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

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

  • MULTI_LEXER: 英語、ドイツ語および日本語など、異なる複数言語のドキュメントを含む表の索引付けのため。

  • USER_LEXER: 特定の言語を索引付けするための独自のレクサーを作成するため。

  • WORLD_LEXER: 異なる言語のドキュメントを含む表を索引付けし、またドキュメント内の言語を自動検出するため。

BASIC_LEXERプリファレンスを使用して、Oracle Textではほとんどの言語にレクサー・ソリューションを提供しています。日本語、中国語および韓国語の場合は、ユーザー定義のレクサー・インタフェースを使用して、独自のレクサー・ソリューションを作成できます。

  • BASIC_LEXER以外の言語機能: ユーザー定義のレクサー・インタフェースでは、索引付けおよび問合せ中にドキュメントを処理するPL/SQLまたはJavaのプロシージャを作成できます。ユーザー定義のレクサーを使用して、独自のテーマのレクサー・ソリューションまたは言語処理エンジンを作成することもできます。

  • 複数言語の列: 英語、ドイツ語および日本語で書かれたドキュメントを含む列など、異なる言語のドキュメントを含むテキスト列を索引付けできます。多言語列を索引付けするには、テキスト表に言語列を追加して、MULTI_LEXERプリファレンス型を使用します。また、マルチ言語列の索引付け時に、マルチ言語ストップリストを取り込むこともできます。

関連項目:

3.4 特殊文字

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

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

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

  • Printjoin文字: 索引付け時に英数字以外の文字をトークンに組み込む場合は、その文字をprintjoinとして定義します。たとえば、索引にハイフンやアンダースコアを組み込む場合は、その文字をprintjoinとして定義します。この場合、vice-presidentのようなワードは、vice-presidentとして索引付けされます。vicepresidentを問い合せても、vice-presidentは検索されません。

  • Skipjoin文字: 英数字以外の文字を含むトークンを使用して索引付けしない場合は、その文字をskipjoinとして定義します。たとえば、ハイフン(-)をskipjoinとして定義した場合、vice-presidentは、vicepresidentとして索引付けされます。vice-presidentを問い合せると、vice-presidentvicepresidentを含むドキュメントが検索されます。

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

関連項目:

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

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

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

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

関連項目:

BASIC_LEXERについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

3.6 正引き索引を使用したドキュメント・サービスのパフォーマンスの改善

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

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

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

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

  • CTX_DOC.SNIPPET

  • CTX_DOC.HIGHLIGHT

  • CTX_DOC.MARKUP

関連項目:

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

3.6.1 正引き索引の有効化

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

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

3.6.2 スニペットによる正引き索引

場合によっては、forward_indexオプションを使用すると、生成されたスニペットがforward_indexオプションを使用しない場合に生成されたスニペットと比べてわずかに異なる場合があります。一般的には違いは最小限でスニペットの品質には影響せず、通常はごくわずかな余分な空白や改行が入る程度です。

3.6.3 コピー保存による正引き索引

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

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

ドキュメントのコピーを$D表に格納するには、Oracle Textのコピー保存機能を使用します。save_copy属性またはsave_copy列パラメータを使用してこの機能を実装します。

  • save_copy基本記憶域属性:

    次の例では、BASIC_STORAGE記憶域タイプのsave_copy属性値をPLAINTEXTに設定します。この例では、Oracle Textは、ドキュメントで単語を検索するときに、$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 index文で$D表を作成し、ドキュメント1 ("hello world")を$D表にコピーしています。

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

save_copy属性または列パラメータには、次のいずれかの値を指定できます。

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

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

  • NONEの場合、ドキュメントのコピーは$D索引表に保存されません。SNIPPET、MARKUPまたはHIGHLIGHTプロシージャを使用しない場合でかつ索引付き列がVARCHAR2またはCLOBである場合、この値を指定します。

3.6.4 コピー保存を使用しない正引き索引

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

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

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

3.6.5 正引き索引なしのコピー保存

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

  • CTX_DOC.FILTER

  • CTX_DOC.GIST

  • CTX_DOC.THEMES

  • CTX_DOC.TOKENS

3.7 各国語別の機能

次の各国語別の機能を使用可能にできます。

3.7.1 テーマの索引付け

デフォルトでは、テーマは英語とフランス語で索引付けされ、ドキュメント・テーマ情報を索引付けできます。ドキュメント・テーマは、ドキュメント内で詳しく展開されている概念のことです。

ABOUT演算子でドキュメント・テーマを検索し、CTX_DOC PL/SQLパッケージを使用してプログラムでドキュメント・テーマを取得します。

テーマの索引付けは、BASIC_LEXERプリファレンス型のindex_themes属性を使用して、使用可能および使用禁止にします。

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

関連項目:

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

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

たとえば、スペイン語の基本文字索引では、energíaの問合せでは、energíaおよびenergiaが一致します。ただし、基本文字の索引付けを無効にしている場合、energíaの問合せはenergíaのみに一致します。

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

関連項目:

BASIC_LEXERについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

3.7.3 代替スペル

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

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

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

関連項目:

BASIC_LEXERについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

3.7.4 複合語

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

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

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

関連項目:

BASIC_LEXERについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

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

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

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

言語 レクサー

韓国語

KOREAN_MORPH_LEXER

日本語

JAPANESE_LEXERJAPANESE_VGRAM_LEXER

中国語

CHINESE_LEXER、CHINESE_VGRAM_LEXER

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

関連項目:

これらのレクサーについてさらに学習するには、『Oracle Textリファレンス』を参照してください。

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

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

関連項目:

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

3.8.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データベース(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.8.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.9 ファジー・マッチングおよびステミング

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

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

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

ファジー・マッチングはデフォルトのパラメータで有効になっており、ファジー・スコアおよび拡張される語句の最大数が指定されています。ファジー・スコアは、拡張されたワードが問合せワードにどれだけ一致するかという計測値です。索引時にはこのデフォルト・パラメータを変更できます。

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

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

関連項目:

ファジー・マッチングとステミングについてさらに学習するには、『Oracle Textリファレンス』を参照してください

3.9.1 BASIC_LEXERのindex_stemsの言語属性の値

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

  • ARABIC

  • BOKMAL

  • CROATIAN

  • DANISH

  • FINNISH

  • HEBREW

  • CATALAN

  • CZECH

  • DERIVATIONAL

  • DERIVATIONAL_NEW

  • DUTCH

  • DUTCH_NEW

  • ENGLISH

  • ENGLISH_NEW

  • FRENCH

  • FRENCH_NEW

  • GERMAN

  • GERMAN_NEW

  • GREEK

  • NYNORSK

  • PERSIAN

  • SERBIAN

  • SLOVAK

  • SLOVENIAN

  • THAI

  • HUNGARIAN

  • ITALIAN

  • ITALIAN_NEW

  • NONE

  • POLISH

  • PORTUGUESE

  • ROMANIAN

  • RUSSIAN

  • SPANISH

  • SPANISH_NEW

  • SWEDISH

  • TURKISH

3.9.2 AUTO_LEXERのindex_stemsの言語属性の値

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

  • ARABIC

  • BOKMAL

  • CROATIAN

  • DANISH

  • FINNISH

  • HEBREW

  • CATALAN

  • CZECH

  • DUTCH

  • ENGLISH

  • FRENCH

  • GERMAN

  • GREEK

  • HUNGARIAN

  • ITALIAN

  • JAPANESE

  • NYNORSK

  • PERSIAN

  • SERBIAN

  • SLOVAK

  • SLOVENIAN

  • THAI

  • KOREAN

  • POLISH

  • PORTUGUESE

  • ROMANIAN

  • RUSSIAN

  • SIMPLIFIED CHINESE

  • SPANISH

  • SWEDISH

  • TRADITIONAL CHINESE

  • TURKISH

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

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

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

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

関連項目:

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

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

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

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

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

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

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

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

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

  • マルチ言語ストップリスト: 言語固有のストップワードを保持するマルチ言語のストップリストを作成します。このストップリストは、英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするためにMULTI_LEXERを使用している場合に有効です。索引作成時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時には、マルチレクサーを使用してアクティブなレクサーが特定されるのと同様に、セッション言語の設定によってアクティブなストップワードが特定されます。

3.13 索引のパフォーマンス

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

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

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

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

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

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