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開発者ガイドを参照してください