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、プレーン・テキストといった形式の大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。 様々な方法で索引をカスタマイズできます。 この索引のタイプは、元表への挿入、更新および削除操作の後に |
サポートされているパラメータ: 索引パーティション句の形式列、文字セット列および言語列 |
|
すべてのドキュメント・サービスと問合せサービスがサポートされています。 パーティション・テキスト表の索引付けがサポートされています。
|
|
|
テキストが、MS WordやHTML、プレーン・テキストといった形式の大量のまとまったドキュメントで構成されている場合、テキスト検索アプリケーションを作成するには、この索引を使用します。 様々な方法で索引をカスタマイズできます。 この索引のタイプは、元表への挿入、更新および削除操作の後に |
サポートされているパラメータ: 索引パーティション句の形式列、文字セット列および言語列 |
|
すべてのドキュメント・サービスと問合せサービスがサポートされています。 パーティション・テキスト表の索引付けがサポートされています。 索引記憶域表について、シャードされたデータベースおよびシステム管理パーティション化がサポートされています。 |
|
|
この索引は、小さいドキュメントやテキスト断片の複合問合せのパフォーマンスを向上させるために使用します。複合問合せのパフォーマンス向上のためには、元表に、品目名や価格、説明といったその他の列を含めます。 この索引タイプはトランザクションです。挿入や更新、削除が元表に対して実行された後、自動的に更新されます。 |
未サポート: 形式列、文字セット列および言語列 表と索引のパーティション化。 |
テーマ問合せがサポートされています。 |
この索引は大きいため、
|
|
|
ドキュメント分類アプリケーションまたはルーティング・アプリケーションの作成には、この索引を使用します。この索引は、分類またはルーティングの条件が定義されている問合せの表に対して作成します。 |
「CTXRULEパラメータおよび制限事項」を参照してください。 |
|
単純な分類またはルールベースの分類を使用してドキュメント分類アプリケーションを作成するには、 |
Oracle Textの索引は、Oracle Databaseのドメイン索引です。問合せアプリケーションを作成するには、テキスト列と構造化データ列の組合せを持つCONTEXTタイプの索引を作成し、CONTAINS演算子を使用してその索引を問い合せます。
索引は、移入済のテキスト表から作成します。問合せアプリケーションでは、表にテキストまたは格納済テキストの場所へのポインタが含まれている必要があります。テキストは通常ドキュメントの集まりですが、小さいテキスト断片の場合もあります。
ノート:
XMLデータを使用する新しいアプリケーションを作成する場合は、CTXRULEではなくXMLIndexを使用することをお薦めします。
Oracle Text索引は、標準SQLを使用して、Oracle Databaseの拡張索引の1タイプとして作成します。つまり、Oracle Textの索引は、Oracle Databaseの索引と同じように機能します。この索引には参照名があり、標準SQL文を使用して操作できます。
Oracle Textの索引を作成するメリットは、CONTAINS、CATSEARCHおよびMATCHESなどの演算子を使用したテキスト問合せの応答時間が短縮されることです。これらの演算子は、それぞれ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 データストア・オブジェクト
ストリームはデータストアから始まり、データストアでは、指定したデータストア・プリファレンスに従って、システムに格納されているとおりにドキュメントが読み込まれます。たとえば、データストアをDIRECTORY_DATASTOREとして定義した場合、ストリームはまずOracleディレクトリ・オブジェクトからファイルを読み取ります。ドキュメントは、インターネット上またはOracle Databaseに格納することもできます。ファイルが物理的にどこに存在していても、Oracle Databaseのテキスト表はそのファイルを指している必要があります。
3.1.3.3 セクショナ・オブジェクト
フィルタ処理後、マークアップされたテキストはセクショナを通過し、ストリームはテキスト情報とセクション情報に分割されます。セクション情報には、テキスト・ストリーム内でセクションが開始する場所と終了する場所の情報が含まれています。抽出されるセクションのタイプは、セクション・グループのタイプによって決定されます。
テキストはレクサーに渡されます。セクション情報は、直接索引付けエンジンに渡され、後で使用されます。
3.1.3.4 レクサー・オブジェクト
Oracle Textのレクサー・タイプのいずれかを使用してレクサー・プリファレンスを作成し、索引付けをするテキストの言語を指定します。レクサーは、使用言語に基づいて、テキストをトークンに分解します。通常、分解されたトークンはワードです。レクサーは、トークンの抽出に、レクサー・プリファレンスに定義されたパラメータを使用します。これらのパラメータには、トークンを分割する文字(空白など)の定義が含まれています。パラメータには、テキストをすべて大文字に変換するか、大/小文字混在のままにしておくかも含まれます。
テーマの索引付けを有効にすると、レクサーはテキストを分析してテーマ・トークンを作成し、索引付けを行います。
3.1.4 索引付き列の更新について
Oracle Database 12cリリース2 (12.2)より前のリリースでは、Oracle Text索引に基づく列に更新があった場合、インデックスが同期されるまでドキュメントの検索操作は実行できなくなります。ユーザーの問合せではこのドキュメントの検索を実行できません。Oracle Database 12cリリース2 (12.2)より、索引の同期をすぐに実行せずに、更新後にドキュメントを検索可能にする必要があることを指定できるようになりました。索引の同期前に、問合せで古い索引エントリを使用して古いドキュメントの内容をフェッチします。索引の同期化後、ユーザー問合せで更新済ドキュメントの内容をフェッチします。
索引のASYNCHRONOUS_UPDATEオプションを使用して、更新後にドキュメントの古い内容を維持し、この索引を使用してユーザーの問合せに回答できます。
関連項目:
-
『Oracle Textリファレンス』の
ALTER INDEXに関する説明 -
『Oracle Textリファレンス』の
CREATE INDEXに関する説明
3.1.5 パーティション表とパーティション索引
パーティション・テキスト表にCONTEXTパーティション索引を作成する際には、範囲により表をパーティション化する必要があります。ハッシュ・パーティション、コンポジット・パーティションおよびリスト・パーティションは、サポートされていません。
日付でデータをパーティション化したパーティション・テキスト表を作成できます。たとえば、使用しているアプリケーションで日付付きのニュース記事の大規模なライブラリをメンテナンスしている場合は、月別または年度別に情報をパーティション化できます。パーティション化によって、問合せ、挿入、更新および削除、ならびにバックアップとリカバリの操作を単一のパーティションに対して行うことができるため、大規模データベースが管理しやすくなります。
複数の表セットを持つローカルの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を使用した挿入、更新および削除の操作には影響せず、問合せのパフォーマンスへの影響は最小限です。
パラレル索引付けは、初期の索引付け時間を短縮するため、次の状況で役立ちます。
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 テキスト表へのテキストの格納
CONTEXTデータ記憶域の場合、次のデータストア・タイプを使用してテキスト表にドキュメントを格納します。
-
DIRECT_DATASTORE:1つの列 -
MULTI_COLUMN_DATASTORE:複数の列(Oracle Textでは、各行に1つのドキュメントになるように、列を連結して仮想ドキュメントにします。) -
DETAIL_DATASTORE:マスター/詳細関係(1つのドキュメントを複数の行に格納します。) -
NESTED_DATASTORE:ネストした表
Oracle Textでは、XMLドキュメントの格納に使用するXMLTypeデータ型の索引付けをサポートしています。
CTXCATデータ記憶域では、名前や説明、アドレスといった短いテキスト断片を多数の列に格納できます。CTXCAT索引は、複合問合せのパフォーマンスを改善します。
3.2.4 ファイルのパス名の格納
テキスト表には、ファイル・システムに格納されているファイルのパス名を格納します。索引付け時には、FILE_DATASTOREプリファレンス型を使用します。このデータ格納方法は、CONTEXT索引でのみサポートされています。
ノート:
Oracle Database 20c以降、Oracle TextのFILE_DATASTORE型は非推奨になりました。かわりに、DIRECTORY_DATASTOREを使用してください。
3.2.5 URLの格納
URL名を格納してWebサイトを索引付けします。索引付け時には、URL_DATASTOREプリファレンス型を使用します。このデータ格納方法は、CONTEXT索引でのみサポートされています。
ノート:
Oracle Database 20c以降、Oracle TextのURL_DATASTORE型は非推奨になりました。かわりに、NETWORK_DATASTOREを使用してください。
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つの索引に使用する場合、ニーズにあわせて索引を構成できない場合があります。スタイルシート情報が索引に追加されないようにすることはできません。
3.2.9 DATASTOREタイプの要約
CREATE INDEXを使用するときに、データストア・プリファレンスを使用する場所を指定します。使用しているアプリケーションに従って適切なデータストアを使用します。
表3-2は、データストア・プリファレンス型を使用してテキストを格納するすべての方法を説明しています。
表3-2 DATASTOREタイプの要約
| データストア・タイプ | 使用する状況 |
|---|---|
|
|
データをテキスト列に内部的に格納する場合。各行は単一のドキュメントとして索引付けされます。 テキスト列には、 |
|
|
データをテキスト表の複数の列に格納する場合。列が連結され、各行に1つずつ仮想ドキュメントが作成されます。 |
|
|
データをテキスト列に内部的に格納する場合。ドキュメントがディテール表のテキスト列にある1つ以上の行で構成され、ヘッダー情報はマスター表に格納されます。 |
|
|
データをオペレーティング・システム・ファイルに外部的に格納する場合。ファイル名が、テキスト列の各行に1つずつ格納されます。 |
|
|
データはOracleディレクトリ・オブジェクトの外部に格納されます。ファイル名が、テキスト列の各行に1つずつ格納されます。 |
|
|
データをネストした表に格納する場合。 |
|
|
データをイントラネットまたはインターネット上にあるファイルに外部的に格納する場合。URLはテキスト列に格納されます。 |
|
|
データをイントラネットまたはインターネット上にあるファイルに外部的に格納する場合。URLはテキスト列に格納されます。 |
|
|
ドキュメントが、索引付け時にユーザー定義ストアド・プロシージャによって合成されます。 |
ノート:
-
Oracle Database 20c以降、Oracle Textの
FILE_DATASTORE型は非推奨になりました。かわりに、DIRECTORY_DATASTOREを使用してください。 -
Oracle Database 20c以降、Oracle Textの
URL_DATASTORE型は非推奨になりました。かわりに、NETWORK_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)を参照してください。
関連項目:
-
データストア・タイプの詳細は、Oracle Textリファレンスを参照してください
-
「データストア例」
3.2.10 ドキュメント形式とフィルタ処理
Microsoft WordやPDFなどの書式設定されたドキュメントを索引付けするには、テキストにフィルタ処理する必要があります。FILTERプリファレンス・タイプにより、システムで使用されるフィルタ処理のタイプが決まります。デフォルトでは、ドキュメントの形式が自動的に検出され、それらをテキストにフィルタリングするAUTO_FILTERフィルタ型が使用されます。
Oracle Textでは、ほとんどの形式を索引付けできます。また、複合形式のドキュメントを含む列も索引付けできます。
関連項目:
AUTO_FILTERでサポートされているドキュメントとグラフィック形式の詳細は、『Oracle Textリファレンス』を参照してください
3.2.10.1 フィルタ処理が不要なHTML
3.2.10.2 複合形式列のフィルタ処理
Microsoft Word、プレーン・テキストおよびHTMLのドキュメントを含む列などの複合形式列の場合は、テキスト表に形式列を組み込んで、プレーン・テキストやHTMLのフィルタ処理をバイパスできます。形式列で、各行にTEXTまたはBINARYをタグ付けします。TEXTタグが付けられている行はフィルタ処理されません。
HTMLおよびプレーン・テキスト行はTEXTとしてタグ付けし、Microsoft Word行はBINARYとしてタグ付けします。形式列はCREATE INDEXパラメータ句に指定します。
ドキュメントが索引付けされないようにする場合は、第3の形式列タイプIGNOREを使用できます。この列タイプは、たとえば、複合形式の表には日本語と英語のプレーン・テキスト・ドキュメントが含まれているものの、英語のドキュメントのみを処理するという場合に便利です。この列タイプは、複合形式の表にプレーン・テキスト・ドキュメントとイメージが含まれている場合にも便利です。IGNOREはデータストア・レベルで実装されるため、すべてのフィルタとともに使用できます。
3.2.11 行のバイパス
テキスト表では、イメージ・データを含む行など、索引付けしない行をバイパスできます。行をバイパスするには、形式列を作成し、それをIGNOREに設定して、CREATE INDEX文のパラメータ句で形式列の名前を指定します。
3.2.12 ドキュメントの文字セット
索引付けエンジンは、フィルタ処理済のテキストを、データベース文字セットであるとみなします。AUTO_FILTERフィルタ型を使用すると、書式設定されたドキュメントは、データベース文字セットでテキストに変換されます。
ソースがテキストで、ドキュメント文字セットがデータベース文字セットでない場合は、AUTO_FILTERフィルタ型を使用して索引付けのためにテキストを変換できます。
文字セットの検出
CHARSET列がAUTOに設定されている場合、AUTO_FILTERフィルタは、ドキュメントの文字セットを検出し、相違点がある場合は、検出された文字セットをデータベース文字セットに変換します。
3.3 ドキュメントの言語
Oracle Textでは、ほとんどの言語を索引付けできます。デフォルトでは、索引付けするテキストの言語は、データベース設定で指定した言語であるとみなされます。ドキュメントの言語によって、次のいずれかのレクサー型を使用します。
-
BASIC_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-presidentとvicepresidentを含むドキュメントが検索されます。 -
その他の文字: その他の文字は、トークン分割(startjoin、endjoin、whitespace)、句読点識別(punctuation)、数値トークン化(numjoin)、改行後のワード継続(continuation)などの別のトークン化動作を制御する文字として指定できます。これらの文字のカテゴリには、変更可能なデフォルトがあります。
関連項目:
-
BASIC_LEXER型の詳細は、『Oracle Textリファレンス』を参照してください。
3.5 大/小文字を区別した索引付けおよび問合せ
デフォルトでは、すべてのテキスト・トークンが大文字に変換された後で索引付けされます。つまり、大/小文字を区別しない問合せになります。たとえば、cat、CATおよびCatの問合せは同じドキュメントを返します。
デフォルトを変更し、索引レコード・トークンをテキストの表示どおりに設定できます。大/小文字を区別する索引を作成した場合は、ドキュメントに一致するように大/小文字を正確に区別して問合せを指定する必要があります。たとえば、ドキュメントにCatが含まれている場合は、このドキュメントに一致するように、問合せをCatと指定する必要があります。catまたはCATと指定すると、ドキュメントは戻りません。
大/小文字を区別する索引付けを使用可能または使用禁止にするには、BASIC_LEXERプリファレンスのmixed_case属性を使用します。
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.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属性を使用して、使用可能および使用禁止にします。
3.7.3 代替スペル
ドイツ語、デンマーク語およびスウェーデン語などの言語には、複数のスペルが容認されているワードがあります。たとえば、ドイツ語では、äという文字は、aeという文字で代替できます。ae文字は、代替書式と呼ばれます。
これらの言語の場合、デフォルトでは代替書式のワードが索引付けされます。問合せ語句もそれぞれの代替書式に変換されます。その結果、これらのワードをいずれのスペルでも問い合せることができます。
言語の代替スペルは、BASIC_LEXERプリファレンス型のalternate_spelling属性を使用して、使用可能および使用禁止にします。
3.7.4 複合語
ドイツ語とオランダ語のテキストには、複合語が含まれています。これらの言語の場合、デフォルトではコンポジット索引が作成されます。その結果、ある語句を問い合せると、その語句を複合語の要素として含むワードが戻ります。
たとえば、ドイツ語で、語句Bahnhof(列車の駅)を問い合せると、Bahnhofを含むドキュメント、あるいはHauptbahnhof、NordbahnhofまたはOstbahnhofなど、Bahnhofが複合語の要素として含まれているワードを含むドキュメントが戻ります。
コンポジット索引は、BASIC_LEXERプリファレンス型のcomposite属性を使用して、使用可能および使用禁止にできます。
3.8 エンティティ抽出およびCTX_ENTITYについて
エンティティ抽出とは、テキスト内の名前付きエンティティを識別および抽出することです。エンティティは、主に名前や場所、時間、コード化された文字列(電話番号や郵便番号など)、割合、金額といった名詞および名詞句です。CTX_ENTITYパッケージは、組込み辞書および英語テキストのルールのセットを使用して、エンティティ抽出を実装します。英語およびその他の言語の機能をユーザー提供のアドオン辞書およびルール・セットにより拡張できます。
関連項目:
-
『Oracle Textリファレンス』の
CTX_ENTITYパッケージに関する項 -
『Oracle Textリファレンス』のエンティティ抽出ユーザー辞書ローダー(ctxload)に関する項
この項には次の例が含まれます:
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%
そのため、エンティティの新しいタイプと、式のいずれかに一致する正規表現を作成する必要があります。
exec 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>Positive Gain</type>' ||
'</rule>');
この場合は、ポリシーをCTX_ENTITY.COMPILEでコンパイルする必要があります。
ctx_entity.compile('mypolicy');
これにより、従来どおりそれを使用できます。
ctx_entity.extract('mypolicy', mydoc, null, myresults)
次に(短縮した)出力を示します。
<entities>
...
<entity id="6" offset="72" length="18" source="UserRule">
<text>climbed by over 5%</text>
<type>Positive Gain</type>
</entity>
</entities>
最後に、別のユーザー定義のエンティティを追加しますが、この場合は辞書を使用しています。「Dow Jones Industrial Average」をタイプIndexのエンティティとして認識するとします。「S&P 500」も追加します。これを実行するには、次を含むXMLファイルを作成します。
<dictionary>
<entities>
<entity>
<value>dow jones industrial average</value>
<type>Index</type>
</entity>
<entity>
<value>S&P 500</value>
<type>Index</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.9 ファジー・マッチングおよびステミング
問合せでファジー・マッチングを使用すると、類似するスペルのワードが一致します。Oracle Textでは、複数の言語用のエンティティ抽出を提供しています。
ステミングを使用すると、同じ語幹を持つワードが一致します。たとえば、$speakを問い合せると、speak、speaks、spokeおよびspokenを含むすべてのドキュメントに検索が拡張されます。
ファジー・マッチングとステミングは、Oracle Textが使用言語に対してこの機能をサポートしている場合は、索引で自動的に使用可能になります。
ファジー・マッチングはデフォルトのパラメータで有効になっており、ファジー・スコアおよび拡張される語句の最大数が指定されています。ファジー・スコアは、拡張されたワードが問合せワードにどれだけ一致するかという計測値です。索引時にはこのデフォルト・パラメータを変更できます。
ドキュメントの言語を自動検出して必要な変換を実行するには、AUTO_LEXERのindex_stems属性を使用可能にして、ステム索引を作成します。ドキュメント言語に対応するステマーを使用し、常にドキュメント再コールを最大化するようステマーを構成します。また、ドイツ語、フィンランド語、スウェーデン語およびオランダ語のような言語の複合語については、index_stemsをYESに設定すると、ドキュメントにおいて複合語ステミングが自動的に実行されます。複合語は常に、それを構成する語に分割されます。
ステミング問合せのパフォーマンスを改善するには、BASIC_LEXERのindex_stems属性を使用可能にして、ステミング索引を作成します
関連項目:
ファジー・マッチングとステミングの詳細は、『Oracle Textリファレンス』を参照してください
3.9.1 BASIC_LEXERのindex_stemsの言語属性の値
BASIC_LEXERのindex_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_LEXERのindex_stems属性の値はTRUEまたはFALSEです。AUTO_LEXERのindex_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 ワイルド・カード問合せのパフォーマンスの向上
ワイルド・カード問合せを使用すると、%ing、cos%または%benz%のような後方一致、前方一致および中間一致の各問合せを入力できます。通常の索引付けでは、これらの問合せが大きなワード・リストに拡張されて問合せパフォーマンスが低下することがあります。
ワイルド・カード問合せでは、トークン・プリフィックスとサブストリングが索引に記録されていると、応答時間が短縮されます。
デフォルトでは、トークン・プリフィックスとサブストリングは、Oracle Textの索引に記録されません。使用している問合せアプリケーションがワイルド・カード問合せを頻繁に使用する場合は、トークン・プリフィックスとサブストリングの索引付けを考慮してください。この索引付けを実行するには、wordlistプリファレンス型を使用します。ワイルド・カード検索のパフォーマンスを向上させるために必要なトレードオフは、索引が大きくなることです。
関連項目:
-
『Oracle Textリファレンス』のワイルド・カード問合せパフォーマンスを受入れ可能な制限内に保持する方法に関する説明
3.11 ドキュメントのセクション検索
HTMLやXMLのように、内部構造を持つドキュメントの場合は、ドキュメントのセクションを定義および索引付けできます。ドキュメントのセクションを索引付けすることにより、問合せの範囲を事前定義したセクションに絞り込むことができます。たとえば、問合せに対して、Headingsとして定義したセクション内の語句dogを含むドキュメントすべてを検索するように指定できます。
索引付けする前に、セクションを定義し、セクション・グループ・プリファレンスを使用して指定する必要があります。
Oracle Textには、システム定義のHTMLおよびXML用のセクションが定義されたセクション・グループが用意されています。また、索引付け時に、XMLドキュメントからセクションをシステムで自動的に作成するように指定できます。
3.12 ストップワードとストップテーマ
ストップワードは、索引付け対象外とするワードです。ストップワードとは通常、特定の言語で情報量の低いワードを指します。英語では、thisやthatのようなワードです。
デフォルトでは、特定言語の索引付け用にストップリストが用意されています。CTX_DDLパッケージを使用してこのリストを変更したり独自のリストを作成します。ストップリストは、CREATE INDEX文のパラメータ文字列に指定します。
ストップテーマは、テーマ索引またはテーマの構成要素に使用できないワードです。ストップテーマは、CTX_DDLパッケージを使用して追加します。
-
言語検出とストップリスト: 問合せ時、問合せの言語は、問合せテンプレートまたはセッション言語(問合せテンプレートによって言語が指定されていない場合)から継承されます。
-
マルチ言語ストップリスト: 言語固有のストップワードを保持するマルチ言語のストップリストを作成します。このストップリストは、英語、ドイツ語および日本語などの異なる言語のドキュメントを含む表を索引付けするために
MULTI_LEXERを使用している場合に有効です。索引作成時に、各ドキュメントの言語列が調べられ、その言語のストップワードのみが排除されます。問合せ時には、マルチレクサーを使用してアクティブなレクサーが特定されるのと同様に、セッション言語の設定によってアクティブなストップワードが特定されます。
3.14 問合せのパフォーマンスとラージ・オブジェクト(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索引にソートを入れるかどうかを決定できます。
3.16 インメモリー全文検索とJSON全文検索
全文ドキュメントまたはJSONドキュメントを格納する基の列がインメモリー全文検索に対応している場合、CONTAINS()およびJSON_TEXTCONTAINS()を使用する問合せをSQL述語で評価できます。
通常、テキスト列に対して全文(キーワード)検索を使用するには、その列にOracle Text索引を作成する必要があります。JSONデータについては、JSON検索索引を作成します。Oracle Databaseリリース20c以降では、索引を作成するかわりに、インメモリー列形式を使用して、列をメモリーにロードできます。これには索引は必要ありませんが、インメモリー手法を使用してテキストを高速でスキャンできます。これは、テキスト検索と構造化検索を結合した問合せを他のインメモリー列で実行する場合に特に便利です。
INMEMORY TEXT句を使用して、表の作成時にメモリーにロードする必要がある列を宣言する必要があります。これらの列は、Oracle TextまたはJSON検索索引で使用されるものと同じCONTAINS()およびJSON_TEXTCONTAINS()関数を使用して検索できますが、使用できる問合せ演算子のタイプには制限があります。したがって、インメモリーは、Oracle TextまたはJSON検索索引にかわるものではなく、制限が問題であると見なされない場合に必要に応じて使用できる代替手段です。
Oracle Text索引がある列にINMEMORY TEXT句を使用することもできます。この状況では、オプティマイザによって問合せの最適な実行方法が選択されます。列にOracle Text索引がある場合は、その問合せで常にOracle Text索引が使用されます。Oracle Text索引がない場合は、オプティマイザによって、その表がインメモリーとしてマークされているかどうかがチェックされます。表がインメモリーとしてマークされている場合は、その問合せにインメモリー評価が使用されます。Oracle Text索引がなく、表がインメモリーとしてマークされていない場合は、「DRG-10599: 列は索引付けされていません」というエラーが戻されます。
サポートされているデータ型
-
CHAR -
VARCHAR2 -
CLOB -
BLOB -
JSON
CTX_DDL.CREATE_POLICYプロシージャで作成されたカスタム索引付けポリシーがサポートされています。列のデータ型がJSONの場合、その列で次のいずれかを使用すると、その列のインメモリー全文バージョンで、JSON_TEXTCONTAINS()を使用したパス対応検索が可能です。
-
デフォルト・ポリシー
-
JSON_ENABLED属性がTRUEに設定されたPATH_SECTION_GROUPを使用するカスタム・ポリシー
使用方法
INMEMORY TEXT句を使用して、インメモリー全文検索列を指定します。CREATE TABLE文とALTER TABLE文の両方で、INMEMORY TEXT句がサポートされています。PRIORITY副句を使用して、オブジェクトの移入順序を制御できます。デフォルトの優先度はNONEです。MEMCOMPRESS副句は、INMEMORY TEXTでは無効です。次のいずれかの形式を使用して、INMEMORY TEXT句を含むCREATE TABLE文またはALTER TABLE文を指定します。
-
INMEMORY TEXT (col1, col2, …) -
INMEMORY TEXT (col1 USING policy1, col2 USING policy2, …)
制限事項
-
BFILE、XMLTypeおよびURITypeデータ型は、インメモリー全文検索列ではサポートされていません。 -
テキスト列の問合せについては、次のOracle Text問合せ演算子のみがサポートされています。
-
AND -
OR -
NOT -
NEAR
-
-
JSON列の問合せについては、次のOracle Text問合せ演算子もサポートされています。
-
HASPATH -
INPATH
-
-
CTX_DDL.CREATE_POLICYプロシージャでは、filterパラメータおよびwordlistパラメータはサポートされていません。section_groupパラメータは、NULL_SECTION_GROUP(デフォルト)、またはJSON_ENABLEがTRUEに設定されたPATH_SECTION_GROUP(JSONパス対応検索の場合)のいずれかに設定する必要があります。lexerパラメータは、BASIC_LEXERレクサー・タイプでのみサポートされています。 -
単一の
ALTER TABLE文で、インメモリー全文検索を無効化および再有効化することはできません。インメモリー全文検索を一度無効にしてから、再び有効にする必要があります。 -
JSON対応索引付けポリシーはJSON列でのみサポートされます。
-
カスタムの索引付けポリシーは、インメモリー全文検索およびJSONインメモリー全文検索にのみ使用できます。また、JSON対応索引付けポリシーは
IS JSONチェック制約があるテキスト列には使用できません。
例
例3-1 インメモリー全文検索の使用方法
次の例では、CONTAINS演算子を使用してインメモリー全文検索対応の列から問い合せる方法を示します。また、テキスト検索のカスタム・ポリシーを作成し、列に適用する方法も示します。
メモリーにロードされるtext_docsという名前の表を作成し、docという名前のインメモリー全文検索列を移入します。
CREATE TABLE text_docs(id NUMBER, docCreationTime DATE, doc CLOB) INMEMORY INMEMORY TEXT(doc);条件でCONTAINS演算子を使用して問い合せます。
SELECT id FROM text_docs WHERE docCreationTime > to_date('2014-01-01', 'YYYY-MM-DD')
AND CONTAINS(doc, 'in memory text processing');テキスト検索のカスタム・ポリシーを作成し、doc列に適用することもできます。
EXEC CTX_DDL.CREATE_POLICY('first_policy');
ALTER TABLE text_docs INMEMORY TEXT (doc USING 'first_policy');既存のカスタム・ポリシーを置き換えるには、NO INMEMORY TEXT句を使用してインメモリー全文検索を無効にした後、INMEMORY TEXT句を使用してインメモリー全文検索を有効にします。
EXEC CTX_DDL.CREATE_POLICY('second_policy');
ALTER TABLE text_docs NO INMEMORY TEXT(doc);
ALTER TABLE text_docs INMEMORY TEXT (doc USING 'second_policy');例3-2 JSONインメモリー全文検索の使用方法
次の例では、JSON_TEXTCONTAINS演算子を使用してインメモリー全文検索対応の列から問い合せる方法を示します。
メモリーにロードされるjson_docsという名前の表を作成し、docという名前のインメモリー全文検索列を移入します。
CREATE TABLE json_docs(id NUMBER, docCreationTime DATE, doc JSON) INMEMORY INMEMORY TEXT(doc);条件でJSON_TEXTCONTAINS演算子を使用して問い合せます。
SELECT id FROM json_docs WHERE docCreationTime > to_date('2014-01-01', 'YYYY-MM-DD')
AND JSON_TEXTCONTAINS(doc, '$.abstract', 'in memory text processing');例3-3 全文検索でのインメモリー移入の優先度の設定
次の例では、PRIORITY副句を使用してデータ移入の優先度レベルを設定する方法を示します。
メモリーにロードされるprioritized_docsという名前の表を作成し、PRIORITY副句を使用して優先度レベルを設定します。
CREATE TABLE prioritized_docs(id NUMBER, docCreationTime DATE, doc CLOB, json_doc CHECK(json_doc IS json))
INMEMORY PRIORITY CRITICAL INMEMORY TEXT(doc, json_doc);関連項目:
- インメモリー全文列の詳細
-
JSON_TEXTCONTAINS演算子を使用したインメモリー全文検索の詳細は、Oracle Database JSON開発者ガイドを参照してください

