Oracle® Text

アプリケーション開発者ガイド

11gリリース2(11.2)

B61358-04(原本部品番号:E24435-03)

2014年2月

Oracleアプリケーション開発者ガイド, 11gリリース2(11.2)

B61358-04

Copyright © 2004, 2014, Oracle and/or its affiliates.All rights reserved.

原本著者: Cathy Shea

原本協力者: Drew Adams、Edwin Balthes、Rajesh Bhatiya、Aleksandra Czarlinska、Mohammad Faisal、Roger Ford、Rahul Kadwe、George Krupka、Paul Lane、Colin McGregor、Padmaja Potineni、Yiming Qi、Sanoop Sethumadhavan、Asha Tarachandani、Gaurav Yadav

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 Oracle Textのアプリケーション開発の概要

- 1.1 Oracle Textの概要

- 1.2 ドキュメント・コレクション・アプリケーション

- 1.2.1 テキスト問合せアプリケーションのフローチャート

- 1.3 カタログ情報アプリケーション

- 1.3.1 カタログ問合せアプリケーションのフローチャート

- 1.4 ドキュメント分類アプリケーション

- 1.5 XML検索アプリケーション

- 1.5.1 Oracle Textの使用

- 1.5.2 Oracle XML DBのフレームワークの使用

- 1.5.3 Oracle Textの機能とOracle XML DBの結合

- 1.5.3.1 Text-on-XMLメソッドの使用

- 1.5.3.2 Text-on-XMLメソッドの使用

2 Oracle Textの使用の開始

- 2.1 Oracle Textの使用の開始の概要

- 2.2 Oracle Textユーザーの作成

- 2.3 問合せアプリケーションのクイック・ツアー

- 2.3.1 Oracle Text Wizardを使用したWebアプリケーションの作成

- 2.3.1.1 Oracle JDeveloper

- 2.3.1.2 Oracle Text Wizardのアドイン

- 2.3.1.3 Oracle Text Wizardの説明

- 2.4 カタログ・アプリケーションのクイック・ツアー

- 2.5 分類アプリケーションのクイック・ツアー

- 2.5.1 分類アプリケーションの作成手順

3 Oracle Textでの索引付け

- 3.1 Oracle Textの索引の概要

- 3.1.1 Oracle Textの索引タイプ

- 3.1.2 Oracle TextのCONTEXT索引の構造

- 3.1.2.1 マージ済のワードとテーマ索引

- 3.1.3 Oracle Textの索引付け処理

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

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

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

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

- 3.1.3.5 索引付けエンジン

- 3.1.4 パーティション表とパーティション索引

- 3.1.4.1 パーティション表の問合せ

- 3.1.5 オンラインでの索引の作成

- 3.1.6 パラレル索引付け

- 3.1.7 索引付けとビュー

- 3.2 索引付け時の考慮事項

- 3.2.1 テキストの場所

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

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

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

- 3.2.1.4 URLの格納

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

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

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

- 3.2.1.8 DATASTOREタイプの要約

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

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

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

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

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

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

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

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

- 3.2.5 ドキュメントの言語

- 3.2.5.1 BASIC_LEXER以外の言語機能

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

- 3.2.6 特殊文字の索引付け

- 3.2.6.1 Printjoin文字

- 3.2.6.2 skipjoin文字

- 3.2.6.3 その他の文字

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

- 3.2.8 各国語別の機能

- 3.2.8.1 テーマの索引付け

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

- 3.2.8.3 代替スペル

- 3.2.8.4 複合語

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

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

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

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

- 3.2.12 ストップワードとストップテーマ

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

- 3.2.12.2 マルチ言語のストップリスト

- 3.2.13 索引のパフォーマンス

- 3.2.14 問合せのパフォーマンスとLOB列の格納

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

- 3.3 Oracle Textの索引の作成

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

- 3.3.2 プリファレンスの作成

- 3.3.2.1 データストア例

- 3.3.2.2 NULL_FILTER例: HTMLドキュメントの索引付け

- 3.3.2.3 PROCEDURE_FILTER例

- 3.3.2.4 BASIC_LEXER例: printjoin文字の設定

- 3.3.2.5 MULTI_LEXER例: マルチ言語表の索引付け

- 3.3.2.6 BASIC_WORDLIST例: サブストリングとプリフィックスの索引付けの使用可能化

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

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

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

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

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

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

- 3.3.5 CONTEXT索引の作成

- 3.3.5.1 CONTEXT索引およびDML

- 3.3.5.2 デフォルトのCONTEXT索引例

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

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

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

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

- 3.3.6 CTXCAT索引の作成

- 3.3.6.1 CTXCAT索引およびDML

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

- 3.3.6.3 CTXCATサブ索引の作成

- 3.3.6.4 CTXCAT索引の作成

- 3.3.7 CTXRULE索引の作成

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

- 3.3.7.2 手順2: CTXRULE索引の作成

- 3.3.7.3 手順3: ドキュメントの分類

- 3.4 Oracle Textの索引のメンテナンス

- 3.4.1 索引エラーの表示

- 3.4.2 索引の削除

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

- 3.4.4 索引の再作成

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

- 3.4.5 索引の再構築

- 3.4.6 プリファレンスの削除

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

- 3.5.1 保留中のDMLの表示

- 3.5.2 索引の同期化

- 3.5.2.1 例

- 3.5.2.2 SYNC_INDEXのmaxtimeパラメータ

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

- 3.5.3 索引の最適化

- 3.5.3.1 CONTEXT索引の構造

- 3.5.3.2 索引の断片化

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

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

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

- 3.5.3.6 例: 索引の最適化

4 Oracle Textでの問合せ

- 4.1 問合せの概要

- 4.1.1 CONTAINSによる問合せ

- 4.1.1.1 CONTAINS SQL例

- 4.1.1.2 CONTAINS PL/SQL例

- 4.1.1.3 CONTAINSによる構造化問合せ

- 4.1.2 CATSEARCHによる問合せ

- 4.1.2.1 CATSEARCH SQL問合せ

- 4.1.2.2 CATSEARCH例

- 4.1.3 MATCHESによる問合せ

- 4.1.3.1 MATCHES SQL問合せ

- 4.1.3.2 MATCHES PL/SQL例

- 4.1.4 ワード問合せと句問合せ

- 4.1.4.1 CONTAINS句問合せ

- 4.1.4.2 CATSEARCH句問合せ

- 4.1.5 ストップワードの問合せ

- 4.1.6 ABOUT問合せおよびテーマ

- 4.1.6.1 ストップテーマの問合せ

- 4.1.7 問合せ式

- 4.1.7.1 CONTAINS演算子

- 4.1.7.2 CATSEARCH演算子

- 4.1.7.3 MATCHES演算子

- 4.1.8 大/小文字を区別する検索

- 4.1.8.1 ワード問合せ

- 4.1.8.2 ABOUT問合せ

- 4.1.9 問合せのフィードバック

- 4.1.10 問合せの実行計画

- 4.1.11 問合せでのシソーラスの使用

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

- 4.1.13 問合せテンプレートの使用

- 4.1.14 クエリー・リライト

- 4.1.15 問合せ緩和

- 4.1.16 問合せ言語

- 4.1.17 代替スコアリングおよびユーザー定義スコアリング

- 4.1.18 代替文法

- 4.1.19 問合せ分析

- 4.1.20 その他の問合せ機能

- 4.2 CONTEXT文法

- 4.2.1 ABOUT問合せ

- 4.2.2 論理演算子

- 4.2.3 セクション検索

- 4.2.4 NEAR演算子およびNEAR_ACCUM演算子による近接問合せ

- 4.2.5 FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算

- 4.2.6 CTXCAT文法の使用方法

- 4.2.7 ストアド・クエリー式

- 4.2.7.1 ストアド・クエリー式の定義

- 4.2.7.2 SQE例

- 4.2.8 CONTAINSでのPL/SQLファンクションのコール

- 4.2.9 応答時間短縮のための最適化

- 4.2.9.1 問合せの応答時間に影響するその他の要因

- 4.2.10 ヒット数のカウント

- 4.2.10.1 SQLによるヒット数のカウント例

- 4.2.10.2 構造化述語によるヒット数のカウント

- 4.2.10.3 PL/SQLによるヒット数のカウント例

- 4.2.11 ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用

- 4.3 CTXCAT文法

- 4.3.1 CONTEXT文法およびCATSEARCHの使用

5 Oracle Textでのドキュメントの表示方法

- 5.1 問合せ語句のハイライト表示

- 5.1.1 テキストのハイライト表示

- 5.1.2 テーマのハイライト表示

- 5.1.3 CTX_DOCのハイライト表示プロシージャ

- 5.1.3.1 MARKUPプロシージャ

- 5.1.3.2 HIGHLIGHTプロシージャ

- 5.1.3.3 コンコーダンス

- 5.2 テーマのリスト、要旨およびテーマ・サマリーの取得

- 5.2.1 テーマのリスト

- 5.2.1.1 メモリー内テーマ

- 5.2.1.2 結果表のテーマ

- 5.2.2 要旨およびテーマ・サマリー

- 5.2.2.1 メモリー内要旨

- 5.2.2.2 結果表の要旨

- 5.2.2.3 テーマ・サマリー

- 5.3 ドキュメントの表示方法およびハイライト表示

- 5.3.1 ハイライト表示の例

- 5.3.2 ドキュメントのテーマ・リストの例

- 5.3.3 要旨の例

6 Oracle Textでのドキュメントの分類

- 6.1 ドキュメント分類の概要

- 6.1.1 分類アプリケーション

- 6.2 分類ソリューション

- 6.3 ルールベース分類

- 6.3.1 ルールベース分類の例

- 6.3.2 CTXRULEパラメータおよび制限事項

- 6.4 管理型分類

- 6.4.1 意思決定ツリー管理型分類

- 6.4.1.1 意思決定ツリー管理型分類の例

- 6.4.2 SVMベース管理型分類

- 6.4.2.1 SVMベース管理型分類の例

- 6.5 非管理型分類(クラスタ化分類)

- 6.5.1 クラスタ化の例

7 Oracle Textのチューニング

- 7.1 応答時間短縮のための問合せの最適化

- 7.1.1 問合せの応答時間に影響するその他の要因

- 7.1.2 FIRST_ROWS(n)ヒントによるORDER BY問合せの応答時間の短縮

- 7.1.2.1 DOMAIN_INDEX_SORTヒントについて

- 7.1.3 ローカル・パーティションCONTEXT索引を使用した応答時間の短縮

- 7.1.3.1 パーティション・キー列に対する範囲検索

- 7.1.3.2 パーティション・キー列でのORDER BY

- 7.1.4 スコア順のローカル・パーティション索引を使用した応答時間の短縮

- 7.2 スループット向上のための問合せの最適化

- 7.2.1 CHOOSEモードおよびALL_ROWSモード

- 7.2.2 FIRST_ROWS(n)モード

- 7.3 Oracle Textのコンポジット・ドメイン索引(CDI)

- 7.3.1 CDIによるパフォーマンス・チューニング

- 7.4 トレースを使用した索引および問合せのボトルネックの解決

- 7.5 パラレル問合せの使用

- 7.5.1 ローカルのCONTEXT索引でのパラレル問合せ

- 7.5.2 Oracle RACノード間のパラレル問合せ

- 7.6 ブロック操作による問合せのチューニング

- 7.7 問合せのパフォーマンスに関するFAQ(よくある質問)

- 7.7.1 問合せのパフォーマンスとは何を意味しますか

- 7.7.2 テキスト問合せのうち、最速のタイプはどれですか

- 7.7.3 表に関する統計を収集する必要がありますか

- 7.7.4 データのサイズは問合せにどのように影響しますか

- 7.7.5 データの形式は問合せにどのように影響しますか

- 7.7.6 機能的検索と索引付き検索とは、何を意味しますか

- 7.7.7 問合せで使用される表はどれですか

- 7.7.8 テキスト条件のみの検索速度は、結果をソートすることにより低下しますか

- 7.7.9 スコアによるORDER BY順の問合せを高速に行うには、どうすればよいですか

- 7.7.10 どのメモリー設定が問合せに影響しますか

- 7.7.11 長い列を表外のLOBに格納すると、パフォーマンスは向上しますか

- 7.7.12 複数の列に対するCONTAINS問合せを高速にするには、どうすればよいですか

- 7.7.13 問合せに多数の拡張を使用してもかまいませんか

- 7.7.14 ローカル・パーティション索引はどのような場合に便利ですか

- 7.7.15 問合せはパラレルに実行する方がよいですか

- 7.7.16 テーマには索引を付けた方がよいですか

- 7.7.17 CTXCAT索引はどのような場合に使用すればよいですか

- 7.7.18 CTXCAT索引が適さないのは、どのような場合ですか

- 7.7.19 使用可能なオプティマイザ・ヒントは何ですか。また、その機能はどのようなものですか

- 7.8 索引付けのパフォーマンスに関するFAQ(よくある質問)

- 7.8.1 索引付けにはどのくらいの時間が必要ですか

- 7.8.2 どの索引メモリー設定を使用すればよいですか

- 7.8.3 索引付けにはどの程度のディスク・オーバーヘッドが必要ですか

- 7.8.4 データの形式は索引付けにどのように影響しますか

- 7.8.5 パラレル索引付けにより、パフォーマンスは向上しますか

- 7.8.6 ローカル・パーティション索引を作成する場合、索引のパフォーマンスを改善するにはどうすればよいですか

- 7.8.7 索引付けがどの程度完了したかはどうすればわかりますか

- 7.9 索引の更新に関するFAQ(よくある質問)

- 7.9.1 新規レコードまたは更新済レコードに索引を付ける頻度は、どれくらいがよいですか

- 7.9.2 索引の断片化は、どのようにするとわかりますか

- 7.9.3 メモリー割当ては索引の同期化に影響しますか

8 Oracle Textでのドキュメント・セクションの検索

- 8.1 Oracle Textでのドキュメントのセクション検索について

- 8.1.1 Oracle Textでのセクション検索の使用可能

- 8.1.1.1 セクション・グループの作成

- 8.1.1.2 セクションの定義

- 8.1.1.3 ドキュメントの索引付け

- 8.1.1.4 WITHIN演算子によるセクション検索

- 8.1.1.5 INPATHおよびHASPATH演算子によるパス検索

- 8.1.2 Oracle Textのセクション・タイプ

- 8.1.2.1 ゾーン・セクション

- 8.1.2.2 フィールド・セクション

- 8.1.2.3 停止セクション

- 8.1.2.4 MDATAセクション

- 8.1.2.5 NDATAセクション

- 8.1.2.6 SDATAセクション

- 8.1.2.7 属性セクション

- 8.1.2.8 特殊セクション

- 8.2 Oracle Textを使用したHTMLのセクション検索

- 8.2.1 HTMLのセクションの作成

- 8.2.2 HTMLのMetaタグの検索

- 8.2.2.1 例: <META>タグに対するセクションの作成

- 8.3 Oracle Textを使用したXMLのセクション検索

- 8.3.1 自動セクション

- 8.3.2 属性検索

- 8.3.2.1 属性セクションの作成

- 8.3.2.2 INPATH演算子による属性の検索

- 8.3.3 ドキュメント・タイプ別のセクションの作成

- 8.3.4 パス・セクション検索

- 8.3.4.1 PATH_SECTION_GROUPによる索引の作成

- 8.3.4.2 トップレベルのタグ検索

- 8.3.4.3 任意レベルのタグ検索

- 8.3.4.4 直接の親子関係の検索

- 8.3.4.5 タグ値のテスト

- 8.3.4.6 属性検索

- 8.3.4.7 属性値のテスト

- 8.3.4.8 パスのテスト

- 8.3.4.9 HASPATHによるセクションの等価性のテスト

9 Oracle Textの名前検索の使用

- 9.1 名前検索の概要

- 9.2 名前検索の使用例

10 Oracle Textでのシソーラスの使用

- 10.1 Oracle Textシソーラス機能の概要

- 10.1.1 Oracle Textシソーラスの作成とメンテナンス

- 10.1.1.1 CTX_THESパッケージ

- 10.1.1.2 シソーラス演算子

- 10.1.1.3 ctxloadユーティリティ

- 10.1.2 大/小文字を区別するシソーラスの使用

- 10.1.3 大/小文字を区別しないシソーラスの使用

- 10.1.4 デフォルトのシソーラス

- 10.1.5 提供されるシソーラス

- 10.1.5.1 提供されるシソーラスの構造と内容

- 10.1.5.2 提供されるシソーラスの場所

- 10.2 シソーラスの用語の定義

- 10.2.1 シノニムの定義

- 10.2.2 階層関係の定義

- 10.3 問合せアプリケーションでのシソーラスの使用

- 10.3.1 カスタム・シソーラスのロードおよびシソーラス・ベースの問合せの発行

- 10.3.1.1 メリット

- 10.3.1.2 制限事項

- 10.3.2 カスタム・シソーラスによるナレッジ・ベースの補強

- 10.3.2.1 メリット

- 10.3.2.2 制限事項

- 10.3.2.3 新規語句の既存語句へのリンク

- 10.3.2.4 ctxloadによるシソーラスのロード

- 10.3.2.5 ロード済のシソーラスのコンパイル

- 10.4 提供されるナレッジ・ベース

- 10.4.1 言語固有のナレッジ・ベースの追加

- 10.4.1.1 制限事項

11 XML問合せの結果セット・インタフェースの使用

- 11.1 XML問合せの結果セット・インタフェースの概要

- 11.2 XML問合せの結果セット・インタフェースの使用

12 Oracle Textの管理

- 12.1 Oracle Textのユーザーとロール

- 12.1.1 CTXSYSユーザー

- 12.1.2 CTXAPPロール

- 12.1.3 ユーザーへのロールおよび権限の付与

- 12.2 DMLキュー

- 12.3 CTX_OUTPUTパッケージ

- 12.4 CTX_REPORTパッケージ

- 12.5 Oracle Enterprise ManagerのText Manager

- 12.5.1 Text Managerの使用

- 12.5.2 テキスト索引の一般情報の表示

- 12.5.3 テキスト索引の状態のチェック

- 12.6 サーバーと索引付け

- 12.7 Oracle Enterprise Managerのデータベース機能使用状況トラッキング

- 12.7.1 パッケージ使用状況の統計

- 12.7.2 索引使用状況の統計

- 12.7.3 SQL演算子使用状況の統計

- 12.8 Oracle Real Application Clusters上のOracle Text

13 Oracle Textアプリケーションの移行

- 13.1 Oracle Text 11gリリース2(11.2)への移行

- 13.2 Oracle Text 11gリリース2 (11.1)への移行

- 13.3 Oracle Text 10gリリース2(10.2)への移行

- 13.3.1 新規フィルタ(INSO_FILTERとAUTO_FILTER)

- 13.3.1.1 AUTO_FILTERフィルタ型への移行

A CONTEXT問合せアプリケーション

- A.1 Web問合せアプリケーションの概要

- A.2 PSP Webアプリケーション

- A.2.1 Webアプリケーションの前提条件

- A.2.2 Webアプリケーションの作成

- A.2.3 PSPのサンプル・コード

- A.2.3.1 loader.ctl

- A.2.3.2 loader.dat

- A.2.3.3 search_htmlservices.sql

- A.2.3.4 search_html.psp

- A.3 JSP Webアプリケーション

- A.3.1 Webアプリケーションの前提条件

- A.3.2 JSPのサンプル・コード

- A.3.2.1 search_html.jsp

B CATSEARCH問合せアプリケーション

- B.1 CATSEARCH Web問合せアプリケーションの概要

- B.2 JSP Webアプリケーション

- B.2.1 JSP Webアプリケーションの作成

- B.2.2 JSPのサンプル・コード

- B.2.2.1 loader.ctl

- B.2.2.2 loader.dat

- B.2.2.3 catalogSearch.jsp

用語集

索引

表一覧

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

- 3-2 DATASTOREタイプの要約

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

- 4-1 Oracle Textのその他の問合せ機能

- 4-2 論理演算子

- 4-3 CATSEARCH問合せ演算子の構文

- 5-1 テーマのリスト、要旨およびテーマ・サマリー

- 5-2 CTX_DOCの出力

- 8-1 セクション・グループのタイプ

- 8-2 セクション・タイプおよびセクション・グループ

- 8-3 BASIC_LEXERの文および段落セクション境界

はじめに

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

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

『Oracle Textアプリケーション開発者ガイド』は、次の作業を実行するユーザーを対象としています。

- Oracle Textアプリケーションの開発

- Oracle Textインストールの管理

このマニュアルを使用するには、Oracleオブジェクト・リレーショナル・データベース管理システム、SQL、SQL*PlusおよびPL/SQLでの作業経験が必要です。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

Oracle Textの詳細は、次のマニュアルを参照してください。

- 『Oracle Textリファレンス』

Oracle Databaseの詳細は、次のマニュアルを参照してください。

- 『Oracle Database概要』

- 『Oracle Database管理者ガイド』

- 『Oracle Databaseユーティリティ』

- 『Oracle Databaseパフォーマンス・チューニング・ガイド』

- 『Oracle Database SQL言語リファレンス』

- 『Oracle Databaseリファレンス』

- 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

PL/SQLの詳細は、次のマニュアルを参照してください。

- 『Oracle Database PL/SQL言語リファレンス』

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 Oracle Textのアプリケーション開発の概要

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

- Oracle Textの概要

- ドキュメント・コレクション・アプリケーション

- カタログ情報アプリケーション

- ドキュメント分類アプリケーション

- XML検索アプリケーション

1.1 Oracle Textの概要

Oracle Textを使用すると、テキスト問合せアプリケーションおよびドキュメント分類アプリケーションを作成できます。Oracle Textには、テキストに対する索引付け機能、ワードとテーマの検索機能および結果表示機能が備わっています。

Oracle Textアプリケーションを設計するには、まず実行する問合せのタイプを決定します。問合せのタイプを決定することで、タスクに最も適した索引を選択できます。

Oracle Textにおける、アプリケーションの次の3つのカテゴリについて考えます。

- ドキュメント・コレクション・アプリケーション

- カタログ情報アプリケーション

- ドキュメント分類アプリケーション

1.2 ドキュメント・コレクション・アプリケーション

テキスト問合せアプリケーションを使用すると、ユーザーは、Webサイト、デジタル・ライブラリ、ドキュメント・ウェアハウスなどのドキュメント・コレクションを検索できます。通常、コレクションは静的で、最初に索引付けを実行した後に内容が大幅に変更されることはありません。ドキュメントのサイズは任意であり、HTML、PDF、Microsoft Wordなどの多様な形式を使用できます。これらのドキュメントは、ドキュメント表に格納されます。検索を可能にするには、ドキュメント・コレクションを最初に索引付けします。

通常、問合せはワードまたは句で構成されます。アプリケーション・ユーザーは、ORやANDなどの演算子を使用して、ワードおよび句の論理的な組合せを指定できます。ステミング、近接検索、ワイルド・カード操作など、その他の問合せ操作を使用すると、検索結果が改善されます。

このタイプのアプリケーションでは、無関係なドキュメントをできるかぎり取り出さないようにしながら、問合せに関連するドキュメントを取り出すことが重要です。最も関連のあるドキュメントが、結果リストの上位にランク付けされる必要があります。

このタイプのアプリケーションの問合せには、ドキュメント表に対するCONTEXT索引が最も適しています。この索引への問合せでは、アプリケーションは、SQL SELECT文のWHERE句でCONTAINS演算子を使用します。

図1-1 テキスト問合せアプリケーションの概要

1.2.1 テキスト問合せアプリケーションのフローチャート

ドキュメント・コレクションに対する典型的なテキスト問合せアプリケーションでは、ユーザーが問合せを入力できるようになっています。アプリケーションはCONTAINS問合せを入力し、その問合せを満たすドキュメントのリスト(ヒットリスト)を戻します。問合せの結果は通常、関連性の度合によってランク付けされています。アプリケーションでは、ヒットリスト内の1つ以上のドキュメントを表示できます。

たとえば、アプリケーションでWorld Wide Web上のURL(HTMLファイル)を索引付けすることにより、索引付けされた一連のURL内での問合せ機能が提供されます。この場合、問合せアプリケーションにより戻されるヒットリストは、ユーザーがアクセスできるURLで構成されます。

図1-2は、単純な問合せアプリケーションとユーザーとの対話方法をフローチャートで示しています。

1. ユーザーが問合せを入力します。

2. アプリケーションがCONTAINS問合せを実行します。

3. アプリケーションがヒットリストを表示します。

4. ユーザーがヒットリストからドキュメントを選択します。

5. アプリケーションがドキュメントを表示します。

図1-2 問合せアプリケーションのフローチャート

1.3 カタログ情報アプリケーション

カタログ情報は、オンライン書店やオークション・サイトなどの在庫タイプ情報で構成されます。格納される情報は、本のタイトルや関連する構造化情報(価格など)のようなテキスト情報で構成されます。通常は、在庫に関してオンライン・カタログを最新の状態にしておくため、この情報は定期的に更新されます。

問合せは、通常、テキスト・コンポーネントと構造化コンポーネントとの組合せです。ほとんどの場合、問合せの結果は、日付や価格などの構造化コンポーネントでソートされます。このタイプの問合せアプリケーションでは、応答時間を短くすることが常に重要です。

カタログ・アプリケーションには、CTXCAT索引が最も適しています。SELECT文のWHERE句でCATSEARCH演算子を使用して、この索引を問い合せます。

図1-3に、カタログ表、CTXCAT索引、およびCATSEARCH演算子を使用して索引の問合せを行うカタログ・アプリケーションの関係を示します。

図1-3 カタログ問合せアプリケーション

1.3.1 カタログ問合せアプリケーションのフローチャート

カタログ・アプリケーションを使用すると、ユーザーは、カタログ内の特定の品目を検索できます。たとえば、オンライン・ストア・アプリケーションを使用すると、ユーザーは、在庫内の品目を検索して購入できます。通常、ユーザー問合せは、テキスト記述を検索するテキスト・コンポーネントと、その他いくつかの順序付け基準(価格や日付など)で構成されます。

図1-4に、オンライン電子ストアにおける、カタログ問合せアプリケーションのフローチャートを示します。

1. ユーザーが、テキスト・コンポーネント(cd playerなど)および構造化コンポーネント(order by priceなど)で構成される問合せを入力します。

2. アプリケーションがCATSEARCH問合せを実行します。

3. 適宜並べ替えられた結果が表示されます。

4. ユーザーが結果をブラウズします。

5. ユーザーが別の問合せを入力するか、品目の購入などのアクションを実行します。

図1-4 カタログ問合せアプリケーションのフローチャート

1.4 ドキュメント分類アプリケーション

ドキュメント分類アプリケーションでは、着信ストリームまたはドキュメントのセットを、事前定義されたルールのセットと比較します。ドキュメントが1つ以上のルールと一致した場合、アプリケーションはアクションを実行します。

たとえば、ニュース記事の着信ストリームがあるとします。この場合、「金融」のカテゴリを表すルールを定義できます。ルールとは、基本的に、「金融」を主題としたドキュメントを選択する、1つ以上の問合せです。たとえば、ルールは、'stocks or bonds or earnings'などの形式になります。

ウォール・ストリートの収益予測に関するドキュメントが到着し、このカテゴリのルールを満たしている場合、アプリケーションは、ドキュメントに「金融」のタグを付けたり、複数のユーザーに電子メールで送信するなどのアクションを実行します。

ドキュメント分類アプリケーションの作成には、ルールの表を作成してから、CTXRULE索引を作成します。テキストの着信ストリームを分類するには、SELECT文のWHERE句でMATCHES演算子を使用します。分類アプリケーションの一般的なフローは、図1-5を参照してください。

図1-5 ドキュメント分類アプリケーションの概要

1.5 XML検索アプリケーション

XML検索アプリケーションは、XMLドキュメントで検索を実行します。通常のドキュメント検索では、ドキュメントのセットを検索して、テキスト述語を満たすドキュメントを戻します。XML検索では、通常はXMLドキュメントの構造を使用して、検索を制限します。通常は、検索を満たすドキュメントの一部のみが戻されます。たとえば、electricというワードを含むすべての購買依頼を検索する必要はなく、コメント・フィールドにelectricが含まれる購買依頼のみが必要な場合などです。

Oracle Textを使用すると、次のアプローチによってXML検索を実行できます。

- Oracle Textの使用

- Oracle XML DBのフレームワークの使用

- Oracle Textの機能とOracle XML DBの結合

1.5.1 Oracle Textの使用

CONTAINS演算子は構造化検索に最適であり、WITHIN、HASPATHおよびINPATHの各演算子を使用して制限検索を実行できます。CONTEXT索引を使用する場合、Oracle Text検索の次の特性も利用できます。

- トークンベースで空白が正規化された検索

- 関連性の度合によってランク付けされたヒットリスト

- 大/小文字を区別した検索

- セクション検索

- ステミング検索やファジー検索などの言語機能

- 大きいドキュメント・セット向けにパフォーマンスが最適化された問合せ

関連項目:
「Oracle Textを使用したXMLのセクション検索」

1.5.2 Oracle XML DBのフレームワークの使用

Oracle XML DBを使用して、XMLType列にXMLドキュメントをロードします。Oracle XML DBを使用したXML検索は、通常、existsNode()、extract()またはextractValue()問合せ内のXPATH式で構成されます。このタイプの検索の特徴は、次のとおりです。

- 日付と数値に等値および範囲を使用した非テキスト検索。

- すべての文字が同じものとして処理される、文字ベースの文字列検索。

- ora:contains()ファンクションとCTXXPATH索引を利用して、existsNode()問合せを高速にする機能。

このタイプの検索の不都合な点は、次のとおりです。

- 特別な言語処理を行いません。

- 完全一致を使用するため、関連性という概念がありません。

- 次のようなワイルド・カード操作などの検索には、非常に時間がかかる場合があります。

WHERE col1 like '%dog%'

関連項目:
『Oracle XML DB開発者ガイド』

1.5.3 Oracle Textの機能とOracle XML DBの結合

全テキスト検索を実行するアプリケーションのためにOracle Textの機能とOracle XML DBを結合して、「Pentiumというワードを含むすべてのノードを検索」などの問合せを入力することで、XML構造を利用できます。これは、次に示す2つの方法のいずれかで実行できます。

- Text-on-XMLメソッドの使用

- XML-on-Textメソッドの使用

関連項目:
『Oracle XML DB開発者ガイド』および「Oracle Textを使用したXMLのセクション検索」

1.5.3.1 Text-on-XMLメソッドの使用

Oracle Textを使用すると、XMLデータを含む列にCONTEXT索引を作成できます。列型はXMLTypeですが、XMLデータの正しい索引プリファレンスを使用する場合は、サポートされている任意の型にできます。

Text-on-XMLメソッドでは、標準のCONTAINS問合せを使用して、構造化制約を追加し、検索の範囲を特定のセクション、フィールド、タグまたは属性に制限します。つまり、テキスト演算子内に、WITHIN、HASPATH、INPATHなどの構造を指定することになります。

たとえば、CONTEXT索引を設定し、XMLドキュメントを使用してセクションを作成します。購買依頼を定義する次のXMLドキュメントを考えてみます。

<?xml version="1.0"?>
<PURCHASEORDER pono="1">
<PNAME>Po_1</PNAME>
<CUSTNAME>John</CUSTNAME>
<SHIPADDR>
<STREET>1033 Main Street</STREET>
<CITY>Sunnyvalue</CITY>
<STATE>CA</STATE>
</SHIPADDR>
<ITEMS>
<ITEM>
<ITEM_NAME> Dell Computer </ITEM_NAME>
<DESC> Pentium 2.0 Ghz 500MB RAM  </DESC>
</ITEM>
<ITEM>
<ITEM_NAME> Norelco R100 </ITEM_NAME>
<DESC>Electric Razor </DESC>
</ITEM>
</ITEMS>
</PURCHASEORDER>

品目の説明セクション内にPentiumを含むすべての購買依頼を問い合せるには、WITHIN演算子を使用します。

SELECT id from po_tab where CONTAINS( doc, 'Pentium WITHIN desc') > 0;

INPATH演算子を使用して、XPATH式でより複雑な基準を指定します。

SELECT id from po_tab where  CONTAINS(doc, 'Pentium INPATH (/purchaseOrder/items/item/desc') > 0;

1.5.3.2 Text-on-XMLメソッドの使用

XML-on-Textメソッドを使用して、XML検索にテキスト操作を追加します。このテキスト操作では、existsNode()、extract()およびextractValue()の各問合せにより、XPATH式でora:contains()ファンクションを使用します。つまり、構造内に全テキスト条件を含むことになります。たとえば、次の式を使用します。

SELECT
Extract(doc, '/purchaseOrder//desc{ora:contains(.,"pentium")>0]',
'xmlns:ora=http://xmlns.oracle.com/xdb')
"Item Comment" FROM po_tab_xmltype
/

また、CTXXPATHテキスト・ドメイン索引を使用すると、existsNode()、extract()およびextractValue()のパフォーマンスが向上します。

2 Oracle Textの使用の開始

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

- Oracle Textの使用の開始の概要

- Oracle Textユーザーの作成

- 問合せアプリケーションのクイック・ツアー

- カタログ・アプリケーションのクイック・ツアー

- 分類アプリケーションのクイック・ツアー

2.1 Oracle Textの使用の開始の概要

この章では、Oracle Text開発者ユーザー・アカウントの作成方法、および単純なテキスト問合せアプリケーションとカタログ・アプリケーションの作成方法の基本情報を提供します。また、各アプリケーション・タイプで表のロード、索引付けおよび問合せに使用する基本的なSQL文の情報も提供します。

詳細なアプリケーションの例は、「付録」に記載されています。ドキュメント分類アプリケーションの作成方法の詳細は、第6章「Oracle Textでのドキュメントの分類」を参照してください。

注意:
この章では、読みやすさと、テキストの切取りおよび貼付けの便宜のために、SQL>プロンプトを省略しています。

2.2 Oracle Textユーザーの作成

Oracle Text索引を作成して、Oracle Text PL/SQLパッケージを使用する前に、CTXAPPロールを持つユーザーを作成する必要があります。このロールを使用すると、次の操作を実行できます。

- Oracle Textの索引プリファレンスの作成および削除

- Oracle TextのPL/SQLパッケージの使用

Oracle Textアプリケーション開発者ユーザーを作成するには、システム管理者ユーザーとして次の手順を実行します。

手順1   ユーザーの作成

次のSQL文で、パスワードmyuser_passwordを持つ、MYUSERというユーザーを作成します。

CREATE USER myuser IDENTIFIED BY myuser_password;

手順2   ロールの付与

次のSQL文で、必要なロールRESOURCE、CONNECTおよびCTXAPPをMYUSERに付与します。

GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;

手順3   CTX PL/SQLパッケージでのEXECUTE権限の付与

Oracle Textには、Oracle Text索引の同期化からドキュメントのハイライト表示までを実行できる複数のパッケージが組み込まれています。たとえば、CTX_DDLパッケージには、索引を同期化できるSYNC_INDEXプロシージャがあります。これらの各パッケージについては、『Oracle Textリファレンス』の該当する章を参照してください。

これらのプロシージャをストアド・プロシージャからコールする場合、アプリケーションではパッケージの実行権限が必要です。たとえば、MYUSERにすべてのOracle Textパッケージの実行権限を付与するには、次のSQL文を入力します。

GRANT EXECUTE ON CTXSYS.CTX_CLS TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_DOC TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_QUERY TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_REPORT TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_THES TO myuser;
GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO myuser;

2.3 問合せアプリケーションのクイック・ツアー

基本的なテキスト問合せアプリケーションでは、ユーザーが問合せワードまたは句を入力すると、アプリケーションは、問合せに最も一致するドキュメントのリストを戻します。このようなアプリケーションでは、CONTEXT索引が作成され、CONTAINSを使用してこの索引の問合せが行われます。

この例では、テキスト表のロード、ドキュメントの索引付けおよび索引の問合せを行う、基本的なSQL文を示します。

通常は、問合せアプリケーションにはユーザー・インタフェースが必要です。CONTEXT索引タイプを使用してこのような問合せアプリケーションを作成する方法の例は、付録Aにあります。

手順1   新規ユーザーとしての接続

表を作成する前に、ユーザーのIDが作成されていることを前提とします。

CONNECT myuser;

手順2   テキスト表の作成

次の例では、CREATE TABLE文を使用して、id列およびtext列を持つdocsという表を作成します。この例では、id列を主キーとしています。text列は、VARCHAR2です。

CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));

手順3   ドキュメントの表へのロード

SQLのINSERT文を使用して、テキストを表にロードします。

docs表への移入には、次のINSERT文を使用します。

INSERT INTO docs VALUES(1, '<HTML>California is a state in the US.</HTML>');
INSERT INTO docs VALUES(2, '<HTML>Paris is a city in France.</HTML>');
INSERT INTO docs VALUES(3, '<HTML>France is in Europe.</HTML>');

SQL*Loaderの使用

SQL*Loaderを使用して、表をまとめてロードすることもできます。

関連項目:
SQL*Loaderを使用してデータ・ファイルからテキスト表をロードする方法の例は、「Webアプリケーションの作成」を参照してください。

手順1   CONTEXT索引の作成

HTMLファイルを索引付けするには、次のようにCONTEXT索引をテキスト列に作成します。HTMLの索引付けであるため、この例では、フィルタ処理が不要なNULL_FILTERプリファレンス型とHTML_SECTION_GROUP型を使用します。

CREATE INDEX idx_docs ON docs(text)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');

索引付け時にHTMLドキュメントをフィルタ処理する必要がないため、NULL_FILTERを使用します。ただし、PDF、Microsoft Wordまたはその他の書式設定されたドキュメントを索引付けする場合は、FILTERプリファレンスとしてCTXSYS.AUTO_FILTER(デフォルト)を使用します。

この例では、HTMLドキュメントの索引付けに推奨されているHTML_SECTION_GROUPセクション・グループも使用します。HTML_SECTION_GROUPを使用すると、特定のHTMLタグ内を検索して、フォント情報などの不要なマークアップを索引から削除できます。

手順2   CONTAINSによる表の問合せ

まず、読みやすいように、SELECT文の出力書式を設定します。text列の幅を40文字にします。

COLUMN text FORMAT a40;

SELECT文でCONTAINSを使用して表を問い合せます。これにより、問合せを満たすドキュメントIDが取得されます。次の問合せは、ワードFranceを含むドキュメントをすべて検索します。

SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;

SCORE(1)         ID TEXT
---------- ---------- ----------------------------------------
4          3 <HTML>France is in Europe.</HTML>
4          2 <HTML>Paris is a city in France.</HTML>

手順3   ドキュメントの表示

実際のアプリケーションでは、問合せの語句がハイライト表示された状態で、選択したドキュメントをユーザーに表示することがあります。Oracle Textを使用すると、CTX_DOCパッケージによってドキュメントをマークアップできます。

SQL*Plusの無名PL/SQLブロックを使用して、HTMLドキュメントのマークアップを表示できます。ただし、実際のアプリケーションでは、ドキュメントをブラウザで表示することがあります。

このPL/SQLの例では、CTX_DOC.MARKUPのメモリー内バージョンを使用して、ドキュメント3のワードFranceをハイライト表示します。マークアップ・テキストを格納するために一時CLOB (キャラクタ・ラージ・オブジェクト・データ型)が割り当てられ、標準出力に戻されます。終了前に、CLOBの割当てが解除されます。

SET SERVEROUTPUT ON;
DECLARE
2  mklob CLOB;
3  amt NUMBER := 40;
4  line VARCHAR2(80);
5  BEGIN
6    CTX_DOC.MARKUP('idx_docs','3','France', mklob);
7    DBMS_LOB.READ(mklob, amt, 1, line);
8    DBMS_OUTPUT.PUT_LINE('FIRST 40 CHARS ARE:'||line);
9    DBMS_LOB.FREETEMPORARY(mklob);
10    END;
11  /
FIRST 40 CHARS ARE:<HTML><<<France>>> is in Europe.</HTML>

PL/SQL procedure successfully completed.

手順4   データ操作後の索引の同期化

CONTEXT索引を作成する場合、索引を明示的に同期化して、テキスト表に対する挿入、更新または削除にあわせて索引を最新の状態にしておく必要があります。

Oracle Textでは、CTX_DDL.SYNC_INDEXプロシージャを使用して索引を同期化できます。

docs表に行を追加します。

INSERT INTO docs VALUES(4, '<HTML>Los Angeles is a city in California.</HTML>');
INSERT INTO docs VALUES(5, '<HTML>Mexico City is big.</HTML>');

索引は同期化されていないため、これらの新しい行は、cityを問い合せても戻りません。

SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;

SCORE(1)         ID TEXT
---------- ---------- --------------------------------------------------
4          2 <HTML>Paris is a city in France.</HTML>

したがって、2MBのメモリーを使用して索引を同期化し、問合せを再実行します。

EXEC CTX_DDL.SYNC_INDEX('idx_docs', '2M');

PL/SQL procedure successfully completed.

COLUMN text FORMAT a50;
SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;

SCORE(1)         ID TEXT
---------- ---------- --------------------------------------------------
4          5 <HTML>Mexico City is big.</HTML>
4          4 <HTML>Los Angeles is a city in California.</HTML>
4          2 <HTML>Paris is a city in France.</HTML>

2.3.1 Oracle Text Wizardを使用したWebアプリケーションの作成

Oracle Textでは、Oracle JDeveloper用のOracle Text Wizardのアドオンを使用して、単純なテキストおよびカタログWebアプリケーションを作成できます。ウィザードは、Oracle用に構成されたApache Webサーバーで使用できるJava Server PagesまたはPL/SQLサーバー・スクリプトを自動的に生成します。

JDeveloperおよびText Wizardは、OTN(Oracle Technology Network)から無料でダウンロードできます。

2.3.1.1 Oracle JDeveloper

最新のJDeveloperソフトウェアは、次のURLにあります。

http://www.oracle.com/technology/software/products/jdev

例については、「JSP Webアプリケーションの作成」を参照してください。

2.3.1.2 Oracle Text Wizardのアドイン

Text Wizard、Catalog WizardおよびClassification Wizardのアドインは、次のURLにあります。

http://www.oracle.com/technology/software/products/text

2.3.1.3 Oracle Text Wizardの説明

Oracle Text Wizardの使用、およびWebサーバー環境で実行するためのJSPファイルの設定の説明は、次のURLを参照してください。

http://www.oracle.com/technology/software/products/text

「Text Search Wizard for JDeveloper」リンクを参照してください。

2.4 カタログ・アプリケーションのクイック・ツアー

この例は、カメラやCDプレーヤなどの電子機器を販売するオークション・サイトのカタログ索引を作成します。毎日新しい在庫が追加され、品目の説明、入札日および価格をまとめて格納する必要があります。

アプリケーションは、複合問合せに対して適切な時間で応答する必要があります。適切なCTXCAT索引を作成するために、ユーザーが頻繁に検索する列を判断することが重要です。このタイプの索引の問合せは、CATSEARCH演算子を使用して入力されます。

注意:
通常は、問合せアプリケーションにはユーザー・インタフェースが必要です。CATSEARCH索引タイプを使用してこのような問合せアプリケーションを作成する方法の例は、付録Bにあります。

手順1   適切なユーザーとしての接続

CTXAPPロールを持つmyuserユーザーとして接続します。

CONNECT myuser;

手順2   表の作成

在庫を格納するAuction表を設定します。

CREATE TABLE auction(
item_id NUMBER,
title VARCHAR2(100),
category_id NUMBER,
price NUMBER,
bid_close DATE);

図2-1に、この表を示します。

手順3   表の移入

id、title、priceおよびbid_dateの各項目を表に移入します。

INSERT INTO AUCTION VALUES(1, 'NIKON CAMERA', 1, 400, '24-OCT-2002');
INSERT INTO AUCTION VALUES(2, 'OLYMPUS CAMERA', 1, 300, '25-OCT-2002');
INSERT INTO AUCTION VALUES(3, 'PENTAX CAMERA', 1, 200, '26-OCT-2002');
INSERT INTO AUCTION VALUES(4, 'CANON CAMERA', 1, 250, '27-OCT-2002');

SQL*Loaderの使用

SQL*Loaderを使用して、表をまとめてロードすることもできます。

関連項目
SQL*Loaderを使用してデータ・ファイルからテキスト表をロードする方法の例は、「Webアプリケーションの作成」を参照してください。

手順1   問合せの判断

検索される可能性のある基準を判断します。この例では、すべての問合せが品目の説明のタイトル列を検索し、ほとんどの問合せが価格順になっているかどうかを判断します。後でCATSEARCH演算子を使用するときに、テキスト列の語句および構造化句の基準を指定します。

手順2   価格順に並べ替えるサブ索引の作成

Oracle Textでこれらの問合せを効率的に満たし、価格順に並べ替えるために、価格列にサブ索引を設定する必要があります。

したがって、auction_setという名前の索引セットを作成し、price列にサブ索引を追加します。

EXEC CTX_DDL.CREATE_INDEX_SET('auction_iset');
EXEC CTX_DDL.ADD_INDEX('auction_iset','price'); /* sub-index A*/

図2-1に、サブ索引と列の関係を示します。

手順3   CTXCAT索引の作成

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

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

図2-1に、CTXCAT索引およびサブ索引と列の関係を示します。

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

手順1   CATSEARCHによる表の問合せ

AUCTION表にCTXCAT索引を作成すると、CATSEARCH演算子を使用してこの索引を問い合せることができます。

出力を読取り可能にするために、まず出力書式を設定します。

COLUMN title FORMAT a40;

問合せを実行します。

SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;

TITLE                PRICE
--------------- ----------
PENTAX CAMERA          200
CANON CAMERA           250
OLYMPUS CAMERA         300
NIKON CAMERA           400

SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA',
'price <= 300')>0;

TITLE                PRICE
--------------- ----------
PENTAX CAMERA          200
CANON CAMERA           250
OLYMPUS CAMERA         300

手順2   表の更新

新しい行を追加することで、カタログ表を更新します。カタログ表を更新すると、変更を反映するために、CTXCAT索引が自動的に同期化されます。

たとえば、表に次の新しい行を追加して、問合せを再実行します。

INSERT INTO AUCTION VALUES(5, 'FUJI CAMERA', 1, 350, '28-OCT-2002');
INSERT INTO AUCTION VALUES(6, 'SONY CAMERA', 1, 310, '28-OCT-2002');

SELECT title, price FROM auction WHERE CATSEARCH(title, 'CAMERA', 'order by price')> 0;

TITLE                                    PRICE
----------------------------------- ----------
PENTAX CAMERA                              200
CANON CAMERA                               250
OLYMPUS CAMERA                             300
SONY CAMERA                                310
FUJI CAMERA                                350
NIKON CAMERA                               400

6 rows selected.

追加された行が、問合せにただちに表示されます。

2.5 分類アプリケーションのクイック・ツアー

分類アプリケーションでは、ドキュメントの内容に基づいてアクションが実行されます。アクションには、ドキュメントへのカテゴリIDの割当てや、ユーザーへのドキュメントの送信などがあります。その結果、ドキュメントが分類されます。

ドキュメントは、事前に定義されたルールに従って分類されます。これらのルールは、カテゴリに対して選択されます。たとえば、'presidential elections'という問合せルールは、政治に関するカテゴリに対してドキュメントを選択します。

Oracle Textでは、複数のタイプの分類を提供しています。ここで説明する単純な分類、つまりルールベースの分類では、ドキュメント・カテゴリおよびドキュメントを分類するためのルールを作成します。管理型分類では、提供されたトレーニング・ドキュメントのセットからルールが導出されます。クラスタ化では、Oracle Textによりルールおよびカテゴリが導出され、すべての処理が自動的に実行されます。(分類の詳細は、「ドキュメント分類の概要」を参照してください。)

Oracle Textを使用してドキュメントの内容を簡単に分類するには、ルールを作成します。ルールとは基本的に、ドキュメントの内容をカテゴリ化する問合せの表です。CTXRULE索引でこれらのルールを索引付けします。テキストの着信ストリームを分類するには、SELECT文のWHERE句でMATCHES演算子を使用します。分類アプリケーションの一般的なフローは、図2-2を参照してください。

図2-2 ドキュメント分類アプリケーションの概要

2.5.1 分類アプリケーションの作成手順

次の例では、CTXAPPロールを持つmyuserユーザーによる簡単なカテゴリの定義、CTXRULE索引の作成、およびMATCHESの使用について説明します。

手順1   適切なユーザーとしての接続

CTXAPPロールを持つmyuserユーザーとして接続します。

CONNECT myuser;

手順2   ルール表の作成

ルール表を作成して、問合せルールを移入する必要があります。この例では、queriesという表を作成します。各行で、IDを持つカテゴリ、および問合せ文字列で構成されたルールを定義します。

CREATE TABLE queries (
query_id      NUMBER,
query_string  VARCHAR2(80)
);

INSERT INTO queries VALUES (1, 'oracle');
INSERT INTO queries VALUES (2, 'larry or ellison');
INSERT INTO queries VALUES (3, 'oracle and text');
INSERT INTO queries VALUES (4, 'market share');

手順3   CTXRULE索引の作成

次のように、CTXRULE索引を作成します。

CREATE INDEX queryx ON queries(query_string) INDEXTYPE IS CTXSYS.CTXRULE;

手順4   MATCHESによる分類

SELECT文のWHERE句でMATCHES演算子を使用して、ドキュメントを問合せと照合し、分類します。

COLUMN query_string FORMAT a35;
SELECT query_id,query_string FROM queries
WHERE MATCHES(query_string,
'Oracle announced that its market share in databases
increased over the last year.')>0;

QUERY_ID QUERY_STRING
---------- -----------------------------------
1 oracle
4 market share

前述のように、ドキュメント文字列はカテゴリ1および4と一致します。この分類では、特定の表へのドキュメントの書込みや、ユーザーへの電子メール送信などのアクションを実行できます。

関連項目:
拡張された分類の例は、第6章「Oracle Textでのドキュメントの分類」を参照してください。

3 Oracle Textでの索引付け

この章では、Oracle Textの索引付け機能について説明します。次の項目について説明します。

- Oracle Textの索引の概要

- 索引付け時の考慮事項

- Oracle Textの索引の作成

- Oracle Textの索引のメンテナンス

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

3.1 Oracle Textの索引の概要

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

- Oracle Textの索引タイプ

- Oracle TextのCONTEXT索引の構造

- Oracle Textの索引付け処理

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

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

- パラレル索引付け

- 索引付けとビュー

3.1.1 Oracle Textの索引タイプ

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

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

索引タイプ

説明

サポートされるプリファレンスとパラメータ

問合せ演算子

注意

CONTEXT

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

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

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

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

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

CONTAINS

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

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

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

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

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

CTXCAT

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

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

INDEX SET

LEXER

STOPLIST

STORAGE

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

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

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

CATSEARCH

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

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

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

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

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

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

CTXRULE

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

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

MATCHES

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

CTXXPATH

XMLType列に対するexistsNode()問合せを高速にする必要がある場合に、この索引を作成します。

STORAGE

existsNode()とともに使用します。

この索引タイプは非推奨であり、XMLIndexを使用できない古いリリースのOracle Databaseとの下位互換性のためにのみサポートされています。新しいアプリケーションを作成する場合は、XMLIndexを使用することをお薦めします。

この索引を作成できるのは、XMLType列に対してのみです。

この索引タイプはexistsNode()問合せに役立ちますが、XMLの検索には不要です。「XML検索アプリケーション」を参照してください。

関連項目:
「Oracle Textの索引の作成」

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

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

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

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

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

XMLtype列を使用している場合は、XMLIndex索引によりexistsNode問合せを高速に実行できます。

注意:
索引タイプCTXXPATHは非推奨となっています。これは、XMLIndexを使用できない古いリリースのOracle Databaseとの下位互換性のためにのみサポートされています。新しいアプリケーションを作成する場合は、XMLIndexを使用することをお薦めします。

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

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

注意:
透過的データ暗号化が可能な列ではドメイン索引はサポートされないため、Oracle Textでドメイン索引を使用することはできません。ただし、TDEが可能な表領域に格納される表の列には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を格納する行に含まれています。

3.1.2.1 マージ済のワードとテーマ索引

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

関連項目:
テーマ情報の索引付けの詳細は、「プリファレンスの作成」を参照してください。

3.1.3 Oracle Textの索引付け処理

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

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

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

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

ストリームはデータストアから始まり、データストアでは、指定したデータストア・プリファレンスに従って、システムに格納されているとおりにドキュメントが読み込まれます。たとえば、データストアをFILE_DATASTOREと定義した場合、ストリームは、オペレーティング・システムからのファイルの読込みで開始されます。ドキュメントは、インターネット上またはOracle Databaseに格納することもできます。ファイルが物理的にどこに存在していても、Oracle Databaseにはそのファイルを指すテキスト表が必要です。

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

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

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

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

- テキストは、非データベース・キャラクタ・セットからデータベース・キャラクタ・セットに変換されます。CHARSET_FILTERプリファレンス型を指定した場合に発生します。

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

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

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

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

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

テーマの索引付けが使用可能の場合、レクサーはテキストを分析してテーマ・トークンを作成し、索引付けを行います。

3.1.3.5 索引付けエンジン

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

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

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

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

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

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

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

3.1.4.1 パーティション表の問合せ

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

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

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

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

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

3.1.6 パラレル索引付け

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

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

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

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

- データ・ステージング。使用している製品にOracle Textの索引が組み込まれている場合に有効です。

- アプリケーションの高速な初期起動。大規模なデータ・コレクションを対象にする場合に有効です。

- アプリケーションのテスト。アプリケーションの開発時に多様な索引パラメータやスキーマのテストが必要な場合に有効です。

関連項目:

- 「ローカルのCONTEXT索引でのパラレル問合せ」

- 「索引付けのパフォーマンスに関するFAQ(よくある質問)」

3.1.7 索引付けとビュー

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

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

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

3.2 索引付け時の考慮事項

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

- テキストの場所

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

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

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

- ドキュメントの言語

- 特殊文字の索引付け

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

- 各国語別の機能

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

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

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

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

- 索引のパフォーマンス

- 問合せのパフォーマンスとLOB列の格納

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

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

3.2.1 テキストの場所

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

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

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

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

- World Wide Webのドキュメントを指定するURL

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

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

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

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

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

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

Oracle Textでは、VARCHAR2、CLOB、BLOB、CHAR、BFILE、XMLTypeおよびURIType型の列を使用して、CONTEXT索引を作成できます。

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

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

この項では、異なる索引を持つ表にテキストを直接格納する方法について説明します。

3.2.1.2.1 CONTEXTデータ記憶域

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

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

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

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

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

3.2.1.2.2 CTXCATデータ記憶域

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

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

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

3.2.1.4 URLの格納

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

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

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

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

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

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

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

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

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

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

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

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

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

3.2.1.8 DATASTOREタイプの要約

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

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

表3-2 DATASTOREタイプの要約

データストア型

使用する場合

DIRECT_DATASTORE

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

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

MULTI_COLUMN_DATASTORE

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

DETAIL_DATASTORE

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

FILE_DATASTORE

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

NESTED_DATASTORE

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

URL_DATASTORE

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

USER_DATASTORE

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

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

関連項目:
「データストア例」

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

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

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

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

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

関連項目:
「NULL_FILTER例: 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.2.3 カスタム・フィルタ処理

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

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

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

関連項目:
「PROCEDURE_FILTER例」

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

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

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

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

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

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

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

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

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

3.2.5 ドキュメントの言語

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

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

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

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

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

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

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

3.2.5.1 BASIC_LEXER以外の言語機能

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

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

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

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

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

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

関連項目:
「MULTI_LEXER例: マルチ言語表の索引付け」

3.2.6 特殊文字の索引付け

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

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

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

- printjoin文字

- skipjoin文字

- その他の文字

3.2.6.1 printjoin文字

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

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

関連項目:
「BASIC_LEXER例: printjoin文字の設定」

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属性を使用します。

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

3.2.8 各国語別の機能

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

- テーマの索引付け

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

- 代替スペル

- 複合語

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

3.2.8.1 テーマの索引付け

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

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

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

関連項目:

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

- 「ABOUT問合せおよびテーマ」

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

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

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

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

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

3.2.8.3 代替スペル

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

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

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

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

3.2.8.4 複合語

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

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

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

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

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

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

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

言語

レクサー

韓国語

KOREAN_MORPH_LEXER

日本語

JAPANESE_LEXER、JAPANESE_VGRAM_LEXER

中国語

CHINESE_LEXER、CHINESE_VGRAM_LEXER

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

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

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

問合せでファジー・マッチングを使用すると、類似するスペルのワードが一致します。

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

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

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

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

関連項目:
『Oracle Textリファレンス』

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

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

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

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

関連項目:
「BASIC_WORDLIST例: サブストリングとプリフィックスの索引付けの使用可能化」

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

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

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

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

関連項目:
第8章「Oracle Textでのドキュメント・セクションの検索」

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

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

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

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

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

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

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

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

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

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

3.2.13 索引のパフォーマンス

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

関連項目:
「索引付けのパフォーマンスに関するFAQ(よくある質問)」

3.2.14 問合せのパフォーマンスとLOB列の格納

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

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

関連項目:
「長い列を表外のLOBに格納すると、パフォーマンスは向上しますか」

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

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

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

関連項目:
「CONTEXT索引例: FILTER BYおよびORDER BYによる問合せ処理」

3.3 Oracle Textの索引の作成

Oracle Textでは、CONTEXT、CTXCAT、CTXRULEおよびCTXXPATHという4つのタイプの索引を作成できます。ここでは、次の項目について説明します。

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

- プリファレンスの作成

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

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

- CONTEXT索引の作成

- CTXCAT索引の作成

- CTXRULE索引の作成

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

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

関連項目:
「デフォルトのCONTEXT索引例」

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

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

クラス

説明

データストア

ドキュメントの保存方法

フィルタ

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

レクサー

索引付け対象の言語

ワードリスト

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

記憶域

索引データの格納方法

ストップリスト

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

セクション・グループ

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

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

3. SQL文CREATE INDEXを使用してテキスト索引を作成し、索引名を指定し、必要に応じてプリファレンスを指定します。「CONTEXT索引の作成」を参照してください。

関連項目:
「索引付け時の考慮事項」および『Oracle Textリファレンス』のCREATE INDEXに関する項目

3.3.2 プリファレンスの作成

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

3.3.2.1 データストア例

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

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

3.3.2.1.1 DIRECT_DATASTOREの指定

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

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

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

create index myindex on mytable(docs)
indextype is ctxsys.context
parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');

3.3.2.1.2 MULTI_COLUMN_DATASTOREの指定

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

begin
ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('my_multi', 'columns', 'column1, column2, column3');
end;

3.3.2.1.3 URLデータ記憶域の指定

この例では、my_urlというURL_DATASTOREプリファレンスを作成し、http_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.oracle.com');
ctx_ddl.set_attribute('my_url','NO_PROXY','us.oracle.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演算子を使用してセクション内で問合せができます。セクションは、セクション・グループの構成要素として定義します。

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

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

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

関連項目:
第8章「Oracle Textでのドキュメント・セクションの検索」

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.4.1 マルチ言語のストップリスト

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

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

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

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

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

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

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

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

- CTX_DDL.CREATE_STOPLIST

- CTX_DDL.ADD_STOPWORD

- CTX_DDL.ADD_STOPTHEME

- CTX_DDL.ADD_STOPCLASS

- CTX_DDL.REMOVE_STOPWORD

- CTX_DDL.REMOVE_STOPTHEME

- CTX_DDL.REMOVE_STOPCLASS

- CTX_DDL.DROP_STOPLIST

関連項目:
これらの文の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

3.3.5 CONTEXT索引の作成

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

3.3.5.1 CONTEXT索引およびDML

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

関連項目:
「索引の同期化」

3.3.5.2 デフォルトのCONTEXT索引例

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

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

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

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

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

注意:
システムで正しくドキュメントをフィルタ処理するために、使用している環境がAUTO_FILTERフィルタをサポートするように正しく設定されていることを確認してください。
AUTO_FILTERフィルタを使用するための環境の構成方法は、『Oracle Textリファレンス』を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

関連項目:
CTX.DDL.POPULATE_PENDINGの詳細は、『Oracle Textリファレンス』を参照してください。

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

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

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

begin
ctx_ddl.create_preference('my_url','URL_DATASTORE');
ctx_ddl.set_attribute('my_url','HTTP_PROXY','www-proxy.us.oracle.com');
ctx_ddl.set_attribute('my_url','NO_PROXY','us.oracle.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.1 CTXCAT索引およびDML

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

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

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

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

- 索引付け対象の総テキスト

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

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

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

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

3.3.6.3 CTXCATサブ索引の作成

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

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

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

create table auction(

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

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

begin

ctx_ddl.create_index_set('auction_iset');

end;

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

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

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

構造化句

問合せを満たすサブ索引の定義

カテゴリ

'price < 200'
'price = 150'

'order by price'

'price'

A

'price = 100 order by bid_close'
'order by price, bid_close'

'price, bid_close'

B

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

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

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;

3.3.6.3.2 構造化問合せ句カテゴリ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')
;

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

3.3.7 CTXRULE索引の作成

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

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

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

- 手順2: CTXRULE索引の作成

- 手順3: ドキュメントの分類

関連項目:
ドキュメントの分類およびCTXRULE索引の詳細は、第6章「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)');

3.3.7.1.1 CTX_CLS.TRAINの使用

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

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

3.3.7.2 手順2: CTXRULE索引の作成

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

CREATE INDEX myruleindex ON myqueries(query)
INDEXTYPE IS CTXRULE PARAMETERS
('lexer lexer_pref
storage storage_pref
section group section_pref
wordlist wordlist_pref');

3.3.7.3 手順3: ドキュメントの分類

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

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

CREATE TABLE news (

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

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

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

3.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;

関連項目:
この文の詳細は、『Oracle Textリファレンス』を参照してください。

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

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

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

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

例: 失敗した索引の再開

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

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

3.4.4 索引の再作成

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.4.5 索引の再構築

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

関連項目:
索引の設定の変更の詳細は、「索引の再作成」を参照してください。

例: 索引の再構築

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

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

3.4.6 プリファレンスの削除

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

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

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

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

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

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

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

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

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

- 保留中のDMLの表示

- 索引の同期化

- 索引の最適化

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

3.5.1 保留中のDMLの表示

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

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

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

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

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

関連項目:
このビューの詳細は、『Oracle Textリファレンス』を参照してください。

3.5.2 索引の同期化

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

- SYNC_INDEXのmaxtimeパラメータ

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

3.5.2.1 例

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

begin

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

end;

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

3.5.2.2 SYNC_INDEXのmaxtimeパラメータ

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

- maxtimeがNULLの場合は、CTX_DDL.MAXTIME_UNLIMITEDの場合と同じです。

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

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

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

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

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

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

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

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

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

オプションは次のとおりです。

オプション

説明

CTX_DDL.LOCK_WAIT

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

CTX_DDL.LOCK_NOWAIT

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

CTX_DDL.LOCK_NOWAIT_ERROR

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

3.5.3 索引の最適化

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

3.5.3.1 CONTEXT索引の構造

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

DOG DOC1 DOC3 DOC5

3.5.3.2 索引の断片化

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

DOG DOC1 DOC3 DOC5
DOG DOC7

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

DOG DOC1 DOC3 DOC5
DOG DOC7
DOG DOC9
DOG DOC11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.5.3.6 例: 索引の最適化

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

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

4 Oracle Textでの問合せ

この章では、Oracle Textの問合せと関連機能を説明します。次の項目について説明します。

- 問合せの概要

- CONTEXT文法

- CTXCAT文法

4.1 問合せの概要

Oracle Textの基本的な問合せでは、問合せ式を入力します。式は、通常はワードで、演算子を併用する場合と併用しない場合があります。式を満たすすべてのドキュメント(事前に索引付け済)が、各ドキュメントの関連性スコアとともに戻ります。スコアは、結果セットの中でドキュメントを順序付けるために使用できます。

Oracle Textの問合せを入力するには、SQLのSELECT文を使用します。作成する索引のタイプに応じて、WHERE句にCONTAINS演算子またはCATSEARCH演算子のいずれかを使用します。これらの演算子は、PL/SQLカーソル内など、SELECT文を使用できる状況であれば、いつでもプログラムで使用できます。

CTXRULE索引を使用してドキュメントを分類するには、MATCHES演算子を使用します。

4.1.1 CONTAINSによる問合せ

CONTEXT索引タイプを作成する場合は、CONTAINS演算子を使用して問合せを入力する必要があります。大量のまとまったドキュメントのコレクションを索引付けするには、CONTEXT索引タイプが最適です。

CONTAINS演算子では、複数の演算子を使用して検索条件を定義できます。これらの演算子によって、論理、近接、ファジー、ステミング、シソーラスおよびワイルド・カードの各検索を入力できます。また、適切に構成された索引を使用すると、HTMLやXMLのような内部構造を持つドキュメントに対してセクション検索を入力することもできます。

CONTAINSでは、ABOUT演算子を使用して、ドキュメント・テーマを検索できます。

4.1.1.1 CONTAINS SQL例

SELECT文では、CONTAINS演算子を使用してWHERE句で問合せを指定します。また、ヒットリストのヒットごとにスコアを戻すには、SCORE演算子を指定します。次の例では、問合せの入力方法を示します。

SELECT SCORE(1), title from news WHERE CONTAINS(text, 'oracle', 1) > 0;

次のように、ORDER BY句を使用して、結果を最も高いスコアのドキュメントから最も低いスコアのドキュメントに順序付けることができます。

SELECT SCORE(1), title from news
WHERE CONTAINS(text, 'oracle', 1) > 0
ORDER BY SCORE(1) DESC;

CONTAINS演算子の後には、> 0構文が必要です。この構文は、CONTAINS演算子によって戻されるスコアの値が、戻される行に対してゼロより大きい必要があることを指定します。

SELECT文でSCORE演算子がコールされた場合、CONTAINS演算子は、前述の例の3番目のパラメータで、スコア・ラベルの値を参照する必要があります。

4.1.1.2 CONTAINS PL/SQL例

PL/SQLアプリケーションでは、カーソルを使用して問合せ結果をフェッチできます。

次の例では、CONTAINS問合せをNEWS表に対して入力し、ワードoracleを含むすべての記事を検索します。ヒットしたもののうち上位10個のタイトルとスコアが出力されます。

declare
rowno number := 0;
begin
for c1 in (SELECT SCORE(1) score, title FROM news
WHERE CONTAINS(text, 'oracle', 1) > 0
ORDER BY SCORE(1) DESC)
loop
rowno := rowno + 1;
dbms_output.put_line(c1.title||': '||c1.score);
exit when rowno = 10;
end loop;
end;

この例では、カーソルFORループを使用して、ヒットしたもののうち上位10個を取り出します。SCORE演算子の戻り値に対して、別名scoreが宣言されています。カーソル・ドット表記法を使用して、スコアとタイトルが標準出力に出力されます。

4.1.1.3 CONTAINSによる構造化問合せ

構造化問合せは複合問合せとも呼ばれ、テキスト列を問い合せるCONTAINS述語と、構造化データ列を問い合せる別の述語を持つ問合せです。

構造化問合せを入力するには、SELECT文のWHERE条件に構造化句を指定します。

たとえば、次のSELECT文は、1997年10月1日以降に書かれた、ワードoracleを含む記事をすべて検索します。

SELECT SCORE(1), title, issue_date from news
WHERE CONTAINS(text, 'oracle', 1) > 0
AND issue_date >= ('01-OCT-97')
ORDER BY SCORE(1) DESC;

注意:
CONTAINSで構造化問合せを入力できる場合でも、CTXCAT索引を作成し、CATSEARCHで問合せを発行することを検討してください。そのほうが構造化問合せのパフォーマンスが向上します。

4.1.2 CATSEARCHによる問合せ

CTXCAT索引タイプを作成する場合は、CATSEARCH演算子を使用して問合せを入力する必要があります。使用しているアプリケーションで、テキスト列に短いテキスト断片や関連列にその他の関連情報を格納する場合は、CTXCAT索引タイプが最適です。

たとえば、オンライン・オークション・サイトを提供しているアプリケーションでは、表のテキスト列に品目の説明を格納し、その他の列に日付や価格などの関連情報を格納する場合があります。CTXCAT索引を使用すると、これらの列の1つ以上にBツリー索引を作成できます。その結果、CATSEARCH演算子を使用してCTXCAT索引を検索すると、通常、複合問合せの問合せパフォーマンスが向上します。

CATSEARCHによる問合せに使用できる演算子は、ANDやORなどの論理操作に制限されています。構造化基準の定義に使用できる演算子は、＞、<、=、BETWEENおよびINです。

4.1.2.1 CATSEARCH SQL問合せ

CATSEARCHによる一般的な問合せの例として、次のように、ワードcameraを含むすべての行を検索してbid_closeの日付順にソートする構造化句が組み込まれていることがあります。

SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'order by bid_close desc')> 0;

入力できる構造化問合せのタイプは、サブ索引の作成方法によって異なります。

関連項目:
「CTXCAT索引の作成」

前述の例のように、CATSEARCH問合せの構造化部分を指定するには、3番目のstructured_queryパラメータを使用します。構造化式で名前を指定する列には、対応するサブ索引が必要です。

たとえば、category_idとbid_closeには、AUCTION表のCTXCAT索引内にサブ索引があるとします。この場合は、次のような構造化問合せを入力します。

SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'category_id=99 order by bid_close desc')> 0;

4.1.2.2 CATSEARCH例

次の例は、CATSEARCH問合せ内の問合せテンプレートにより、CONTEXT文法を使用した、CTXCAT索引に対するフィールド・セクション検索を示します。

-- Create and populate table
create table BOOKS (ID number, INFO varchar2(200), PUBDATE DATE);

insert into BOOKS values(1, '<author>NOAM CHOMSKY</author><subject>CIVIL
RIGHTS</subject><language>ENGLISH</language><publisher>MIT
PRESS</publisher>', '01-NOV-2003');

insert into BOOKS values(2, '<author>NICANOR PARRA</author><subject>POEMS
AND ANTIPOEMS</subject><language>SPANISH</language>
<publisher>VASQUEZ</publisher>', '01-JAN-2001');

insert into BOOKS values(1, '<author>LUC SANTE</author><subject>XML
DATABASE</subject><language>FRENCH</language><publisher>FREE
PRESS</publisher>', '15-MAY-2002');

commit;

-- Create index set and section group
exec ctx_ddl.create_index_set('BOOK_INDEX_SET');
exec ctx_ddl.add_index('BOOKSET','PUBDATE');

exec ctx_ddl.create_section_group('BOOK_SECTION_GROUP',
'BASIC_SECTION_GROUP');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','AUTHOR','AUTHOR');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','SUBJECT','SUBJECT');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','LANGUAGE','LANGUAGE');
exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','PUBLISHER','PUBLISHER');

-- Create index
create index books_index on books(info) indextype is ctxsys.ctxcat
parameters('index set book_index_set section group book_section_group');

-- Use the index
-- Note that: even though CTXCAT index can be created with field sections, it
-- cannot be accessed using CTXCAT grammar (default for CATSEARCH).
-- We need to use query template with CONTEXT grammar to access field
-- sections with CATSEARCH

select  id, info from books
where catsearch(info,
'<query>
<textquery grammar="context">
NOAM within author and english within language
</textquery>
</query>',
'order by pubdate')>0;

4.1.3 MATCHESによる問合せ

CTXRULE索引タイプを作成する場合は、MATCHES演算子を使用してドキュメントを分類する必要があります。CTXRULE索引は、本来は分類を定義する問合せのセットに作成される索引です。

たとえば、ドキュメントの着信ストリームをドキュメントの内容に基づいて分類する必要がある場合は、カテゴリを定義する問合せのセットを作成できます。この問合せは、テキスト列の行として作成します。このタイプの表は、CTX_CLS.TRAINプロシージャを使用して作成することもできます。

次に、CTXRULE索引を作成するために表を索引付けします。ドキュメントの着信時に、MATCHES演算子を使用して各ドキュメントを分類します。

関連項目:
第6章「Oracle Textでのドキュメントの分類」

4.1.3.1 MATCHES SQL問合せ

MATCHES問合せでは、指定したドキュメントに一致する問合せ表内のすべての行を検索します。表querytableにCTXRULE索引が関連付けられている場合、次の問合せを入力します。

SELECT classification FROM querytable WHERE MATCHES(query_string,:doc_text) > 0;

バインド変数:doc_textには、分類されるドキュメントCLOBが含まれています。

次の簡単な例に、すべてをまとめて示します。

create table queries (
query_id      number,
query_string  varchar2(80)
);

insert into queries values (1, 'oracle');
insert into queries values (2, 'larry or ellison');
insert into queries values (3, 'oracle and text');
insert into queries values (4, 'market share');

create index queryx on queries(query_string)
indextype is ctxsys.ctxrule;

select query_id from queries
where matches(query_string,
'Oracle announced that its market share in databases
increased over the last year.')>0

この問合せは、問合せ2(ワードlarryおよびellisonは表示されません)および3(ドキュメント内にテキストがないため問合せに一致しません)ではなく、問合せ1(ワードoracleがドキュメントに表示されます)および4(句market shareがドキュメントに表示されます)を戻します。

この例では、簡略化するために、ドキュメントを文字列として渡しています。通常は、ドキュメントはバインド変数で渡されます。

MATCHES問合せで使用されるドキュメント・テキストは、VARCHAR2またはCLOBになります。BLOB入力は受け入れられないため、フィルタ処理されたドキュメントを直接照合することはできません。かわりに、AUTO_FILTERフィルタを使用して、バイナリ・コンテンツをCLOBにフィルタ処理する必要があります。次の例では、ドキュメント・データがバインド変数:doc_blob内にあることと、CTX_DOC.POLICY_FILTERが使用できるポリシーmy_policyがすでに定義されていることの2つを前提としています。たとえば、次の式を使用します。

declare
doc_text clob;
begin
-- create a temporary CLOB to hold the document text
doc_text := dbms_lob.createtemporary(doc_text, TRUE, DBMS_LOB.SESSION);

-- create a simple policy for this example
ctx_ddl.create_preference(preference_name => 'fast_filter',
object_name       => 'AUTO_FILTER');
ctx_ddl.set_attribute(preference_name => 'fast_filter',
attribute_name    => 'OUTPUT_FORMATTING',
attribute_value   => 'FALSE');
ctx_ddl.create_policy(policy_name     => 'my_policy',
filter            => 'fast_filter);

-- call ctx_doc.policy_filter to filter the BLOB to CLOB data
ctx_doc.policy_filter('my_policy', :doc_blob, doc_text, FALSE);

-- now do the matches query using the CLOB version
for c1 in (select * from queries where matches(query_string, doc_text)>0)
loop
-- do what you need to do here
end loop;

dbms_lob.freetemporary(doc_text);
end;

テキストをCLOBに取り込んでMATCHES問合せを入力する必要があるため、プロシージャCTX_DOC.POLICY_FILTERによりBLOBをCLOBデータにフィルタ処理します。これは、CTX_DDL.CREATE_POLICYを使用してすでに作成されたポリシーの名前を1つの引数として受け取ります。(CTX_DOC.POLICY_FILTERの詳細は、『Oracle Textリファレンス』を参照してください。)

ファイルがデータベース・キャラクタ・セット内のテキストである場合、BFILEを作成し、ファンクションDBMS_LOB.LOADFROMFILEを使用してCLOBにロードするか、UTL_FILEを使用して、ファイルを一時的なCLOBロケータに読み込むことができます。

ファイルがAUTO_FILTERフィルタ処理を必要とする場合は、ファイルをBLOBにロードして、前述のように、CTX_DOC.POLICY_FILTERをコールします。

関連項目:
拡張された分類の例は、第6章「Oracle Textでのドキュメントの分類」を参照してください。

4.1.3.2 MATCHES PL/SQL例

次の例では、問合せprofilesの表にCTXRULE索引が関連付けられていることが前提となります。また、表newsfeedに分類対象の記事のセットが含まれていることも前提となります。

この例では、newsfeed表内をループし、MATCHES演算子を使用して各記事を分類します。結果は、results表に格納されます。

PROMPT  Populate the category table based on newsfeed articles
PROMPT
set serveroutput on;
declare
mypk   number;
mytitle varchar2(1000);
myarticles clob;
mycategory varchar2(100);
cursor doccur is select pk,title,articles from newsfeed;
cursor mycur is  select category from profiles where matches(rule, myarticles)>0;
cursor rescur is select category, pk, title from results order by category,pk;

begin
dbms_output.enable(1000000);
open doccur;
loop
fetch doccur into mypk, mytitle, myarticles;
exit when doccur%notfound;
open mycur;
loop
fetch mycur into mycategory;
exit when mycur%notfound;
insert into results values(mycategory, mypk, mytitle);
end loop;
close mycur;
commit;
end loop;
close doccur;
commit;

end;
/

次の例では、分類された記事をカテゴリ別に表示します。

PROMPT  display the list of articles for every category
PROMPT
set serveroutput on;

declare
mypk   number;
mytitle varchar2(1000);
mycategory varchar2(100);
cursor catcur is select category from profiles order by category;
cursor rescur is select pk, title from results where category=mycategory order by pk;

begin
dbms_output.enable(1000000);
open catcur;
loop
fetch catcur into mycategory;
exit when catcur%notfound;
dbms_output.put_line('********** CATEGORY: '||mycategory||' *************');
open rescur;
loop
fetch rescur into mypk, mytitle;
exit when rescur%notfound;
dbms_output.put_line('**  ('||mypk||'). '||mytitle);
end loop;
close rescur;
dbms_output.put_line('**');
dbms_output.put_line('*******************************************************');
end loop;
close catcur;
end;
/

関連項目:
拡張された分類の例は、第6章「Oracle Textでのドキュメントの分類」を参照してください。

4.1.4 ワード問合せと句問合せ

ワード問合せは、ワードまたは句に対する問合せです。たとえば、テキスト表でワードdogを含むすべての行を検索するには、問合せ語句として、dogを指定して問合せを入力します。

ワード問合せは、SQL演算子のCONTAINSとCATSEARCHの両方で入力できます。ただし、句問合せは、異なる方法で解釈されます。

4.1.4.1 CONTAINS句問合せ

問合せ式に複数のワードが空白のみ(演算子なし)で区切られて含まれている場合、そのワードの文字列は句とみなされ、問合せ時に文字列全体が検索されます。

たとえば、句international lawを含むすべてのドキュメントを検索するには、句international lawを指定して問合せを入力します。

4.1.4.2 CATSEARCH句問合せ

CATSEARCH演算子では、句の各ワードの間にAND演算子が挿入されます。たとえば、international lawの問合せでは、international AND lawとして解釈されます。

4.1.5 ストップワードの問合せ

ストップワードは、索引エントリが作成されないワードです。ストップワードは、通常、それ自体は検索の対象とならない、その言語の一般的なワードです。

Oracle Textには、使用言語のデフォルトのストップワード・リストが組み込まれています。このリストは、ストップリストと呼ばれます。たとえば、英語では、ワードthisおよびthatは、デフォルトのストップリストでストップワードとして定義されています。このデフォルトのストップリストを変更したり、CTX_DDLパッケージを使用して新しいストップリストを作成できます。また、索引を作成した後で、ALTER INDEX文でストップワードを追加することもできます。

ストップワードまたはストップワードのみで構成されている句に対する問合せは発行できません。たとえば、thisがストップワードとして定義されている場合は、ワードthisを問い合せても、ヒットは戻りません。

ただし、this boy talks to that girlのように、ストップワードとストップワード以外のワードが含まれている句を問い合せることはできます。これは、Oracle Textの索引では、ストップワードの索引エントリは作成しませんが、ストップワードの位置は記録しているためです。

問合せ句内にストップワードが含まれている場合、このストップワードは任意のワードに一致します。たとえば、次の問合せがあるとします。

'Jack was big'

ストップワードがwasの場合、Jack is bigおよびJack grew bigなどの句が一致します。grewはストップワードではありませんが、この問合せでは一致します。

4.1.6 ABOUT問合せおよびテーマ

ABOUT問合せは、ドキュメント・テーマに対する問合せです。ドキュメント・テーマは、テキスト内で詳しく展開されている概念のことです。たとえば、US politicsのABOUT問合せでは、アメリカの大統領選挙や外交政策に関する情報を含むドキュメントが戻る可能性があります。戻るドキュメントには、US politicsと正確に一致する句が含まれている必要はありません。

索引付け時に、ドキュメント・テーマはナレッジ・ベースから導出され、このナレッジ・ベースには、一般的な知識を表すカテゴリと概念が階層式にリストされています。たとえば、ナレッジ・カタログのテーマには、jazz music、footballまたはNelson Mandelaなどの具体的な概念も含まれています。また、テーマには、happinessやhonestyなどの抽象的な概念もあります。

索引付け時に、システムでは、ドキュメント内で詳しく展開されているが、ナレッジ・ベースには存在しないドキュメント・テーマも識別し、索引付けすることができます。

ナレッジ・ベースは、業界または問合せアプリケーション固有の概念や用語を定義して補強できます。補強した場合は、追加した概念に対するABOUT問合せの精度が向上します。

索引内にテーマ・コンポーネントを作成すると、ABOUT問合せのパフォーマンスが最も向上します。テーマ・コンポーネントは、英語とフランス語ではデフォルトで作成されます。

関連項目:
『Oracle Textリファレンス』

4.1.6.1 ストップテーマの問合せ

ABOUT演算子を使用すると、テーマを問い合せることができます。ストップテーマは、索引付け対象外のテーマです。ストップテーマは、CTX_DLLパッケージを使用して追加および削除できます。また、索引を作成した後で、ALTER INDEX文でストップテーマを追加することもできます。

4.1.7 問合せ式

問合せ式とは、CONTAINS演算子またはCATSEARCH演算子のtext_query引数内で一重引用符で囲まれたものを指します。CONTAINS問合せの問合せ式に組み込むことができる内容は、CATSEARCH演算子に組み込める内容とは異なります。

4.1.7.1 CONTAINS演算子

CONTAINSの問合せ式には、論理検索、近接検索、シソーラスを使用した検索、ファジー検索およびワイルド・カード検索を行う問合せ演算子を含めることができます。ストアド式を使用した問合せも可能です。問合せ式内でグループ化文字を使用すると、演算子の優先順位を変更できます。このマニュアルでは、このような演算子をCONTEXT文法と呼びます。

CONTAINSでは、ABOUT問合せを使用して、ドキュメント・テーマを問い合せることもできます。

関連項目:
「CONTEXT文法」

4.1.7.2 CATSEARCH演算子

CATSEARCH演算子では、text_query引数を使用して問合せ式を指定し、structured_query引数を使用してオプションの構造化基準を指定できます。text_query引数を使用すると、ワードと句を問い合せることができます。AND、ORおよびNOTなどの論理操作を使用できます。このマニュアルでは、このような演算子をCTXCAT文法と呼びます。

CONTEXT文法によりサポートされているさらに豊富な演算子を使用する場合は、CATSEARCHで問合せテンプレート機能を使用できます。

structured_query引数では、構造化基準を指定します。次のSQL操作を使用できます。

- =

- <=

- >=

- >

- <

- IN

- BETWEEN

また、ORDER BY句を使用して出力を順序付けできます。

関連項目:
「CTXCAT文法」

4.1.7.3 MATCHES演算子

CONTAINSおよびCATSEARCHと異なり、MATCHESは問合せ式を入力として受け取りません。

MATCHES演算子はドキュメントを入力として受け取り、問合せ(ルール)表から条件に合うすべての行を検出します。したがって、MATCHESを使用すると、一致するルールに従ってドキュメントを分類できます。

関連項目:
「MATCHESによる問合せ」

4.1.8 大/小文字を区別する検索

Oracle Textでは、ワード問合せとABOUT問合せで大/小文字区別がサポートされています。

4.1.8.1 ワード問合せ

ワード問合せでは、デフォルトで大/小文字を区別していません。たとえば、語句dogを問い合せると、テキスト表のワードdog、DogまたはDOGを含む行が検出されます。

BASIC_LEXER索引プリファレンスのmixed_case属性を使用可能にすると、大/小文字を区別した検索を使用可能にできます。大/小文字を区別する索引の場合は、大/小文字を正確に区別して問合せを入力する必要があります。つまり、Dogへの問合せは、Dogを含むドキュメントのみと一致します。dogまたはDOGを含むドキュメントは、ヒットとして戻りません。

4.1.8.1.1 ストップワードと大/小文字区別

ワード問合せに大/小文字区別を使用可能に設定して、ストップワードとストップワード以外のワードを含む句に問合せを入力する場合は、そのストップワードの大/小文字の区別を正確に指定する必要があります。たとえば、theがストップワードとして定義されている場合は、the dogを問い合せても、The Dogを含むテキストは戻りません。

4.1.8.2 ABOUT問合せ

問合せを適切な文字で表すと、ABOUT問合せの結果が最も向上します。これは、問合せの正規化が、大/小文字が区別されるナレッジ・カタログに基づくためです。大文字/小文字によって意味が異なるワードの場合は、特に注意が必要です(たとえば、turkeyは鳥の名で、Turkeyは国名です)。

ただし、ABOUT問合せの関連結果を取得するために、大/小文字を正確に区別して問合せを入力する必要はありません。システムが、最適な方法で問合せを解釈します。たとえば、ORACLEという問合せを入力し、この概念がナレッジ・カタログで検索されない場合、システムは検索用の関連概念としてOracleを使用する場合があります。

4.1.9 問合せのフィードバック

フィードバック情報には、CONTEXT索引で指定した問合せに対する上位語、下位語および関連語の情報が含まれています。フィードバック情報は、CTX_QUERY.HFEEDBACKプロシージャを使用してプログラムで取得します。

上位語、下位語および関連語の情報は、他の問合せ語句を問合せアプリケーションのユーザーに提示する場合に役立ちます。

戻されるフィードバック情報はナレッジ・ベースから取得され、索引中にも存在する語句のみを含みます。これによって、HFEEDBACKプロシージャから戻された語句が、現在索引付けされているドキュメント・セットに対して高いヒットを生成する可能性が高くなります。

関連項目:
CTX_QUERY.HFEEDBACKの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.1.10 問合せの実行計画

実行計画情報では、CONTAINS問合せ式の解析ツリーがグラフィカルに表示されます。実行計画情報は、CTX_QUERY.EXPLAINプロシージャを使用してプログラムで取得できます。

実行計画情報を使用すると、問合せを実行しなくても、問合せの拡張方法や解析方法がわかります。実行計画情報を取得すると、STEM、ワイルド・カード、シソーラス、FUZZY、SOUNDEX、ABOUTなどの特定の問合せの拡張方法がわかります。解析ツリーには、次の情報も表示されます。

- 実行の順序

- ABOUT問合せの正規化

- 問合せ式の最適化

- ストップワード変換

- サポート対象言語の複合語トークンの分類

関連項目:
CTX_QUERY.EXPLAINの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.1.11 問合せでのシソーラスの使用

Oracle Textでは、問合せアプリケーション用のシソーラスを定義できます。

カスタム・シソーラスを定義すると、問合せをより優れた方法で処理できます。使用しているアプリケーションのユーザーには、トピックを表現するワードがわからない場合があるため、予想される問合せ語句にシノニムまたは下位語を定義できます。シソーラス演算子を使用すると、シソーラス語句を含むように問合せを拡張できます。

関連項目:
第10章「Oracle Textでのシソーラスの使用」

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

セクション検索を使用すると、テキスト問合せをドキュメント内のセクションに絞り込むことができます。

セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に実現できます。たとえば、<H1>タグに対してセクションを定義すると、WITHIN演算子を使用してこのセクション内を問い合せることができます。

XMLドキュメントからセクションを自動的に作成するようにシステムを設定できます。

また、属性セクションを定義して、XMLドキュメントの属性テキストを検索できます。

注意:
セクション検索がサポートされているのは、CONTEXT索引によるワード問合せのみです。

関連項目:
第8章「Oracle Textでのドキュメント・セクションの検索」

4.1.13 問合せテンプレートの使用

問合せテンプレートは、既存の問合せ言語の代替として使用できます。問合せ文字列をCONTAINSまたはCATSEARCHに渡すのではなく、問合せ文字列をタグ付き要素内に含む、構造化ドキュメントを渡します。この構造化ドキュメントまたは問合せテンプレートでは、次に示すその他の問合せ機能を使用できます。

- クエリー・リライト

- 問合せ緩和

- 問合せ言語

- 代替スコアリングおよびユーザー定義スコアリング

- 代替文法

4.1.14 クエリー・リライト

問合せアプリケーションは、エンド・ユーザー問合せを解析し、異なる演算子の組合せを使用して、1つ以上の方法で問合せ文字列を解釈することがあります。たとえば、ユーザーがkukui nutという問合せを入力すると、アプリケーションでは、再コールを増やすために、問合せ{kukui nut}および{kukui or nut}が入力されます。

クエリー・リライト機能を使用すると、元の問合せをリライトされたバージョンに拡張する単一の問合せを発行できます。これにより、重複のない結果が戻されます。

問合せテンプレート機能を使用して、リライトの順序を指定します。リライトされた問合せのバージョンは、CONTAINSまたはCATSEARCHの単一のコールを使用して、効率的に実行されます。

次のテンプレートは、クエリー・リライトの順序を定義します。問合せ{kukui nut}は、次のようにリライトされます。

{kukui} {nut}

{kukui} ; {nut}

{kukui} AND {nut}

{kukui} ACCUM {nut}

この変換のクエリー・リライト・テンプレートは、次のとおりです。

select id from docs where CONTAINS (text,
'<query>
<textquery lang="ENGLISH" grammar="CONTEXT"> kukui nut
<progression>
<seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq>
<seq><rewrite>transform((TOKENS, "{", "}", " ; "))</rewrite></seq>
<seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq>
<seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq>
</progression>
</textquery>
<score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

4.1.15 問合せ緩和

問合せ緩和を使用すると、アプリケーションでは、最も制限されたバージョンの問合せを最初に実行して、必要なヒット数を得るまで、問合せを徐々に緩和できます。

たとえば、アプリケーションが最初にblack penを検索した後、より多くのヒットを得るため、問合せがblack NEAR penに緩和されます。

次の問合せテンプレートは、問合せ緩和の順序を定義します。問合せblack penは、次の順序で入力されます。

{black} {pen}

{black} NEAR {pen}

{black} AND {pen}

{black} ACCUM {pen}

この変換の問合せ緩和テンプレートは、次のとおりです。

select id from docs where CONTAINS (text,
'<query>
<textquery lang="ENGLISH" grammar="CONTEXT">
<progression>
<seq>{black} {pen}</seq>
<seq>{black} NEAR {pen}</seq>
<seq>{black} AND {pen}</seq>
<seq>{black} ACCUM {pen}</seq>
</progression>
</textquery>
<score datatype="INTEGER" algorithm="COUNT"/>
</query>')>0;

アプリケーションが結果を必要とするかぎり、問合せのヒットは、この順序で重複なしで戻されます。

問合せ緩和は、アプリケーションが問合せの上位n個のヒットを必要とする場合に最も有効です。この場合、DOMAIN_INDEX_SORTヒントや非推奨となっているFIRST_ROWSヒントを使用して、またはPL/SQLカーソルでヒットを取得できます。

したがって、問合せテンプレートを使用した問合せの緩和は、問合せの再実行よりも効率的です。

4.1.16 問合せ言語

マルチレクサーを使用して、異なる言語の文書を含む列を索引付けする場合、問合せ中に使用する言語レクサーを指定できます。言語レクサーを指定するには、問合せテンプレートでlangパラメータを使用します。

以前のリリースでは、MULTI_LEXERを使用した場合、問合せを実行する前にセッション言語を変更することでのみ、問合せ言語の変更が可能でした。

select id from docs where CONTAINS (text,
'<query><textquery lang="french">bon soir</textquery></query>')>0;

4.1.17 代替スコアリングおよびユーザー定義スコアリング

問合せテンプレートを使用して、デフォルト以外の代替スコアリング・アルゴリズムを指定することにより、CONTAINSをスコアリングする方法をカスタマイズしたり、SDATAをスコアリング式の一部として使用できます。このようにして、事前定義済スコアリング・コンポーネントのみでなくSDATAコンポーネントを使用してスコアリング式を数学的に定義できます。

代替のユーザー定義スコアリングを使用して、次の操作を実行できます。

- 次を使用して、問合せのスコアリング方法を定義する演算式を定義して、語句のスコアリング式を指定します。

- 事前定義済スコアリング・アルゴリズム: DISCRETE、OCCURRENCE、RELEVANCEおよびCOMPLETION

- 算術操作: 加算、減算、乗算、除算

- 算術関数: ABS(n)、n ; LOG(n)の絶対値の検索、10を底とするnの対数値の検索

- 数値リテラル

- 語句レベルでスコアリング式を指定します。

- スコアの計算時に考慮に入れない語句を指定します。

- OR演算子およびAND演算子の子要素によるスコアをどのようにマージするかを指定します。

- 数値を格納するSDATAまたはDATETIME値を使用して、ドキュメントの最終スコアに影響を与えます。

次の例では、代替スコアリング・アルゴリズムを指定します。

select id from docs where CONTAINS (text,
'<query>
<textquery grammar="CONTEXT" lang="english"> mustang  </textquery>
<score datatype="float" algorithm="DEFAULT"/>
</query>')>0

次の問合せテンプレート例には、SDATA値が、最終スコアの一部として含まれています。

select id from docs where CONTAINS (text,
'<query>
<textquery grammar="CONTEXT" lang="english"> mustang </textquery>
<score datatype="float" algorithm="DEFAULT" normalization_expr =”doc_score+SDATA(price)”/>
</query>')>0"

関連項目:
「ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用」

4.1.18 代替文法

問合せテンプレートを使用すると、CATSEARCH問合せとともにCONTEXT文法を使用したり、CONTEXT問合せとともにCATSEARCH文法を使用したりできます。

select id from docs where CONTAINS (text,
'<query>
<textquery grammar="CTXCAT">San Diego</textquery>
<score datatype="integer"/>
</query>')>0;

4.1.19 問合せ分析

Oracle Textを使用すると、問合せのログを作成して、そのログに含まれる問合せを分析できます。たとえば、大きい動物のデータベースを検索するアプリケーションがあり、その問合せの分析で、ユーザーがワードmouseを頻繁に検索することが示されているとします。この分析は、mouseの検索で、検索の失敗を戻すだけでなく、ユーザーを小さい動物のデータベースにリダイレクトするようにアプリケーションをリライトすることを促しています。

問合せ分析では、次のことがわかります。

- 行われた問合せ

- 成功した問合せ

- 失敗した問合せ

- 各問合せが行われた回数

これらの要素を様々な方法で組み合せると、アプリケーションで最も頻繁に行われた、失敗した50個の問合せなどのような判断ができます。

CTX_OUTPUT.START_QUERY_LOGを使用して、問合せのロギングを開始します。問合せログには、CTX_OUTPUT.END_QUERY_LOGプロシージャが入力されるまでプログラムが使用するすべてのコンテキスト索引に対するすべての問合せが含まれます。行われた問合せのレポートを取得するには、CTX_REPORT.QUERY_LOG_SUMMARYを使用します。

関連項目:
これらの手順の構文および例については、『Oracle Textリファレンス』を参照してください。

4.1.20 その他の問合せ機能

問合せアプリケーションでは、近接検索などのその他の問合せ機能を使用できます。表4-1は、これらの問合せ機能のいくつかを示しています。

表4-1 Oracle Textのその他の問合せ機能

機能

説明

実施方法

大/小文字を区別する検索

問合せに入力したとおりに、ワードまたは句を正確に検索できます。たとえば、Romanの検索は、Romanを含み、romanを含まないドキュメントを戻します。

索引作成時にBASIC_LEXERを使用します。

基本文字変換

ティルデ、アクセント、ウムラウトなどの発音区別符号に関係なく、ワードを問い合せます。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、energíaおよびenergiaが含まれているドキュメントが一致します。

索引作成時にBASIC_LEXERを使用します。

ワード分割処理

(ドイツ語およびオランダ語)

指定した語句が複合語の要素として含まれているワードを検索できます。

索引作成時にBASIC_LEXERを使用します。

代替スペル

(ドイツ語、オランダ語およびスウェーデン語)

ワードの代替スペルを検索します。

索引作成時にBASIC_LEXERを使用します。

近接検索

相互に近接しているワードを検索します。

問合せ入力時にNEAR演算子を使用します。

ステミング

指定した語句と同じ語幹を持つワードを検索します。

問合せ入力時に$演算子を使用します。

ファジー検索

指定した語句に類似するスペルを持つワードを検索します。

問合せ入力時にFUZZY演算子を使用します。

問合せの実行計画

問合せの解析情報を生成します。

索引作成後にPL/SQLプロシージャCTX_QUERY.EXPLAINを使用します。

階層問合せフィードバック

問合せに対する上位語、下位語および関連語の情報を生成します。

索引作成後にPL/SQLプロシージャCTX_QUERY.HFEEDBACKを使用します。

索引のブラウズ

索引内のシード・ワードに関するワードをブラウズします。

索引作成後にPL/SQLプロシージャCTX_QUERY.BROWSE_WORDSを使用します。

ヒット数のカウント

問合せのヒット数をカウントします。

索引作成後にPL/SQLプロシージャCTX_QUERY.COUNT_HITSを使用します。

ストアド・クエリー式

後で別の問合せで再利用するために、問合せ式のテキストを保存します。

索引作成後にPL/SQLプロシージャCTX_QUERY.STORE_SQEを使用します。

シソーラスを使用した問合せ

シソーラスを使用して問合せを拡張します。

SYNおよびBTなどのシソーラス演算子とABOUT演算子を使用します。

シソーラスのメンテナンスにはCTX_THESパッケージを使用します。

4.2 CONTEXT文法

CONTEXT文法は、CONTAINSのデフォルトの文法です。この文法では、演算子を使用してさらに複雑な検索を行うことができます。問合せ演算子は問合せ式で使用します。たとえば、論理演算子ANDを使用すると、2つの異なるワードを含むすべてのドキュメントを検索できます。ABOUT演算子を使用すると、概念を検索できます。

また、セクション検索にはWITHIN演算子を、近接検索にはNEAR演算子を使用できます。さらに、問合せ式の拡張には、STEM演算子、FUZZY演算子およびシソーラス演算子を使用できます。

CONTAINSでは、問合せテンプレート機能を使用してCTXCAT文法を使用できます。

次の各項では、Oracle Textの演算子について説明します。

- ABOUT問合せ

- 論理演算子

- セクション検索

- NEAR演算子およびNEAR_ACCUM演算子による近接問合せ

- FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算子

- CTXCAT文法の使用方法

- ストアド・クエリー式

- CONTAINSでのPL/SQLファンクションのコール

- 応答時間短縮のための最適化

- ヒット数のカウント

- ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用

関連項目:
問合せ演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.1 ABOUT問合せ

英語またはフランス語での概念の問合せには、ABOUT演算子を使用します。通常、問合せ文字列は、検索する内容を表す概念またはテーマになります。Oracle Textでは、そのテーマを含むドキュメントを戻します。

ワード情報とテーマ情報は、単一の索引に結合されます。テーマ問合せを入力するには、索引内にテーマ・コンポーネントが存在している必要があります(英語とフランス語の場合は、デフォルトで作成されます)。

テーマ問合せは、問合せ式内でABOUT演算子を使用して入力します。たとえば、politicsに関するすべてのドキュメントを取り出すには、次のように問合せを記述します。

SELECT SCORE(1), title FROM news
WHERE CONTAINS(text, 'about(politics)', 1) > 0
ORDER BY SCORE(1) DESC;

関連項目:
ABOUT演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.2 論理演算子

ANDやORなどの論理演算子を使用すると、様々な方法で検索条件を制限できます。表4-2では、論理演算子について説明します。

表4-2 論理演算子

演算子

記号

説明

式の例

AND

&

各問合せ語句が1つ以上出現するドキュメントを検索するには、AND演算子を使用します。

オペランドの最小値がスコアとして戻ります。

'cats AND dogs'
'cats & dogs'

OR

|

問合せ語句のいずれかが1つ以上出現するドキュメントを検索するには、OR演算子を使用します。

オペランドの最大値がスコアとして戻ります。

'cats | dogs'
'cats OR dogs'

NOT

~

ある問合せ語句が含まれているが、別の問合せ語句は含まれていないドキュメントを検索するには、NOT演算子を使用します。

たとえば、animalsという語句が含まれていて、dogsという語句は含まれていないドキュメントを取得するには、次の式を使用します。

'animals ~ dogs'

ACCUM

,

問合せ語句のいずれかが1つ以上出現するドキュメントを検索するには、ACCUM演算子を使用します。ACCUM演算子は、ドキュメントを語句の合計の重みによってランク付けします。

次の問合せは、dogs、catsおよびpuppiesという語句を含むすべてのドキュメントを検出し、3つの語句をすべて含むドキュメントに最も高いスコアを割り当てます。

'dogs, cats, puppies'

EQUIV

=

問合せ時に条件を満たす代替ワードを指定するには、EQUIV演算子を使用します。

次の例は、句alsatians are big dogsまたはGerman shepherds are big dogsのいずれかを含むすべてのドキュメントを検出します。

'German shepherds=alsatians are big dogs'

4.2.3 セクション検索

セクション検索は、ドキュメント・セットがHTMLまたはXMLの場合に有効です。HTMLの場合は、埋込みタグを使用してセクションを定義し、次にWITHIN演算子を使用して定義したセクションを検索します。

XMLの場合は、システムでセクションを自動的に作成するように設定できます。パスを検索するには、WITHIN演算子またはINPATH演算子で問い合せることができます。

関連項目:
第8章「Oracle Textでのドキュメント・セクションの検索」

4.2.4 NEAR演算子およびNEAR_ACCUM演算子による近接問合せ

NEAR演算子を使用すると、ドキュメント内で互いに近接している語句を検索できます。

たとえば、dogがcatの6ワード以内にあるすべてのドキュメントを検索する場合は、次の問合せを入力します。

'near((dog, cat), 6)'

NEAR_ACCUM演算子は、NEAR演算子の機能とACCUM演算子の機能を結合します。これは、NEARと同様に、互いに指定の範囲内に近接した語句を戻します。ただし、一方の語句が見つからなかった場合、見つかった方の語句が出現する頻度に従って、ドキュメントがランク付けされます。

Oracle Textでは、mild not内のmild nearもサポートされています。たとえば、次の式を使用します。

term1 mnot near((term1,term2))

この問合せは、term1がセマンティクスnear((term1,term2))で定義されている最小スパンに含まれていないかぎり、term1を含むすべてのドキュメントと一致します。

関連項目:
NEARおよびNEAR_ACCUM演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.5 FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算

ワイルド・カード、FUZZY、STEM、SOUNDEX、シソーラスなどの演算子を使用すると、問合せを長いワード・リストに拡張できます。

関連項目:

- これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

- 「問合せに多数の拡張を使用してもかまいませんか」

4.2.6 CTXCAT文法の使用方法

CONTAINS問合せにCTXCAT文法を使用できます。そのためには、CONTAINSのtext_queryパラメータに問合せテンプレート指定を使用します。

代替のより単純な問合せ文法が必要な場合は、CTXCAT文法を利用できます。

関連項目:
これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.7 ストアド・クエリー式

CTX_QUERY.STORE_SQEプロシージャを使用すると、結果を格納せずに問合せの定義を格納できます。CONTAINSのSQL演算子によって、その問合せの定義を参照します。このように、ストアド・クエリー式を使用すると、長い問合せ式や使用頻度の高い問合せ式を簡単に定義できます。

ストアド・クエリー式は索引に連結されません。CTX_QUERY.STORE_SQEをコールする場合、指定するのはストアド・クエリー式の名前と問合せ式のみです。

問合せの定義は、テキスト・データ・ディクショナリに格納されます。ストアド・クエリー式は、すべてのユーザーが参照できます。

関連項目:
CTX_QUERY.STORE_SQEの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.7.1 ストアド・クエリー式の定義

ストアド・クエリー式は、次のように定義して使用します。

1. CTX_QUERY.STORE_SQEをコールして、テキスト列に対する問合せを格納します。STORE_SQEを使用して、ストアド・クエリー式の名前と問合せ式を指定します。

2. SQE演算子を使用して、問合せ式でストアド・クエリー式をコールします。ストアド・クエリー式の結果は、通常の問合せの結果と同じ方法で戻されます。問合せは、ストアド・クエリー式のコール時に評価されます。
ストアド・クエリー式は、REMOVE_SQEを使用して削除できます。

4.2.7.2 SQE例

次の例では、disasterというストアド・クエリー式を作成します。この式は、tornado、hurricaneまたはearthquakeのいずれかのワードを含むドキュメントを検索します。

begin
ctx_query.store_sqe('disaster', 'tornado | hurricane | earthquake');
end;

この問合せを1つの式で実行するには、次のように問合せを記述します。

SELECT SCORE(1), title from news
WHERE CONTAINS(text, 'SQE(disaster)', 1) > 0
ORDER BY SCORE(1);

関連項目:
CTX_QUERY.STORE_SQEの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.8 CONTAINSでのPL/SQLファンクションのコール

ユーザー定義ファンクションは、SQL文で指定されるための要件を満たしていれば、CONTAINS句内で直接コールできます。コール側には、そのファンクションに対するEXECUTE権限も必要です。

たとえば、ファンクションfrenchが英語のワードに相当するフランス語を戻すとします。次の問合せを記述すると、catに相当するフランス語のワードを検索できます。

SELECT SCORE(1), title from news
WHERE CONTAINS(text, french('cat'), 1) > 0
ORDER BY SCORE(1);

関連項目:
ユーザー・ファンクションの作成およびSQLからのユーザー・ファンクションのコールの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

4.2.9 応答時間短縮のための最適化

CONTAINS問合せを応答時間短縮のために最適化すると、ヒットリストの最もスコアの高いドキュメントが必要な場合に、高速なソリューションとなります。

次の例では、標準出力に最初の20個のヒットを戻します。この例では、FIRST_ROWS(n)ヒントとカーソルを使用します。

declare
cursor c is
select /*+ FIRST_ROWS(20) */ title, score(1) score
from news where contains(txt_col, 'dog', 1) > 0 order by score(1) desc;
begin
for c1 in c
loop
dbms_output.put_line(c1.score||':'||substr(c1.title,1,50));
exit when c%rowcount = 21;
end loop;
end;
/

関連項目:
「応答時間短縮のための問合せの最適化」

4.2.9.1 問合せの応答時間に影響するその他の要因

問合せヒントの使用以外にも、次のような要因が問合せ応答時間に影響します。

- 表統計の収集

- メモリー割当て

- ソート

- 元表に存在するLOB列

- パーティション化

- 並列性

- 問合せで語句を拡張する回数

関連項目:
「問合せのパフォーマンスに関するFAQ(よくある質問)」

4.2.10 ヒット数のカウント

CONTAINS述語のみが指定された問合せから戻されたヒット数をカウントするには、PL/SQLのCTX_QUERY.COUNT_HITSまたはSQL SELECT文のCOUNT(*)を使用できます。

おおまかなヒット件数が必要な場合は、CTX_QUERY.COUNT_HITSを予測モード(EXACTパラメータをFALSEに設定)で使用できます。応答時間の点では、これが最も高速なカウント方法です。

構造化述語が含まれた問合せから戻されるヒット数をカウントするには、SELECT文のCOUNT(*)ファンクションを使用します。

4.2.10.1 SQLによるヒット数のカウント例

ワードoracleを含むドキュメント数を検索するには、SQLのCOUNTファンクションによる問合せを次のように入力します。

SELECT count(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0;

4.2.10.2 構造化述語によるヒット数のカウント

構造化述語による問合せで戻されるドキュメント数を検索するには、COUNT(*)を次のように使用します。

SELECT COUNT(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0 and author = 'jones';

4.2.10.3 PL/SQLによるヒット数のカウント例

ワードoracleを含むドキュメント数を検索するには、COUNT_HITSを次のように使用します。

declare count number;
begin
count := ctx_query.count_hits(index_name => my_index, text_query => 'oracle', exact => TRUE);
dbms_output.put_line('Number of docs with oracle:');
dbms_output.put_line(count);
end;

関連項目:
CTX_QUERY.COUNT_HITSの構文の詳細は、『Oracle Textリファレンス』を参照してください。

4.2.11 ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用

DEFINESCORE演算子を使用すると、語句または句のスコアの計算方法を定義できます。DEFINEMERGE演算子では、AND演算子およびOR演算子の子要素のスコアのマージ方法を定義します。また、SDATAとともに代替スコアリング・テンプレートを使用して、ドキュメントの最終スコアリングに影響を与えることができます。

関連項目:

- 代替スコアリング・テンプレートの詳細は、「代替スコアリングおよびユーザー定義スコアリング」を参照してください。

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

4.3 CTXCAT文法

CTXCAT文法は、CATSEARCHのデフォルトの文法です。この文法は、句問合せの他に、ANDやORなどの論理操作もサポートしています。

CATSEARCHの問合せ演算子は、次の構文です。

表4-3 CATSEARCH問合せ演算子の構文

操作

構文

操作の説明

論理AND

a b c

a、bおよびcを含む行を戻します。

論理OR

a | b | c

a、bまたはcを含む行を戻します。

論理NOT

a - b

aを含み、bを含まない行を戻します。

空白なしのハイフン

a-b

通常の文字として処理されるハイフンです。

たとえば、ハイフンがskipjoinとして定義されている場合、web-siteなどのワードは、単一の問合せ語句websiteとして処理されます。

同様に、ハイフンがprintjoinとして定義されている場合、web-siteなどのワードは、CTXCAT問合せ言語ではweb-siteとして処理されます。

" "

"a b c"

句"a b c"を含む行を戻します。

たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。

( )

(A B) | C

グループ設定をカッコで囲みます。この問合せは、CONTAINS問合せの(A &B) | Cに相当します。

4.3.1 CONTEXT文法およびCATSEARCHの使用

さらに、CATSEARCH問合せでCONTEXT文法を使用することもできます。そのためには、text_queryパラメータに問合せテンプレート指定を使用します。

CTXCAT索引で近接問合せ、シソーラス問合せまたはABOUT問合せを入力する必要がある場合に、CONTAINS文法を使用することがあります。

関連項目:
これらの演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

5 Oracle Textでのドキュメントの表示方法

この章では、ドキュメントの表示方法を説明します。次の項目について説明します。

- 問合せ語句のハイライト表示

- テーマのリスト、要旨およびテーマ・サマリーの取得

- ドキュメントの表示方法およびハイライト表示

5.1 問合せ語句のハイライト表示

Oracle Textの問合せアプリケーションでは、テキスト問合せの場合は問合せ語句をハイライト表示し、ABOUT問合せの場合はテーマをハイライト表示して、選択したドキュメントを表示できます。

ハイライト表示に関連する出力では、次の3タイプの出力を生成できます。

- マークアップ形式のドキュメント

- ドキュメントの問合せオフセット情報

- ドキュメントのコンコーダンス(問合せ語句の出現箇所が前後のテキストとともに戻されます)

5.1.1 テキストのハイライト表示

テキストのハイライト表示の場合は、問合せを発行すると、その問合せを満たすドキュメント内のワードがハイライト表示されます。プレーン・テキストまたはHTMLもハイライト表示できます。

5.1.2 テーマのハイライト表示

ABOUT問合せの場合、CTX_DOCパッケージのプロシージャによって、ABOUT問合せを最も適切に表しているワードまたは句がハイライト表示またはマークアップされます。

5.1.3 CTX_DOCのハイライト表示プロシージャ

CTX_DOCには、次のハイライト表示プロシージャがあります。

- CTX_DOC.MARKUPおよびCTX_DOC.POLICY_MARKUP

- CTX_DOC.HIGHLIGHTおよびCTX_DOC.POLICY_HIGHLIGHT

- CTX_DOC.SNIPPETおよびCTX_DOC.POLICY_SNIPPET

各プロシージャのPOLICYバージョンと非POLICYバージョンは等価ですが、POLICYバージョンに索引は不要です。

5.1.3.1 MARKUPプロシージャ

CTX_DOC.MARKUPおよびCTX_DOC.POLICY_MARKUPプロシージャは、ドキュメント参照と問合せを使用して、マークアップされたドキュメントを戻します。出力は、マークアップされたプレーン・テキストかマークアップされたHTMLのいずれかになります。たとえば、マークアップされたドキュメントを問合せ語句とともに山カッコで囲んで戻すか(<<<tansu>>>)、HTML形式で戻すか(<b>tansu</b>)を指定できます。

CTX_DOC.MARKUPおよびCTX_DOC.POLICY_MARKUPは等価ですが、CTX_DOC.POLICY_MARKUPに索引は不要です。

HTMLナビゲーションのマークアップ順序をカスタマイズできます。

5.1.3.1.1 CTX_DOC.MARKUP例

次の例は、付録A「CONTEXT問合せアプリケーション」で説明しているWebアプリケーションです。プロシージャshowDocはHTML文書および問合せを取得して、ハイライト表示されたマークアップを作成し(この場合、問合せ語句は赤で表示されます)、結果をメモリー内のバッファに出力します。次に、htp.printを使用して結果をブラウザに表示します。

procedure showDoc (p_id in varchar2, p_query in varchar2) is

v_clob_selected   CLOB;
v_read_amount     integer;
v_read_offset     integer;
v_buffer          varchar2(32767);
v_query           varchar(2000);
v_cursor          integer;

begin
htp.p('<html><title>HTML version with highlighted terms</title>');
htp.p('<body bgcolor="#ffffff">');
htp.p('<b>HTML version with highlighted terms</b>');

begin
ctx_doc.markup (index_name => 'idx_search_table',
textkey    => p_id,
text_query => p_query,
restab     => v_clob_selected,
starttag   => '<i><font color=red>',
endtag     => '</font></i>');

v_read_amount := 32767;
v_read_offset := 1;
begin
loop
dbms_lob.read(v_clob_selected,v_read_amount,v_read_offset,v_buffer);
htp.print(v_buffer);
v_read_offset := v_read_offset + v_read_amount;
v_read_amount := 32767;
end loop;
exception
when no_data_found then
null;
end;

exception
when others then
null; --showHTMLdoc(p_id);
end;
end showDoc;
end;
/
show errors
set define on

関連項目:
CTX_DOC.MARKUPおよびCTX_DOC.POLICY_SNIPPETの詳細は、『Oracle Textリファレンス』を参照してください。

5.1.3.2 HIGHLIGHTプロシージャ

CTX_DOC.HIGHLIGHTおよびCTX_DOC.POLICY_HIGHLIGHTは、問合せとドキュメントを使用して、プレーン・テキスト形式またはHTML形式のいずれかで問合せのオフセット情報を戻します。このオフセット情報を使用すると、ドキュメント表示用の独自のカスタム・ルーチンを記述できます。

CTX_DOC.HIGHLIGHTおよびCTX_DOC.POLICY_HIGHLIGHTは等価ですが、CTX_DOC.POLICY_HIGHLIGHTに索引は不要です。

オフセット情報を使用すると、ドキュメントを任意のハイライト形式で表示できます。たとえば、CTX_DOC.MARKUPから取得する標準のプレーン・テキストのマークアップではなく、様々なフォント・タイプまたは色で、ドキュメントを表示できます。

関連項目
CTX_DOC.HIGHLIGHTおよびCTX_DOC.POLICY_HIGHLIGHTの詳細は、『Oracle Textリファレンス』を参照してください。

5.1.3.3 コンコーダンス

CTX_DOC.SNIPPETおよびCTX_DOC.POLICY_SNIPPETは、問合せ語句の出現箇所が前後のテキストとともに戻される、ドキュメントのコンコーダンスを生成します。ドキュメント全体が(問合せ語句のハイライト表示ありまたはなしで)戻されるのではなく、文脈がわかるように問合せ語句がテキスト断片で戻されるため、この結果はKWIC (Key Word in Context)とも呼ばれます。戻される断片内で問合せ語句がハイライト表示される方法を制御できます。

CTX_DOC.SNIPPETおよびCTX_DOC.POLICY_SNIPPETは等価ですが、CTX_DOC.POLICY_SNIPPETに索引は不要です。

関連項目:
CTX_DOC.SNIPPETおよびCTX_DOC.POLICY_SNIPPETの詳細は、『Oracle Textリファレンス』を参照してください。

5.2 テーマのリスト、要旨およびテーマ・サマリーの取得

次の表では、テーマのリスト、要旨およびテーマ・サマリーについて説明します。

表5-1 テーマのリスト、要旨およびテーマ・サマリー

出力タイプ

説明

テーマのリスト

ドキュメントの主要概念のリスト。

リストの各テーマが単一のワードまたは句である場合、あるいはリストの各テーマが親テーマの階層リストである場合は、テーマのリストを生成できます。

要旨

ドキュメントの概要を最も適切に表すドキュメント内のテキスト。

テーマ・サマリー

ドキュメントの特定のテーマを最も適切に表すドキュメント内のテキスト。

この出力を取得するには、提供されているCTX_DOCパッケージのプロシージャを使用します。このパッケージを使用すると、次の操作を実行できます。

- 主キーに加えてROWIDでもドキュメントを識別します。

- パフォーマンス向上のため、結果をメモリー内に格納します。

5.2.1 テーマのリスト

テーマのリストは、ドキュメントの主要概念のリストです。テーマのリストを生成するには、CTX_DOC.THEMESプロシージャを使用します。

関連項目:
CTX_DOC.THEMESのコマンド構文の詳細は、『Oracle Textリファレンス』を参照してください。

5.2.1.1 メモリー内テーマ

次の例では、ドキュメント1のトップ10のテーマを生成し、それをthe_themesというメモリー内表に格納します。その後、表内をループし、ドキュメントのテーマを表示します。

declare
the_themes ctx_doc.theme_tab;

begin
ctx_doc.themes('myindex','1',the_themes, numthemes=>10);
for i in 1..the_themes.count loop
dbms_output.put_line(the_themes(i).theme||':'||the_themes(i).weight);
end loop;
end;

5.2.1.2 結果表のテーマ

テーマ表は、次のように作成します。

create table ctx_themes (query_id number,
theme varchar2(2000),
weight number);

5.2.1.2.1 単一テーマ

リストの各要素が単一テーマであるテーマ・リストを取得するには、次の文を入力します。

begin
ctx_doc.themes('newsindex','34','CTX_THEMES',1,full_themes => FALSE);
end;

5.2.1.2.2 全テーマ

リストの各要素が親テーマの階層リストであるテーマのリストを取得するには、次の文を入力します。

begin
ctx_doc.themes('newsindex','34','CTX_THEMES',1,full_themes => TRUE);
end;

5.2.2 要旨およびテーマ・サマリー

要旨は、ドキュメントの概要を最も適切に表すドキュメント内のテキストです。テーマ・サマリーは、ドキュメントの単一テーマを最も適切に表すドキュメント内のテキストです。

要旨およびテーマ・サマリーを生成するには、CTX_DOC.GISTプロシージャを使用します。プロシージャのコール時に、要旨またはテーマ・サマリーのサイズを指定できます。

関連項目:
CTX_DOC.GISTのコマンド構文の詳細は、『Oracle Textリファレンス』を参照してください。

5.2.2.1 メモリー内要旨

次の例では、10個以内の段落のデフォルト・サイズでない全体の要旨を生成します。結果はCLOBロケータの中のメモリーに格納されます。次のコードでは、戻されたCLOBロケータの割当てを使用後に解除しています。

declare
gklob clob;
amt number := 40;
line varchar2(80);

begin
ctx_doc.gist('newsindex','34','gklob',1,glevel => 'P',pov => 'GENERIC',       numParagraphs => 10);
-- gklob is NULL when passed-in, so ctx-doc.gist will allocate a temporary
-- CLOB for us and place the results there.

dbms_lob.read(gklob, amt, 1, line);
dbms_output.put_line('FIRST 40 CHARS ARE:'||line);
-- have to de-allocate the temp lob
dbms_lob.freetemporary(gklob);
end;

5.2.2.2 結果表の要旨

要旨表は、次のように作成します。

create table ctx_gist (query_id  number,
pov       varchar2(80),
gist      CLOB);

次の例では、ドキュメント34に対して、デフォルト・サイズの段落レベルの要旨を戻します。

begin
ctx_doc.gist('newsindex','34','CTX_GIST',1,'PARAGRAPH', pov =>'GENERIC');
end;

次の例では、10個の段落のデフォルト・サイズでない要旨を生成します。

begin
ctx_doc.gist('newsindex','34','CTX_GIST',1,'PARAGRAPH', pov =>'GENERIC',        numParagraphs => 10);
end;

次の例では、段落数がドキュメントの合計段落数の10パーセントの要旨を生成します。

begin
ctx_doc.gist('newsindex','34','CTX_GIST',1, 'PARAGRAPH', pov =>'GENERIC', maxPercent => 10);
end;

5.2.2.3 テーマ・サマリー

次の例では、テキストキー34を持つドキュメントのテーマinsectsに対するテーマ・サマリーを戻します。デフォルト・サイズの要旨が戻ります。

begin
ctx_doc.gist('newsindex','34','CTX_GIST',1, 'PARAGRAPH', pov => 'insects');
end;

5.3 ドキュメントの表示方法およびハイライト表示

通常、問合せアプリケーションでは、問合せから戻されるドキュメントを表示できます。ユーザーがヒットリストからドキュメントを選択すると、アプリケーションはドキュメントを特定の形式で表示します。

Oracle Textでは、様々な方法でドキュメントを表示できます。たとえば、問合せ語句をハイライト表示してドキュメントを表示できます。ハイライト表示できる問合せ語句は、ワード問合せのワードまたは英語でのABOUT問合せのテーマのいずれかです。

また、PL/SQLパッケージCTX_DOCを使用して、ドキュメントから要旨(ドキュメントのサマリー)とテーマ情報を取得することもできます。

表5-2は、取得可能な出力と、各出力を取得するためのプロシージャを示しています。

表5-2 CTX_DOCの出力

出力

プロシージャ

プレーン・テキスト形式、ハイライト表示なし

CTX_DOC.FILTER

HTML形式のドキュメント、ハイライト表示なし

CTX_DOC.FILTER

ハイライト表示されたドキュメント、プレーン・テキスト形式

CTX_DOC.MARKUP

ハイライト表示されたドキュメント、HTML形式

CTX_DOC.MARKUP

プレーン・テキスト形式のハイライト・オフセット情報

CTX_DOC.HIGHLIGHT

HTML形式のハイライト・オフセット情報

CTX_DOC.HIGHLIGHT

ドキュメントのテーマ・サマリーと要旨

CTX_DOC.GIST

ドキュメントのテーマ・リスト

CTX_DOC.THEMES

関連項目:
『Oracle Textリファレンス』

図5-1に、次の項でハイライト表示、要旨作成およびテーマ抽出の対象とする元のドキュメントを示します。

図5-1ハイライト表示、要旨作成およびテーマ抽出のサンプル・ドキュメント

5.3.1 ハイライト表示の例

図5-2は、図5-1のドキュメント内の問合せ語句petをハイライト表示した、問合せアプリケーションの画面です。この出力は、付録A「CONTEXT問合せアプリケーション」で説明するウィザードによって作成されたテキスト問合せアプリケーションを使用して作成されました。

図5-2 petがハイライト表示されたPet Magnetドキュメント

5.3.2 ドキュメントのテーマ・リストの例

図5-3は、図5-1に示したドキュメントのテーマ・リストを表示している問合せアプリケーションの画面です。この出力は、付録A「CONTEXT問合せアプリケーション」で説明するウィザードによって作成されたテキスト問合せアプリケーションを使用して作成されました。

図5-3 ドキュメントのテーマを表示する問合せアプリケーション

5.3.3 要旨の例

図5-4は、図5-1に示したドキュメントの要旨を表示している問合せアプリケーションの画面です。この出力は、付録A「CONTEXT問合せアプリケーション」で説明するウィザードによって作成されたテキスト問合せアプリケーションを使用して作成されました。

図5-4 ドキュメントの要旨を表示する問合せアプリケーション

6 Oracle Textでのドキュメントの分類

次の項目について説明します。

- ドキュメント分類の概要

- 分類ソリューション

- ルールベース分類

- 管理型分類

- 非管理型分類(クラスタ化分類)

6.1 ドキュメント分類の概要

今日、企業をはじめ様々な組織が直面している主要な問題の1つが情報過多です。不要なドキュメントの中から役立つドキュメントを選別するために、個人も組織も、創意工夫し、リソースを費やす必要に迫られています。

莫大な数のドキュメントを選別する1つの方法が、キーワード検索エンジンの使用です。ただし、キーワード検索には限界があります。キーワード検索のデメリットの1つが、文脈による識別ができないことです。多くの言語で、1つのワードまたは1つのフレーズに複数の意味があるため、検索すると必要でないトピックに多数一致する可能性があります。たとえば、bankというワードには2つの意味があるため、river bankというフレーズに対して問い合せると、Hudson River Bank & Trust Companyに関するドキュメントが戻されることがあります。

代替案として考えられるのは、人間がドキュメントを選び出し、内容によって分類することですが、これも大量のドキュメントがある場合は現実的ではありません。

Oracle Textは、ドキュメント分類の様々な方法を提供します。ルールベース分類では、ユーザー自身が分類ルールを作成します。管理型分類では、ユーザーが事前に分類したサンプル・ドキュメント・セットに基づいて、Oracle Textにより分類ルールが作成されます。非管理型分類(またはクラスタリング)では、分類ルールの記述からドキュメントの分類に至るすべての手順がOracle Textで自動的に実行されます。

6.1.1 分類アプリケーション

Oracle Textを使用すると、ドキュメント分類アプリケーションを作成できます。ドキュメント分類アプリケーションでは、ドキュメントの内容に基づき、いくつかのアクションを実行します。この処理には、将来の検索で使用するカテゴリIDのドキュメントへの割当てや、ユーザーへのドキュメントの送信などが含まれます。これにより、カテゴリ化されたドキュメントのセットまたはストリームができます。図6-1に、分類プロセスの流れを示します。

Oracle Textを使用すると、ドキュメント分類アプリケーションを様々な方法で作成できます。この章では、典型的な分類方法を定義し、Oracle Textを使用したソリューションの構築方法を説明します。

図6-1 ドキュメント分類アプリケーションの概要

6.2 分類ソリューション

Oracle Textを使用すると、次の方法でドキュメントを分類できます。

- ルールベース分類。ルールベース分類では、ドキュメントをグループ化し、カテゴリを決定し、そのカテゴリを定義する(実際には問合せフレーズとなる)ルールを作成します。次に、そのルールに索引を付け、MATCHES演算子を使用してドキュメントを分類します。
メリット: ルールベース分類は、小さなドキュメント・セットに対しては非常に正確です。ユーザーがルールを作成しているため、常にユーザーの定義に基づいた結果が出ます。

デメリット: カテゴリが多数である大きなドキュメント・セットに対してルールを定義する作業は、冗長になる可能性があります。ドキュメント・セットが大きくなるにつれ、対応するルールをさらに作成する必要があります。

- 管理型分類。このメソッドはルールベース分類に類似していますが、ルール作成の手順はCTX_CLS.TRAINによって自動化されます。CTX_CLS.TRAINにより、ユーザーが提供する事前分類済のサンプル・ドキュメント・セットから、一連の分類ルールが形成されます。ルールベース分類と同様に、MATCHES演算子を使用してドキュメントを分類します。
Oracle Textには、2つのバージョンの管理型分類があります。1つはRULE_CLASSIFIERプリファレンスを使用したもので、もう1つはSVM_CLASSIFIERプリファレンスを使用したものです。これらについては、「管理型分類」で説明しています。

メリット: ルールが自動的に作成されます。これは、大きなドキュメント・セットに対して役立ちます。

デメリット:

- ルールを生成する前にドキュメントをカテゴリに割り当てる必要があります。

- ルールは、ユーザーが自分で作成したものには、特定的または正確ではない場合があります。

- 非管理型分類(クラスタ化分類)。ドキュメントのグループ化からカテゴリ・ルール作成までのすべての手順がCTX_CLS.CLUSTERINGによって自動化されます。Oracle Textでは、ドキュメント・セットを統計的に分析し、その内容に応じてそれらをクラスタと相関付けます。
メリット:

- ユーザーが分類ルールや参考用のサンプル・ドキュメントを提供する必要はありません。

- ユーザーが見すごす可能性がある、ドキュメント・セットのパターンおよび内容の類似性を検出できます。
実際には、ルールまたは分類の方法を見出せない場合に、非管理型分類を使用できます。また、非管理型分類を使用して最初のカテゴリ・セットを作成し、それを基にして管理型分類を行う方法もあります。

デメリット:

- クラスタ化処理はユーザー定義ではなく内部アルゴリズムに基づいているため、クラスタ化によって予期しないグループ化となる可能性があります。

- クラスタを作成するルールは表示できません。

- クラスタ化はCPU集中型の処理であり、少なくとも索引付けと同じ時間がかかります。

6.3 ルールベース分類

ルールベース分類(「単純な分類」とも呼ばれます)は、Oracle Text分類アプリケーションを作成する基本的な方法です。

ルールベース分類の基本的な手順は、次のとおりです。手順の詳細は、例で説明します。

1. 分類するドキュメント用の表を作成し、それにドキュメントを移入します。

2. ルール表(カテゴリ表ともいう)を作成します。ルール表は、開発者がネーミングしたカテゴリ(「medicine(医学)」または「finance(会計)」など)、およびドキュメントをこれらのカテゴリにソートするルールで構成されます。
これらのルールが実際の問合せとなります。たとえば、「medicine(医学)」カテゴリを、「hospital(病院)」、「doctor(医者)」または「disease(病気)」などのワードを含むドキュメントで構成すると定義した場合、「hospital OR doctor OR disease」というルールを設定することになります。問合せに使用できる演算子の詳細は、「CTXRULEパラメータおよび制限事項」を参照してください。

3. ルール表でCTXRULE索引を作成します。

4. ドキュメントを分類します。

6.3.1 ルールベース分類の例

この例では、様々な主題に関する新しい記事を収集し、分類します。

独自のルールが作成されると、それを索引付けし、MATCHES文を使用してドキュメントを分類できます。その手順は次のとおりです。

手順1   スキーマの作成

データを格納する表を作成します。news_tableに、分類するドキュメントが格納されます。news_categories表に、カテゴリおよびカテゴリを定義するルールが格納されます。news_id_cat表に、分類後のドキュメントIDおよび関連するカテゴリが格納されます。

create table news_table (
tk number primary key not null,
title varchar2(1000),
text clob);

create table news_categories (
queryid  number primary key not null,
category varchar2(100),
query    varchar2(2000));

create table news_id_cat (
tk number,
category_id number);

手順2   SQLLDRを使用したドキュメントのロード

この手順では、SQLLDRプログラムを使用して、news_tableにHTMLの新しい記事をロードします。ファイル名およびタイトルはloader.datから読み取ります。

LOAD DATA
INFILE 'loader.dat'
INTO TABLE news_table
REPLACE
FIELDS TERMINATED BY ';'
(tk         INTEGER EXTERNAL,
title      CHAR,
text_file  FILLER CHAR,
text       LOBFILE(text_file) TERMINATED BY EOF)

手順3   カテゴリの作成

この手順では、カテゴリを定義し、各カテゴリのルールを作成します。

定義済カテゴリ:

United States(米国)

Europe(ヨーロッパ)

Middle East(中東)

Asia(アジア)

Africa(アフリカ)

Conflicts(紛争)

Finance(会計)

Technology(科学技術)

Consumer Electronics(家庭用電化製品)

Latin America(ラテン・アメリカ)

World Politics(国際政治)

U.S. Politics(米国政治)

Astronomy(天文学)

Paleontology(古生物学)

Health(健康)

Natural Disasters(自然災害)

Law(法律)

Music News(ミュージック・ニュース)

ルールとは、カテゴリに対するドキュメントを選択する問合せのことです。たとえば、カテゴリ「Asia(アジア)」には、「China or Pakistan or India or Japan」というルールがあります。news_categories表に次のようにルールを挿入します。

insert into news_categories values
(1,'United States','Washington or George Bush or Colin Powell');

insert into news_categories values
(2,'Europe','England or Britain or Germany');

insert into news_categories values
(3,'Middle East','Israel or Iran or Palestine');

insert into news_categories values(4,'Asia','China or Pakistan or India or Japan');

insert into news_categories values(5,'Africa','Egypt or Kenya or Nigeria');

insert into news_categories values
(6,'Conflicts','war or soliders or military or troops');

insert into news_categories values(7,'Finance','profit or loss or wall street');
insert into news_categories values
(8,'Technology','software or computer or Oracle
or Intel or IBM or Microsoft');

insert into news_categories values
(9,'Consumer electronics','HDTV or electronics');

insert into news_categories values
(10,'Latin America','Venezuela or Colombia
or Argentina or Brazil or Chile');

insert into news_categories values
(11,'World Politics','Hugo Chavez or George Bush
or Tony Blair or Saddam Hussein or United Nations');

insert into news_categories values
(12,'US Politics','George Bush or Democrats or Republicans
or civil rights or Senate or White House');

insert into news_categories values
(13,'Astronomy','Jupiter or Earth or star or planet or Orion
or Venus or Mercury or Mars or Milky Way
or Telescope or astronomer
or NASA or astronaut');

insert into news_categories values
(14,'Paleontology','fossils or scientist
or paleontologist or dinosaur or Nature');

insert into news_categories values
(15,'Health','stem cells or embryo or health or medical
or medicine or World Health Organization or AIDS or HIV
or virus or centers for disease control or vaccination');

insert into news_categories values
(16,'Natural Disasters','earthquake or hurricane or tornado');

insert into news_categories values
(17,'Law','abortion or Supreme Court or illegal
or legal or legislation');

insert into news_categories values
(18,'Music News','piracy or anti-piracy
or Recording Industry Association of America
or copyright or copy-protection or CDs
or music or artist or song');

commit;

手順4   CTXRULE索引の作成

この手順では、news_categories問合せ列でCTXRULE索引を作成します。

create index news_cat_idx on news_categories(query)
indextype is ctxsys.ctxrule;

手順5   ドキュメントの分類

ドキュメントを分類するには、PL/SQLプロシージャCLASSIFIER.THIS(この例のために設計された簡単なプロシージャ)を使用します。このプロシージャはnews_tableをスクロールして、各ドキュメントをカテゴリに照合し、カテゴリに分類した結果をnews_id_cat表に書き込みます。

create or replace package classifier asprocedure this;end;/

show errors

create or replace package body classifier as

procedure this
is
v_document    clob;
v_item        number;
v_doc         number;
begin

for doc in (select tk, text from news_table)
loop
v_document := doc.text;
v_item := 0;
v_doc  := doc.tk;
for c in (select queryid, category from news_categories
where matches(query, v_document) > 0 )
loop
v_item := v_item + 1;
insert into news_id_cat values (doc.tk,c.queryid);
end loop;
end loop;

end this;

end;
/
show errors
exec classifier.this

6.3.2 CTXRULEパラメータおよび制限事項

次の考慮事項は、CTXRULE索引の索引付けに適用されます。

- SVM_CLASSIFIER分類が使用される場合は、BASIC_LEXER、CHINESE_LEXER、JAPANESE_LEXERまたはKOREAN_MORPH_LEXERレクサーを使用できます。SVM_CLASSIFIERが使用されない場合、問合せセットの索引付けに使用できるのはBASIC_LEXERレクサー・タイプのみです。(レクサーおよび分類のプリファレンスの詳細は、『Oracle Textリファレンス』を参照してください。)

- filter、memory、datastoreおよび[no]populateの各パラメータは、索引タイプCTXRULEには適用できません。

- CREATE INDEXのSTORAGE句は、問合せでCTXRULE索引を作成するためにサポートされています。

- ワードリストは、問合せセットに対するステミング操作でサポートされています。

- CTXRULEに対する問合せは、CONTAINS問合せと類似しています。CONTAINS演算子(ABOUT、AND、NEAR、NOT、OR、STEM、WITHINおよびTHESAURUS)とともに、基本的なフレーズ(dog house)がサポートされています。MATCHES演算子を使用してドキュメントを分類する場合、セクション・グループがサポートされています。フィールド・セクションもサポートされていますが、CTXRULEではフィールド問合せが直接サポートされないため、CONTEXT問合せに対しては問合せリライトを使用する必要があります。

関連項目:
「CTXRULE索引の作成」

6.4 管理型分類

管理型分類では、CTX_CLS.TRAINプロシージャを使用してルール記述の手順を自動化します。CTX_CLS.TRAINでは、サンプル・ドキュメントのトレーニング・セットを使用して分類ルールが推定されます。この点が、ユーザー自身が分類ルールを作成する必要があるルールベース分類と比較して大きなメリットとなります。

ただし、CTX_CLS.TRAINプロシージャを実行する前に、カテゴリを手動で作成し、サンプル・トレーニング・セットの各ドキュメントをカテゴリに割り当てる必要があります。CTX_CLS.TRAINの詳細は、『Oracle Textリファレンス』を参照してください。

ルールが生成されると、ユーザーがそれを索引付けし、CTXRULE索引を作成します。次に、MATCHES演算子を使用して、新規ドキュメントの着信ストリームを分類できます。

管理型分類の場合、2つの異なる分類アルゴリズムを選択できます。

- 意思決定ツリー分類。意思決定ツリー分類のメリットは、生成したルールを簡単に監視(または変更)できる点です。

- SVMベース分類。このメソッドでは、サポート・ベクター・マシン(SVM)・アルゴリズムを使用してルールを作成します。SVMベース分類のメリットは、通常、意思決定ツリー分類より正確である点です。デメリットは、バイナリ・ルールが生成されるため、ルール自体が不明瞭になる点です。

6.4.1 意思決定ツリー管理型分類

意思決定ツリー分類を使用するには、RULE_CLASSIFIERに対して、プリファレンス引数をCTX_CLS.TRAINに設定します。

この分類形式では、ルールの作成に意思決定ツリー・アルゴリズムが使用されます。一般的には、意思決定ツリーは2つ(あるいは3つ以上だが、通常は2つ)の選択肢の間で決定するメソッドです。ドキュメント分類では、選択肢は「トレーニング・セットに一致するドキュメント」か「トレーニング・セットに一致しないドキュメント」です。

意思決定ツリーには、テストできる属性のセットがあります。この場合、次が含まれます。

- ドキュメントのワード

- ドキュメントのワードのステム(たとえば、「running」のステムは「run」)

- ドキュメントのテーマ(テーマが使用されている言語でサポートされている場合)

Oracle Textの学習アルゴリズムにより、トレーニング・セットで提供される各カテゴリに対して、1つ以上の意思決定ツリーが作成されます。これらの意思決定ツリーは、CTXRULE索引で適切に使用できるように、問合せにコード化されます。通常は、「Japanese beetle」で構成されたトレーニング・ドキュメントを含む、あるカテゴリおよび「Japanese currency」に関するドキュメントを含む別のカテゴリが提供された場合、アルゴリズムにより、ワード「Japanese」、「beetle」および「currency」に基づいて意思決定ツリーが作成され、それに応じてドキュメントが分類されます。

意思決定ツリーには、信頼度という概念が含まれます。生成された各ルールには、現行のトレーニング・セットのルールの正確さを表す、パーセンテージ値が割り当てられます。通常、この正確さは常にほぼ100%ですが、これは単にトレーニング・セットの限界を表しています。同様に、通常のトレーニング・セットで生成されたルールの数がユーザーが予想した数よりも少ない場合がありますが、これは、現行のトレーニング・セットの様々なカテゴリを識別するには十分な数です。

意思決定ツリー・メソッドのメリットは、人間が簡単に検査したり変更できるルールを生成できる点です。コンピュータでルールを生成し、その後でルール・セットを編集してユーザーがルールを微調整する場合に、意思決定ツリー分類は役立ちます。

6.4.1.1 意思決定ツリー管理型分類の例

次のSQL例では、ドキュメントおよび分類表の作成、ドキュメントの分類、およびルールの生成の手順を示します。次に、CTX_CLS.TRAINを使用してルールを生成します。

ルールが索引付けされるとCTXRULE索引が作成され、新規ドキュメントはMATCHESを使用して分類されます。

管理型分類の一般的な手順は、次のようになります。

- カテゴリ・ルールの作成

- 新規ドキュメントをカテゴリ化するルールの索引付け

6.4.1.1.1 カテゴリ・ルールの作成

CTX_CLS.TRAINプロシージャでは、入力トレーニング・ドキュメント・セットが必要です。トレーニング・セットとは、すでにカテゴリに割り当てられたドキュメントのセットです。

手順1   トレーニング・ドキュメント表の作成および移入

トレーニング・ドキュメントの表を作成してロードします。次の例では、単純なセットを使用します。ファスト・フード関連が3つとコンピュータ関連が2つです。

create table docs (
doc_id number primary key,
doc_text   clob);

insert into docs values
(1, 'MacTavishes is a fast-food chain specializing in burgers, fries and -
shakes. Burgers are clearly their most important line.');
insert into docs values
(2, 'Burger Prince are an up-market chain of burger shops, who sell burgers -
and fries in competition with the likes of MacTavishes.');
insert into docs values
(3, 'Shakes 2 Go are a new venture in the low-cost restaurant arena,
specializing in semi-liquid frozen fruit-flavored vegetable oil products.');
insert into docs values
(4, 'TCP/IP network engineers generally need to know about routers,
firewalls, hosts, patch cables networking etc');
insert into docs values
(5, 'Firewalls are used to protect a network from attack by remote hosts,
generally across TCP/IP');

手順2   カテゴリ表、カテゴリ説明およびIDの作成

----------------------------------------------------------------------------

-- Create category tables
-- Note that "category_descriptions" isn't really needed for this demo -
-- it just provides a descriptive name for the category numbers in
-- doc_categories
----------------------------------------------------------------------------

create table category_descriptions (
cd_category    number,
cd_description varchar2(80));

create table doc_categories (
dc_category    number,
dc_doc_id      number,
primary key (dc_category, dc_doc_id))
organization index;

-- descriptons for categories

insert into category_descriptions values (1, 'fast food');
insert into category_descriptions values (2, 'computer networking');

手順3   カテゴリへの各ドキュメントの割当て

この場合、ファスト・フードのドキュメントはすべてカテゴリ1に、コンピュータのドキュメントはカテゴリ2になります。

insert into doc_categories values (1, 1);
insert into doc_categories values (1, 2);
insert into doc_categories values (1, 3);
insert into doc_categories values (2, 4);
insert into doc_categories values (2, 5);

手順4   CTX_CLS.TRAINで使用するCONTEXT索引の作成

索引用にOracle Textプリファレンスを作成します。これにより、次のように、テーマをオンにした場合とオフにした場合の効果を実験できます。

exec ctx_ddl.create_preference('my_lex', 'basic_lexer');
exec ctx_ddl.set_attribute    ('my_lex', 'index_themes', 'no');
exec ctx_ddl.set_attribute    ('my_lex', 'index_text',   'yes');

create index docsindex on docs(doc_text) indextype is ctxsys.context
parameters ('lexer my_lex');

手順5   ルール表の作成

生成したルールに移入する表を作成します。

create table rules(
rule_cat_id     number,
rule_text       varchar2(4000),
rule_confidence number
);

手順6   カテゴリ・ルールを生成するCTX_CLS.TRAINプロシージャのコール

ここで、CTX_CLS.TRAINプロシージャをコールしてルールの一部を生成します。すべての引数が、表、列またはこの例で以前に作成された索引の名前であることに注意してください。これにより、rules表にルールが含まれ、ユーザーが表示できるようになります。

begin
ctx_cls.train(
index_name => 'docsindex',
docid      => 'doc_id',
cattab     => 'doc_categories',
catdocid   => 'dc_doc_id',
catid      => 'dc_category',
restab     => 'rules',
rescatid   => 'rule_cat_id',
resquery   => 'rule_text',
resconfid  => 'rule_confidence'
);
end;
/

手順7   カテゴリが表示する、生成済ルールのフェッチ

生成済のルールをフェッチします。便宜上、rules表はcategory_descriptionsと結合され、各ルールが適用されるカテゴリを表示できるようになります。

select cd_description, rule_confidence, rule_text from rules,
category_descriptions where cd_category = rule_cat_id;

6.4.1.1.2 新規ドキュメントをカテゴリ化するルールの索引付け

ルールが生成されると、ユーザーは最初の索引付けでルールをテストし、次にMATCHESを使用して新規ドキュメントを分類できます。そのプロセスは、次のとおりです。

手順1   CTXRULE索引を作成するルールの索引付け

CREATE INDEXを使用し、以前に生成したルールにCTXRULE索引を作成します。

create index rules_idx on rules (rule_text) indextype is ctxsys.ctxrule;

手順2   MATCHESを使用した、着信ドキュメントのテスト

set serveroutput on;

declare
incoming_doc clob;
begin
incoming_doc
:= 'I have spent my entire life managing restaurants selling burgers';
for c in
( select distinct cd_description from rules, category_descriptions
where cd_category = rule_cat_id
and matches (rule_text, incoming_doc) > 0) loop
dbms_output.put_line('CATEGORY: '||c.cd_description);
end loop;
end;
/

6.4.2 SVMベース管理型分類

トレーニング目的に使用できる2番目のメソッドは、サポート・ベクター・マシン(SVM)分類です。SVMは、統計学習理論から派生した、学習アルゴリズム・タイプのマシンです。SVM分類の特徴は、非常に小さいサンプル・セットから学習する機能です。

SVM分類を使用すると、意思決定ツリー分類を使用した場合とほぼ同じ結果が得られますが、次の違いがあります。

- CTX_CLS.TRAINのコールで使用するプリファレンスは、RULE_CLASSIFIERではなくSVM_CLASSIFIERと同じタイプになります。(属性を変更しない場合、事前定義済のプリファレンスCTXSYS.SVM_CLASSIFIERを使用できます。)

- 表のCONTEXT索引を移入する必要がないため、NOPOPULATEキーワードを使用できます。これは、データソースおよびフィルタのプリファレンスによってテキストのソースを検索し、レクサーおよびセクショナのプリファレンスを介してテキストの処理方法を決定する場合にのみ使用されます。

- 生成済ルールの表には、(最小限)次の列がある必要があります。

cat_id      number,
type        number,
rule        blob );

見てわかるように、生成されたルールはBLOB列に書き込まれます。そのため、これはユーザーにはわかりにくく、意思決定ツリー分類ルールの場合とは異なり、編集も変更もできません。ここでのトレードオフは、通常、SVMを使用すると、意思決定ツリー分類を使用した場合よりもはるかに高い正確性が得られる点です。

SVM分類では、割当てメモリーはSVMモデルをロードするのに十分な大きさである必要があります。十分でない場合は、SVMに基づいて作成されたアプリケーションでメモリー不足エラーが発生します。メモリー割当ての計算方法は次のとおりです。

Minimum memory request (in bytes) = number of unique categories x number of features
example: (value of MAX_FEATURES attributes) x 8

最小限のメモリー要件と一致させる必要がある場合は、次のいずれかを行います。

- SGAメモリーの増加(共有サーバー・モードの場合)

- PGAメモリーの増加(専用サーバー・モードの場合)

6.4.2.1 SVMベース管理型分類の例

次の例ではSVMベース分類を使用します。基本的には意思決定ツリーの例と同じ手順を使用しています。ただし、次の違いがあります。

- この例では、CTX_CLS.TRAINではなくCTX_DDL.CREATE_PREFERENCEを使用して、SVM_CLASSIFIERプリファレンスを設定します。(どちらでも可能です。)

- この例では、意思決定ツリーの例のカテゴリ表とは異なり、カテゴリ表にはカテゴリ説明が含まれます。(どちらでも可能です。)

- ユーザーにとってルールがわかりにくいため、CTX_CLS.TRAINは、意思決定ツリーの例より少ない引数を取ります。

手順1   トレーニング・ドキュメント表の作成および移入

create table doc (id number primary key, text varchar2(2000));
insert into doc values(1,'1 2 3 4 5 6');
insert into doc values(2,'3 4 7 8 9 0');
insert into doc values(3,'a b c d e f');
insert into doc values(4,'g h i j k l m n o p q r');
insert into doc values(5,'g h i j k s t u v w x y z');

手順2   カテゴリ表の作成および移入

create table testcategory (
doc_id number,
cat_id number,
cat_name varchar2(100)
);
insert into testcategory values (1,1,'number');
insert into testcategory values (2,1,'number');
insert into testcategory values (3,2,'letter');
insert into testcategory values (4,2,'letter');
insert into testcategory values (5,2,'letter');

手順3   ドキュメント表のCONTEXT索引の作成

この場合、移入せずに索引を作成します。

create index docx on doc(text) indextype is ctxsys.context
parameters('nopopulate');

手順4   SVM_CLASSIFIERの設定

これは、CTX.CLS_TRAINでも可能です。

exec ctx_ddl.create_preference('my_classifier','SVM_CLASSIFIER');
exec ctx_ddl.set_attribute('my_classifier','MAX_FEATURES','100');

手順5   結果(ルール)表の作成

create table restab (
cat_id number,
type number(3) not null,
rule blob
);

手順6   トレーニングの実行

exec ctx_cls.train('docx', 'id','testcategory','doc_id','cat_id',
'restab','my_classifier');

手順7   ルール表でのCTXRULE索引の作成

exec ctx_ddl.create_preference('my_filter','NULL_FILTER');
create index restabx on restab (rule)
indextype is ctxsys.ctxrule
parameters ('filter my_filter classifier my_classifier');

ここで、2つの未知のドキュメントを分類できます。

select cat_id, match_score(1) from restab
where matches(rule, '4 5 6',1)>50;

select cat_id, match_score(1) from restab
where matches(rule, 'f h j',1)>50;

drop table doc;
drop table testcategory;
drop table restab;
exec ctx_ddl.drop_preference('my_classifier');
exec ctx_ddl.drop_preference('my_filter');

6.5 非管理型分類(クラスタ化分類)

ルールベース分類の場合は、ユーザー自身がドキュメントを分類するルールを作成します。管理型分類の場合は、Oracle Textによりルールが作成されますが、事前分類したトレーニング・ドキュメント・セットを提供する必要があります。非管理型分類(またはクラスタリング)では、では、トレーニング・ドキュメント・セットを提供する必要がありません。

CTX_CLS.CLUSTERINGプロシージャを使用して、クラスタ化が行われます。CTX_CLS.CLUSTERINGにより、クラスタと呼ばれるドキュメント・グループの階層が作成され、ドキュメントごとに全リーフ・クラスタの関連性のスコアが戻されます。

たとえば、動物に関するドキュメントの膨大なコレクションがあるとします。CTX_CLS.CLUSTERINGでは、犬、猫、魚、熊に関するリーフ・クラスタを個別に作成できます。(最初の3つのリーフ・クラスタをペットに関するノード・クラスタの下位にグループ化できます。)さらに、チワワなど、特定の犬種に関するドキュメントがあるとします。CTX_CLS.CLUSTERINGでは、関連性スコアの高いドキュメントに犬のクラスタが割り当てられ、猫のクラスタにはそれより低いスコアが割り当てられ、魚と熊のクラスタにはさらに低いスコアが割り当てられます。すべてのクラスタのスコアがすべてのドキュメントに割り当てられる場合、アプリケーションではスコアに基づいて処理を実行できます。

「意思決定ツリー管理型分類」に示したように、クラスタの決定に使用される属性は単純なワード(またはトークン)、ワードのステムおよびテーマ(サポートされている場合)で構成されます。

CTX_CLS.CLUSTERINGにより、出力は2つの表(メモリー内表)に割り当てられます。

- ドキュメント割当て表は、各リーフ・クラスタに対するドキュメントの類似性を示します。この情報は、ドキュメント識別、クラスタ識別およびドキュメントとクラスタ間の類似性のスコアで表されます。

- クラスタ説明表には、生成されたクラスタに関する情報が含まれます。この表には、クラスタ識別、クラスタ説明テキスト、提示されたクラスタ・ラベル、およびクラスタの品質スコアが含まれます。

CTX_CLS.CLUSTERINGでは、K-MEANアルゴリズムを使用して、クラスタ化を実行します。KMEAN_CLUSTERINGプリファレンスを使用して、CTX_CLS.CLUSTERINGの操作方法を決定します。

関連項目:
クラスタ・タイプおよび階層的クラスタ化の詳細は、『Oracle Textリファレンス』を参照してください。

6.5.1 クラスタ化の例

次のSQL例では、コレクション表でドキュメントの小さなコレクションを作成し、CONTEXT索引を作成します。次に、ドキュメント割当て表およびクラスタ記述表を作成しますが、これらはCLUSTERINGプロシージャに対するコールを使用して移入されます。出力は、SELECT文を使用して表示されます。

set serverout on

/* collect document into a table */
create table collection (id number primary key, text varchar2(4000));
insert into collection values (1, 'Oracle Text can index any document or textual content.');
insert into collection values (2, 'Ultra Search uses a crawler to access documents.');
insert into collection values (3, 'XML is a tag-based markup language.');
insert into collection values (4, 'Oracle Database 11g XML DB treats XML
as a native datatype in the database.');
insert into collection values (5, 'There are three Text index types to cover
all text search needs.');
insert into collection values (6, 'Ultra Search also provides API
for content management solutions.');

create index collectionx on collection(text)
indextype is ctxsys.context parameters('nopopulate');

/* prepare result tables, if you omit this step, procedure will create table automatically */
create table restab (
docid NUMBER,
clusterid NUMBER,
score NUMBER);

create table clusters (
clusterid NUMBER,
descript varchar2(4000),
label varchar2(200),
sze   number,
quality_score number,
parent number);

/* set the preference */
exec ctx_ddl.drop_preference('my_cluster');
exec ctx_ddl.create_preference('my_cluster','KMEAN_CLUSTERING');
exec ctx_ddl.set_attribute('my_cluster','CLUSTER_NUM','3');

/* do the clustering */
exec ctx_output.start_log('my_log');
exec ctx_cls.clustering('collectionx','id','restab','clusters','my_cluster');
exec ctx_output.end_log;

関連項目
CTX_CLS.CLUSTERING構文および例の詳細は、『Oracle Textリファレンス』を参照してください。

7 Oracle Textのチューニング

この章では、問合せおよび索引付けのパフォーマンスを改善する方法について説明します。次の項目について説明します。

- 応答時間短縮のための問合せの最適化

- スループット向上のための問合せの最適化

- Oracle Textのコンポジット・ドメイン索引(CDI)

- トレースを使用した索引および問合せのボトルネックの解決

- パラレル問合せの使用

- ブロック操作による問合せのチューニング

- 問合せのパフォーマンスに関するFAQ(よくある質問)

- 索引付けのパフォーマンスに関するFAQ(よくある質問)

- 索引の更新に関するFAQ(よくある質問)

7.1 応答時間短縮のための問合せの最適化

デフォルトでは、Oracle Textにより、問合せはスループット向上のために最適化されます。最適化の結果、問合せは最短時間ですべての行を戻します。

ただし、多くの場合(特にWebアプリケーションの場合)、問合せを応答時間が短縮されるように最適化する必要があります。これは大きなヒットリストからできるだけ短い時間で、最初の数個のヒットのみを取得する必要があるためです。

次の各項では、応答時間が短縮されるようにCONTAINS問合せを最適化する方法を説明します。

- FIRST_ROWS(n)ヒントによるORDER BY問合せの応答時間の短縮

- ローカル・パーティションCONTEXT索引を使用した応答時間の短縮

- スコア順のローカル・パーティション索引を使用した応答時間の短縮

7.1.1 問合せの応答時間に影響するその他の要因

次のような要因が問合せ応答時間に影響します。

- 表統計の収集

- メモリー割当て

- ソート

- 元表に存在するLOB列

- パーティション化

- 並列性

- 問合せで語句を拡張する回数

関連項目:
「問合せのパフォーマンスに関するFAQ(よくある質問)」

7.1.2 FIRST_ROWS(n)ヒントによるORDER BY問合せの応答時間の短縮

ORDER BY問合せの最初のいくつかの行が必要な場合は、コストベースであるFIRST_ROWS(n)ヒントを使用することをお薦めします。

FIRST_ROWS(n)ヒントは、最初の(n)行をできるだけ短時間で受け取る必要がある場合に使用します。たとえば、次のPL/SQLブロックでは、カーソルを使用して問合せの最初の10ヒットを取り出し、FIRST_ROWS(n)ヒントを使用して応答時間が短縮されるように最適化しています。

declare
cursor c is

select /*+ FIRST_ROWS(10) */ article_id from articles_tab
where contains(article, 'Omophagia')>0 order "by pub_date desc;

begin

for i in c
loop
insert into t_s values(i.pk, i.col);
exit when c%rowcount > 11;
end loop;

end;
/

カーソルcはomophagiaというワードを含むソートされたROWIDを戻すSELECT文です。コードがカーソル内をループして、最初の10行を取り出します。取り出された行は、一時表t_sに格納されます。

FIRST_ROWS(n)ヒントを指定した場合、オプティマイザは上位n個のヒットを戻すコストが低い場合に、テキスト索引に対してROWIDをスコア順で戻すように指示します。

このヒントがない場合、テキスト索引によりCONTAINS述語を満たすすべての行がソートされていない順序で戻された後、Oracle DatabaseによりROWIDがソートされます。このように結果セット全体を取り出すと時間がかかります。

この問合せでは、最初の10ヒットのみが必要なため、ヒントを使用することでパフォーマンスが向上します。

注意:
FIRST_ROWS(n)ヒントは、問合せで最初の数個のヒットのみが必要な場合に使用します。結果セット全体が必要な場合は、パフォーマンスの低下につながるため、このヒントは使用しないでください。

7.1.2.1 DOMAIN_INDEX_SORTヒントについて

また、DOMAIN_INDEX_SORTヒントを使用して応答時間を短縮することもできます。FIRST_ROWS(n)の場合と同じように、応答時間が短縮されるように問合せが最適化されている場合は、Oracle Textは最初の数行を最短時間で戻します。

たとえば、このヒントは次のように使用できます。

select /*+ DOMAIN_INDEX_SORT */ pk, score(1), col from ctx_tab
where contains(txt_col, 'test', 1) > 0 order by score(1) desc;

ただし、このヒントはルールベースのみです。つまり、Oracle Textでは、ORDER BY句を満たす索引を常に選択します。この結果、CONTAINS句の選択性が非常に高い問合せでは、パフォーマンスが最善にはならないことがあります。そのような場合は、完全にコストベースのFIRST_ROWS(n)ヒントを使用することをお薦めします。

7.1.3 ローカル・パーティションCONTEXT索引を使用した応答時間の短縮

データをパーティション化し、ローカル・パーティション索引を作成すると、問合せのパフォーマンスが向上します。パーティション表では、各パーティションに独自の索引表セットがあります。実際には複数の索引がありますが、各索引からの結果が必要に応じて組み合され、最終的な結果セットが生成されます。

LOCALキーワードを使用して、CONTEXT索引を次のように作成します。

CREATE INDEX index_name ON table_name (column_name)
INDEXTYPE IS ctxsys.context
PARAMETERS ('...')
LOCAL

パーティション化された表および索引を使用すると、次のような問合せのパフォーマンスが向上します。

- パーティション・キー列に対する範囲検索

- パーティション・キー列でのORDER BY

7.1.3.1 パーティション・キー列に対する範囲検索

これは、パーティション・キー列の特定の値範囲に検索を限定する問合せです。たとえば、日付範囲に対する次の問合せについて考えます。

SELECT storyid FROM storytab WHERE CONTAINS(story, 'oliver')>0 and pub_date BETWEEN '1-OCT-93' AND '1-NOV-93';

日付範囲が制限されている場合は、1つのパーティションを検索するだけで問合せが満たされる可能性があります。

7.1.3.2 パーティション・キー列でのORDER BY

これは、最初のn個のヒットのみが必要で、ORDER BY句がパーティション・キーを指定する問合せです。次のように、price列に対するORDER BY問合せで最初の20ヒットをフェッチする場合を考えてみます。

SELECT * FROM (

SELECT itemid FROM item_tab WHERE CONTAINS(item_desc, 'cd player')
>0 ORDER BY price)
WHERE ROWNUM < 20;

この例では、表はpriceによりパーティション化されており、最初のパーティションからのヒットを取得すれば問合せが満たされる可能性があります。

7.1.4 スコア順のローカル・パーティション索引を使用した応答時間の短縮

ローカル・パーティション索引に対してDOMAIN_INDEX_SORTヒントを使用すると、特にスコア順にした場合にパフォーマンスが大幅に低下することがあります。これは、結果をソートする前に、全パーティションにまたがる問合せの全ヒットを取得する必要があるためです。

パフォーマンスの低下を回避するには、DOMAIN_INDEX_SORTヒントを使用するときにインライン・ビューを使用します。DOMAIN_INDEX_SORTヒントを使用すると、次のような条件下で、ローカル・パーティション表の問合せパフォーマンスを向上させることができます。

- SCORE()句による順序を含むテキスト問合せ自体がインライン・ビューとして表されている場合

- インライン・ビュー内のテキスト問合せにDOMAIN_INDEX_SORTヒントが含まれている場合

- インライン・ビューに対する問合せに、ビューからフェッチする行数を制限するROWNUM述語が含まれている場合

たとえば、次のテキスト問合せがあり、パーティション表doc_tabに対してローカル・テキスト索引が作成されているとします。

select doc_id, score(1) from doc_tab
where contains(doc, 'oracle', 1)>0
order by score(1) desc;

ここで、上位20行のみを取り出す場合は、この問合せを次のように再作成します。

select * from
(select /*+ DOMAIN_INDEX_SORT */ doc_id, score(1) from doc_tab
where contains(doc, 'oracle', 1)>0 order by score(1) desc)
where rownum < 21;

関連項目:

- 問合せオプティマイザの詳細およびDOMAIN_INDEX_SORTなどのヒントの使用方法は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

- EXPLAIN PLAN文の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』および『Oracle Database SQL言語リファレンス』を参照してください。

7.2 スループット向上のための問合せの最適化

問合せがスループット向上のために最適化された場合は、すべてのヒットが最短時間で戻されます。これはデフォルトの動作です。

次の各項では、スループット向上のために明示的に最適化する方法を説明します。

7.2.1 CHOOSEモードおよびALL_ROWSモード

デフォルトでは、問合せはCHOOSEモードおよびALL_ROWSモードでスループットが向上するように最適化されます。問合せがスループット向上のために最適化された場合は、Oracle Textによってすべての行が最短時間で戻されます。

7.2.2 FIRST_ROWS(n)モード

FIRST_ROWS(n)モードでは、可能な場合、テキスト・ドメイン索引でスコア順にソートされた行が戻されるようにすることで応答時間を短縮するよう、Oracle Databaseのオプティマイザが最適化を行います。これは、FIRST_ROWS(n)ヒントを使用する場合のデフォルトの動作です。

FIRST_ROWS(n)でスループットがさらに向上するように最適化するには、DOMAIN_INDEX_NO_SORTヒントを使用します。スループットの向上とは、すべての行を最短時間で問合せに取り込むことです。

次の例では、スコア順にソートした行を戻すためにテキスト・ドメイン索引を使用せずにスループットを向上させています。かわりに、CONTAINS述語を満たすすべての行が索引から取り出された後で、Oracle Textによって行がソートされます。

select /*+ FIRST_ROWS(10) DOMAIN_INDEX_NO_SORT */ pk, score(1), col from ctx_tab
where contains(txt_col, 'test', 1) > 0 order by score(1) desc;

関連項目:
問合せオプティマイザの詳細、およびFIRST_ROWS(n)やCHOOSEなどのヒントの使用方法は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

7.3 Oracle Textのコンポジット・ドメイン索引(CDI)

Oracle Database 11gの拡張性フレームワークのコンポジット・ドメイン索引機能を使用すると、構造化された列をOracle Textで索引付けできます。したがって、テキストと1つ以上の構造化された条件の両方が、Oracle Textの単一の索引の行ソースによって満たされます。次のタイプの問合せのパフォーマンスが向上します。

- SQL WHERE句内の、構造化された条件を持つテキスト問合せ

- 構造化されたORDER BY条件を持つテキスト問合せ

- 前述の2つの問合せタイプの両方の組合せ

連結されたBツリー索引やビットマップ索引と同様、FILTER BY列およびORDER BY列の数が増えるに従って、アプリケーションではDMLのパフォーマンスが低下します。SCOREによるソートのプッシュダウンが応答時間の短縮のために最適化されている場合、構造化されたソートまたはSCOREと構造化されたソートの組合せのプッシュダウンも同様に、スループットの向上ではなく応答時間の短縮のために最適化されます。ただし、DOMAIN_INDEX_SORTヒントまたはFIRST_ROWS(n)ヒントを使用してフェッチ中にCDIにソートを含めるよう強制した場合、ヒットリスト全体を表示するには問合せ応答時間が大幅にかかります。

7.3.1 CDIによるパフォーマンス・チューニング

FILTER BY列のMDATAへのマッピングがサポートされているため、RANGEおよびLIKEのサポートされた機能を制限することで、問合せのパフォーマンスは等価性検索に対して最適化されます。ただし、FILTER BY列が連続した値を含むかまたはそのカーディナリティが非常に高い場合は、FILTER BY列のMDATAへのマッピングはお薦めしません。このマッピングを実行した場合、非常に細長い$I表が作成され、$Xのパフォーマンスが低下します。このような連続した列の一例として、DATEスタンプを使用した場合があります。このような連続した列の場合は、SDATAへのマッピングをお薦めします。

SORT述語およびFILTER BY述語をCDIに含めるか含めないかには、次のヒントを使用できます。

- DOMAIN_INDEX_SORT。問合せオプティマイザは、適用可能なソート条件を、指定したコンポジット・ドメイン索引に含めようとします。

- DOMAIN_INDEX_NO_SORT。問合せオプティマイザは、ソート条件を、指定したコンポジット・ドメイン索引に含めないようにします。

- DOMAIN_INDEX_FILTER(table name index name)。問合せオプティマイザは、適用可能なFILTER BY述語を、指定したコンポジット・ドメイン索引に含めます。

- DOMAIN_INDEX_NO_FILTER(table name index name)。問合せオプティマイザは、適用可能なFILTER BY述語を、指定したコンポジット・ドメイン索引に含めないようにします。

例7-1 CDIヒントを使用したテキスト問合せのパフォーマンス・チューニング

次の例では、表booksに対し、最適化された問合せを実行しています。

SELECT bookid, pub_date, source FROM
(SELECT /*+ domain_index_sort domain_index_filter(books books_ctxcdi) */ bookid, pub_date, source
FROM books
WHERE CONTAINS(text, 'aaa',1)>0 AND bookid >= 80
ORDER BY PUB_DATE desc nulls last, SOURCE asc  nulls last, score(1) desc)
WHERE rownum < 20;

注意:
domain_index_filterヒントは、問合せオプティマイザにCDIの使用を強制しません。かわりに、コストベース・オプティマイザがCDIの使用を選択している場合は、フィルタ述語も索引に含められます。問合せオプティマイザにCDI索引の選択を強制するには、さらにINDEXヒントも使用する必要があります。

7.4 トレースを使用した索引および問合せのボトルネックの解決

Oracle Textには、索引付けおよび問合せにおけるボトルネックを特定するためのトレース機能が備わっています。

Oracle Textには、事前定義済のトレースのセットが用意されています。各トレースは一意の番号で識別されます。また、この番号に対するCTX_OUTPUTの記号があります。

各トレースでは、特定の数量を測定します。たとえば、テキスト問合せ時に選択される$I行の数などです。

トレースは累積カウンタです。そのため、使用方法は次のようになります。

1. ユーザーがトレースを使用可能にします。

2. ユーザーが複数の操作を実行します。Oracle Textではアクティビティを測定し、トレースの結果を累積します。

3. ユーザーがトレース値を取得します。これは、手順2で実行されたすべての操作の合計値となります。

4. ユーザーがトレースを0(ゼロ)に再設定します。

5. ユーザーが手順2を繰り返します。

このため、たとえば、手順2でユーザーが2つの問合せを実行し、問合せ1で$Iから15行を選択し、問合せ2で$Iから17行を選択した場合、手順3ではトレースの値は32(15 + 17)となります。

トレースは1つのセッションに関連付けられています。トレースは、1つのセッション内で発生した演算を測定できますが、反対に、複数のセッション間で測定を行うことはできません。

パラレル同期化または最適化中に、トレーシングが現在使用可能である場合のみ、トレース・プロファイルはスレーブ・セッションにコピーされます。各スレーブでは、独自のトレースを累積し、終了前にすべてのトレース値を暗黙的にスレーブ・ログ・ファイルに書き込みます。

関連項目:
『Oracle Textリファレンス』

7.5 パラレル問合せの使用

一般に、パラレル問合せは、大規模なデータ・コレクションと複数のCPUを備え、同時ユーザー数が少ないDSS、OLAPまたは分析システムに最も適しています。または、Oracle Real Application Clusters(Oracle RAC)ノード間でパラレル化されます。

Oracle Textでは、次のようにパラレル問合せをサポートしています。

- ローカルのCONTEXT索引でのパラレル問合せ

- Oracle RACノード間のパラレル問合せ

7.5.1 ローカルのCONTEXT索引でのパラレル問合せ

パラレル問合せは、ローカルのCONTEXT索引のパラレル処理を指します。索引の並列度と様々なシステム属性に基づいて、Oracleにより、索引処理のために起動されるパラレル問合せスレーブの数が決定されます。各パラレル問合せスレーブが、1つ以上の索引パーティションを処理します。これは、パラレルに作成されたローカル索引のデフォルトの問合せ動作です。

ただし、同時ユーザー数が多く負荷の高いシステムで問合せが連続的に実行される場合は、通常上位N個のヒットが最初の数個のパーティションによって満たされるため、問合せのスループットはパラレル問合せによって一般に低下します。たとえば、次のような、ORDER BYパーティション・キー列を持つ典型的な上位N個のテキスト問合せでは、

select * from (
select story_id from stories_tab where contains(...)>0 order by
publication_date desc)
where rownum <= 10;

通常、パラレル問合せを使用するとパフォーマンスが下がります。

ALTER INDEX文を次のように使用して、パラレル索引の操作後にパラレル問合せを使用禁止にできます。

Alter index <text index name> NOPARALLEL;
Alter index <text index name> PARALLEL 1;

次のように指定すると、パラレル問合せを使用可能にするか、並列度を上げることができます。

Alter index <text index name> parallel < parallel degree >;

7.5.2 Oracle RACノード間のパラレル問合せ

Oracle Textのパフォーマンスを上げるためにOracle Real Application Clusters(Oracle RAC)を使用するかどうかを考慮する場合、解決しようとしているのがどのパフォーマンス問題であるかを理解することが重要です。Oracle RACは、問合せのスループットを向上するためには非常に有効な解決策です。Oracle Textで問合せの負荷が軽く良好なパフォーマンスが得られる場合は、問合せの負荷が増えた場合、Oracle RACによる優れた拡張性を期待できます。

Oracle RAC環境におけるOracle Textのパフォーマンスは、(ローカル・パーティション索引を使用して)テキスト・データとテキスト索引を物理的にパーティション化し、各パーティションが個別のOracle RACノードで処理されるようにすると、さらに向上する場合があります。この方法で、複数のノード間でのキャッシュ・コンテンツの重複を回避することにより、Oracle RAC Cache Fusionのメリットを最大限に活用できます。

Oracle 10gリリース1では、索引の作成時に、Oracle Textの各索引パーティションが個別のデータベース・ファイルに格納される必要があります。これにより、Oracle RACの再マスタリング機能を使用できるようになり、データベース・ファイルのアフィニティが適用されるため、各ノードは特定のデータベース・ファイル、つまり特定のOracle Text索引パーティションに集中します。

Oracle 10gリリース2およびそれ以降では、データベース・オブジェクト・レベルのアフィニティがサポートされています。これにより、索引オブジェクト($I表および$R表)の特定ノードへの割当てが大幅に容易になっています。

Oracle RACは問合せのスループットとパフォーマンスを向上させるソリューションを提供していますが、あらゆる場合に効果があるわけではなく、データの容量が増加しても常に同じパフォーマンス向上が見込めるわけではありません。パフォーマンスの向上を図るには、SGAキャッシュに使用できるメモリー量を増やすか、データをパーティション化して、問合せで表の全パーティションをヒットせずに必要な問合せ結果セットを通常提供できるようにします。

7.6 ブロック操作による問合せのチューニング

複数の述語を持つ問合せを発行すると、実行計画でブロック操作が行われる場合があります。たとえば、次の複合問合せについて考えます。

select docid from mytab where contains(text, 'oracle', 1) > 0
AND colA > 5
AND colB > 1
AND colC > 3;

すべての述語が非選択的で、colA、colBおよびcolCがビットマップ索引を持つと想定します。Oracle Databaseのコストベース・オプティマイザでは、次の実行計画を選択します。

TABLE ACCESS BY ROWIDS
BITMAP CONVERSION TO ROWIDS
BITMAP AND
BITMAP INDEX COLA_BMX
BITMAP INDEX COLB_BMX
BITMAP INDEX COLC_BMX
BITMAP CONVERSION FROM ROWIDS
SORT ORDER BY
DOMAIN INDEX MYINDEX

BITMAP ANDはブロック操作であるため、Oracle Textでは、BITMAP AND操作を実行する前に、Oracle Textのドメイン索引から戻されたROWIDとスコアのペアを一時的に保存する必要があります。

Oracle Textでは、これらのROWIDとスコアのペアをメモリーに保存しようとします。ただし、これらのROWIDとスコアのペアを含む結果セットのサイズがSORT_AREA_SIZE初期化パラメータの値を超える場合は、Oracle Textにより、これらの結果がディスク上の一時セグメントに排出されます。

ディスクに結果を保存すると余分なオーバーヘッドが発生するため、次のようにALTER SESSIONを使用してSORT_AREA_SIZEパラメータを増やすことによって、パフォーマンスが向上します。

alter session set SORT_AREA_SIZE = <new memory size in bytes>;

たとえば、バッファを約8MBに設定するには、次の文を入力します。

alter session set SORT_AREA_SIZE = 8300000;

関連項目:
SORT_AREA_SIZEの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』および『Oracle Databaseリファレンス』を参照してください。

7.7 問合せのパフォーマンスに関するFAQ(よくある質問)

この項では、問合せのパフォーマンスに関してよくある質問と、それに対する回答を提供します。

7.7.1 問合せのパフォーマンスとは何を意味しますか

回答: 問合せのパフォーマンスは、一般的に次の2つの基準で判断します。

- 応答時間。個々の問合せに対する応答を取得するまでの時間です。

- スループット。任意の時間内に実行可能な問合せの数(たとえば、1秒当たりの問合せ数)です。

この2つは関連していますが、同一ではありません。通常、負荷の高いシステムでは高いスループットが必要ですが、比較的負荷の低いシステムではレスポンス時間を最短にすることが必要になります。また、問合せの全ヒットをユーザーに戻す必要があるアプリケーションもあれば、順序付け済セットの最初の20ヒットのみを戻すだけでよいアプリケーションもあります。この2つの状況を区別することが重要です。

7.7.2 テキスト問合せのうち、最速のタイプはどれですか

回答: 最速タイプの問合せは、次の条件を満たす問合せです。

- 単一のCONTAINS句。

- WHERE句内に他の条件がない。

- ORDER BY句が存在しない。

- 結果の最初のページのみが戻される(たとえば、最初の10ヒットまたは20ヒット)。

7.7.3 表に関する統計を収集する必要がありますか

回答: はい。表に関する統計を収集しておくと、Oracle Textがコストベースの分析を実行できます。これにより、問合せに最も効率的な実行計画をOracle Textが選択できます。

問合せが常に簡単なテキスト問合せ(構造化述語および結合がない)の場合、Oracle Text索引の統計を削除する必要があります。

7.7.4 データのサイズは問合せにどのように影響しますか

回答: テキスト索引がROWIDを戻す速度は、データの実際のサイズには影響されません。テキスト問合せの速度は、索引表からフェッチする必要のある行数、要求されるヒット数、問合せにより生成されるヒット数、およびソートの有無に関係します。

7.7.5 データの形式は問合せにどのように影響しますか

回答: ドキュメントの形式(ASCIIプレーン・テキスト、HTMLまたはMicrosoft Word)は、問合せ速度には影響しません。ドキュメントは、問合せ時ではなく索引付け時にプレーン・テキストにフィルタ処理されます。

データがクリーンであるかどうかが、問合せに影響します。スペルチェック済で編集作業が行われた出版用のテキストは、スペルミスや略語の多い電子メールなどの非公式のテキストと比べて、合計語彙数がかなり少なくなる傾向にあります(したがって、索引表のサイズも小さくなります)。指定した索引メモリー設定では、余分なテキストがあるとメモリー使用量が多くなり、クリーンなテキストと比べて断片化される行が増え、問合せの応答時間に悪影響を及ぼす可能性があります。

7.7.6 機能的検索と索引付き検索とは、何を意味しますか

回答: カーネルがテキスト索引に対して問合せを行う方法は2つあります。1つ目は、カーネルがテキスト索引に対して特定のテキスト検索を満たすすべてのROWIDを問い合せる方法であり、これが最も一般的です。これらのROWIDはまとめて戻されます。2つ目の方法では、カーネルが個々のROWIDをテキスト索引に渡し、その特定のROWIDが特定のテキスト基準を満たしているかどうかを問い合せます。

2つ目の方法は機能的検索と呼ばれ、選択性の高い構造の句が存在する場合はこの方法を使用すると、テキスト索引に対してチェックが必要なROWIDの数はわずかです。機能的検索を使用できる検索の例は、次のとおりです。

SELECT ID, SCORE(1), TEXT FROM MYTABLE

WHERE START_DATE = '21 Oct 1992'         <- highly selective
AND CONTAINS (TEXT, 'commonword') > 0    <- unselective

構造化列(たとえば、日時や価格など)でORDER BYを行い、テキスト問合せが非選択的な場合にも、機能的検索が使用されます。

7.7.7 問合せで使用される表はどれですか

回答: すべての問合せで、索引トークン表が参照されます。この表の名前は、DR$indexname$Iの形式です。この表には、トークンのリスト(TOKEN_TEXT列)とトークンが発生する行とワードの位置に関する情報(TOKEN_INFO列)が含まれます。

行情報は内部DOCID値として格納されます。これらは外部ROWID値に変換する必要があります。これに使用される表は、検索のタイプによって決まります。機能的検索の場合は、$K表DR$indexname$Kが使用されます。これは、DOCID/ROWIDの各ペアに対する1行を含む、単純な索引構成表(IOT)です。

索引付き検索の場合は、$R表(DR$indexname$R)が使用されます。この表のBLOB列にはROWIDの完全なリストが保持されます。

このため、SQLトレースを調べて$K表または$R表を検索すれば、機能的検索と索引付き検索のどちらが使用されているかが容易に判断できます。

注意:
これらの内部索引表は、リリースごとに変更されることがあります。アプリケーションではこれらの表に直接アクセスしないことをお薦めします。

7.7.8 テキスト条件のみの検索速度は、結果をソートすることにより低下しますか

回答: はい。低下します。

ソートしない場合、Oracle Textは検索したままの結果を戻すことができます。通常、アプリケーションでは結果を一度に1ページずつ表示するため、この方が高速です。

7.7.9 スコアによるORDER BY順の問合せを高速に行うには、どうすればよいですか

回答: 関連性スコア(SCORE(n))によるソートは、FIRST_ROWS(n)ヒントを使用すると、非常に高速になります。この場合、Oracle Textはテキスト索引表からフェッチするときに高速の内部ソートを実行します。

このような問合せの例を次に示します。

SELECT /*+ FIRST_ROWS(10) */ ID, SCORE(1), TEXT FROM mytable
WHERE CONTAINS (TEXT, 'searchterm', 1) > 0
ORDER BY SCORE(1) DESC;

これを効率的に行うには、1つのCONTAINS以外の条件をWHERE句に含めないでください。

7.7.10 どのメモリー設定が問合せに影響しますか

回答: 問合せを行うには、大規模なシステム・グローバル領域(SGA)を取得する必要があります。SGA関連のパラメータは、Oracle Database初期化ファイルに設定できます。これらのパラメータは動的に設定することもできます。

SORT_AREA_SIZEパラメータは、ORDER BY問合せのソートで使用可能なメモリーを制御します。構造化列で頻繁にORDER BYを行う場合は、このパラメータのサイズを増やす必要があります。

関連項目:

- SGA関連パラメータの設定方法の詳細は、『Oracle Database管理者ガイド』を参照してください。

- メモリー割当てとSORT_AREA_SIZEパラメータの設定方法の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

7.7.11 長い列を表外のLOBに格納すると、パフォーマンスは向上しますか

回答: はい。一般に、SELECT文は元表から複数の列を選択します。Oracle Textでは列をメモリーにフェッチするため、特にこれらの列がほとんど更新されないのに頻繁に選択されるような場合は、元表のLOBなどの長い列は表外に格納する方が効率的です。

LOBを表外に格納するとき、問合せ中にメモリーにフェッチする必要があるのはLOBロケータのみです。表外に格納すると、元表の有効なサイズが減少し、Oracle Textで表全体をメモリーにキャッシュしやすくなります。これにより、元表から列を選択するコストが低減し、テキスト問合せが高速になります。

さらに、メモリーにキャッシュされる元表が小さくなれば、問合せ中により多くの索引表データをキャッシュできるため、パフォーマンスが向上します。

7.7.12 複数の列に対するCONTAINS問合せを高速にするには、どうすればよいですか

回答: 最も高速の問合せタイプは、WHERE句にCONTAINS句が1つあるのみで、その他の条件が含まれていない問合せです。

複数のCONTAINSを含む次の問合せについて考えます。

SELECT title, isbn FROM booklist
WHERE CONTAINS (title, 'horse') > 0
AND CONTAINS (abstract, 'racing') > 0

セクション検索とWITHIN演算子を次のように使用すると、同じ結果が得られます。

SELECT title, isbn FROM booklist
WHERE CONTAINS (alltext,
'horse WITHIN title AND racing WITHIN abstract')>0

この問合せは、さらに高速になります。このような問合せを使用するには、各列のデータをセクション・タグで囲んで、索引付けのためにすべてのデータを1つのテキスト列にコピーする必要があります。これを実行するには、索引付けの前にPL/SQLプロシージャを使用するか、索引付け時にUSER_DATASTOREデータソースを利用して、構造化列とテキスト列を1つのドキュメントに統合します。

7.7.13 問合せに多数の拡張を使用してもかまいませんか

回答: 問合せに使用されるワードごとに、索引表から少なくとも1行をフェッチする必要があります。このため、拡張の数はできるだけ少なくします。

ワイルド・カード、シソーラス、ステミングおよびファジー・マッチングなどの拡張は、作業上必要でないかぎり、使用しないようにします。一般的に、問合せに少数の拡張(たとえば10から20)は許容されますが、多数の拡張(80または100)は使用しないでください。問合せ式の拡張の数を判断するには、問合せフィードバック・メカニズムを使用できます。

さらに、ワイルド・カードおよびステミングの問合せの場合は、プリフィックス、サブストリングまたはステム索引を作成すると、問合せ時から索引付け時への語句拡張コストをなくすことができます。問合せのパフォーマンスは上がりますが、索引付けの時間が長くなり、ディスク領域が大きくなります。

プリフィックス索引およびサブストリング索引により、ワイルド・カードのパフォーマンスが向上します。プリフィックスとサブストリングの索引付けは、BASIC_WORDLISTプリファレンスを使用して使用可能にします。次の例では、プリフィックスとサブストリングの索引付けに対してワードリスト・プリファレンスを設定します。プリフィックス索引付けについては、Oracle Textで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

ステム索引付けは、BASIC_LEXERプリファレンスを使用して使用可能にします。

begin

ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
ctx_ddl.set_attribute ( 'mylex', 'index_stems', 'ENGLISH');

end;

7.7.14 ローカル・パーティション索引はどのような場合に便利ですか

回答: ローカル・パーティションCONTEXT索引は、パーティション表に対して作成できます。つまり、パーティション表上では、各パーティションに独自の索引表セットがあることを意味します。実際には複数の索引がありますが、各索引からの結果が必要に応じて組み合され、最終的な結果セットが生成されます。

この索引は、LOCALキーワードを使用して作成します。

CREATE INDEX index_name ON table_name (column_name)
INDEXTYPE IS ctxsys.context
PARAMETERS ('...')
LOCAL

パーティション表およびローカル索引を使用すると、次のタイプのCONTAINS問合せのパフォーマンスが向上します。

- パーティション・キー列に対する範囲検索
これは、パーティション・キー列の特定の値範囲に検索を限定する問合せです。

- パーティション・キー列でのORDER BY
これは、最初のn個のヒットのみが必要で、ORDER BY句がパーティション・キーを指定する問合せです。

関連項目:
「ローカル・パーティションCONTEXT索引を使用した応答時間の短縮」

7.7.15 問合せはパラレルに実行する方がよいですか

回答: システム負荷およびサーバー容量により異なります。パラレルに作成された索引の場合にはパラレル問合せがデフォルト動作ですが、通常、負荷の高いシステムでは問合せの全体的なスループットが低下します。

一般に、パラレル問合せは、大規模なデータ・コレクションと複数のCPUを備え、同時ユーザー数が少ないDSSや分析システムに特に適しています。

関連項目:
「パラレル問合せの使用」

7.7.16 テーマには索引を付けた方がよいですか

回答: テーマ情報にCONTEXT索引で索引付けすると、時間がかかり、索引のサイズも大きくなります。ただし、テーマ索引を使用すると、ナレッジ・ベースが(使用可能な場合は)使用され、ABOUT問合せの精度が上がります。アプリケーションでABOUT問合せが頻繁に使用される場合は、索引に対してテーマ・コンポーネントを作成してみる価値はあります。ただし、索引の作成時間と記憶領域が余分に必要になります。

関連項目:
「ABOUT問合せおよびテーマ」

7.7.17 CTXCAT索引はどのような場合に使用すればよいですか

回答: CTXCAT索引は、テキストが小さなチャンク(最大で数行)になっており、特定の構造化基準(通常は数値または日付)に従って、検索で結果セットを制限またはソートする必要がある場合(あるいはその両方)に、最も効率的に機能します。

たとえば、オンラインのオークション・サイトについて考えます。各競売対象品目には、短い説明、現在の入札価格、オークションの開始日と終了日が含まれています。この場合、説明に「antique cabinet」が含まれていて、現在の入札価格が$500未満の全レコードを表示するとします。ユーザーが新しく提示される商品に特に興味がある場合は、結果をオークション開始日でソートする必要があります。

このような検索では、CONTEXT索引に対してCONTAINS構造化問合せを行っても、構造化句およびCONTAINS句に応じてレスポンス時間が大きく異なるため、必ずしも効率的ではありません。これは、構造化句とCONTAINS句の共通部分またはテキスト問合せの順序付けが問合せ時に計算されるためです。

価格や日付などの構造化情報をCTXCAT索引内に含めると、検索条件にかかわらず、問合せ応答時間は常に最適な範囲内にとどまります。これは、テキストと構造化問合せ間の相互作用が、索引付け時に事前に計算されるためです。この結果、問合せ応答時間が最適になります。

7.7.18 CTXCAT索引が適さないのは、どのような場合ですか

回答: 索引作成に要する時間と領域に違いがあります。CTXCAT索引はCONTEXT索引と比べて作成に時間がかかり、使用するディスク領域もかなり多くなります。ディスク領域に余裕がない場合は、CTXCAT索引が適切かどうかを慎重に考慮する必要があります。

問合せ演算子に関しては、CATSEARCH問合せでは問合せテンプレートを使用して、より豊富なCONTEXT文法を使用できるようになっています。CATSEARCH問合せ文法のみを使用する必要があるという古い制限はなくなりました。

7.7.19 使用可能なオプティマイザ・ヒントは何ですか。また、その機能はどのようなものですか

回答: オプティマイザ・ヒントINDEX(table column)を通常の方法で使用すると、テキスト索引またはBツリー索引を使用した問合せを実行できます。

NO_INDEX(table column)ヒントを使用すると、特定の索引を使用禁止にすることもできます。

さらに、テキスト問合せではFIRST_ROWS(n)ヒントが特殊な意味を持ち、問合せで最初のn個のヒットが必要な場合に使用できます。DOMAIN_INDEX_SORTヒントをORDER BY SCORE(n) DESCとともに使用すると、Oracleオプティマイザは、ソート済のセットをテキスト索引から受け入れ、それ以上のソートを実行しないように指示されます。

関連項目:
「応答時間短縮のための問合せの最適化」

7.8 索引付けのパフォーマンスに関するFAQ(よくある質問)

この項では、索引付けのパフォーマンスに関してよくある質問と、それに対する回答を提供します。

7.8.1 索引付けにはどのくらいの時間が必要ですか

回答: テキストの索引付けは、リソース集中型の処理です。索引付けの速度は関連するハードウェアの性能に依存します。索引付けの速度はCPUおよびI/O容量により異なります。元のデータの読込みや索引エントリの書込みに十分なI/O容量がある場合、CPUが制限要素となります。

Intel x86(Core 2アーキテクチャ、2.5GHz)CPUを使用したテストでは、Oracle Textでは1日当たりCPUコアごとに約100GBのテキストを索引付けできました。CPUのクロック速度が増すかCPUアーキテクチャがさらに効率的(あるいはその両方)になると、処理量が増えることが予想されます。

ドキュメント形式、データの場所、ユーザー定義データストアのコール、フィルタ、レクサーなどのその他の要因も、索引付けの速度に影響します。

7.8.2 どの索引メモリー設定を使用すればよいですか

回答: 索引メモリーは、システム・パラメータDEFAULT_INDEX_MEMORYおよびMAX_INDEX_MEMORYを使用して設定できます。また、CREATE INDEXのパラメータ文字列にmemoryパラメータを指定して、索引メモリーを実行時に設定することもできます。

DEFAULT_INDEX_MEMORY値は、ページングが発生しない範囲で、できるだけ高く設定するようにします。

SORT_AREA_SIZEシステム・パラメータを増やして、索引付けのパフォーマンスを向上させることもできます。

索引メモリーの設定を大きくすることをお薦めします。数百MBまで設定を大きくすると、索引付けの速度が上がり、最終的な索引の断片化が減少します。ただし、索引メモリー設定を高くしすぎると、メモリーのページングが発生し、索引付けの速度が低下します。

索引のパラレル作成では、各プロセスがそれぞれ索引付け用のメモリーを必要とします。巨大な表を扱う場合には、索引作成時と検索時とで、システム・グローバル領域(SGA)のチューニング方法を変えます。問合せでは、システム・グローバル領域(SGA)のブロック・バッファ・キャッシュにできるだけ多くの情報をキャッシュするようにします。このため、ブロック・バッファ・キャッシュには大量のメモリーを割り当てる必要があります。ただし、この設定は索引付けには影響を与えないため、索引作成時には、SGAのサイズを減らして、索引付け処理中の索引メモリー設定を大きくする方が賢明です。

SGAのサイズはOracle Database初期化ファイルで設定します。

関連項目:

- Oracle Textのシステム・パラメータの詳細は、『Oracle Textリファレンス』を参照してください。

- SGA関連パラメータの設定方法の詳細は、『Oracle Database管理者ガイド』を参照してください。

- メモリー割当てとSORT_AREA_SIZEパラメータの設定方法の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

7.8.3 索引付けにはどの程度のディスク・オーバーヘッドが必要ですか

回答: オーバーヘッド(索引表に必要な領域の量)は、元のテキスト量の50%から200%までの範囲で様々です。一般に、テキストの総量が多いほどオーバーヘッドは小さくなりますが、小さなレコードが多数あるほうが、大きなレコードが少数あるよりもオーバーヘッドの消費が大きくなります。また、電子メールや討論記録のような未処理のデータにはスペルミスや略語などの特異なワードが数多く含まれている可能性が高いため、クリーンなデータ(出版されたテキストなど)のほうが未処理のデータよりも必要なオーバーヘッドが小さくなります。

テキストのみの索引は、テキストとテーマを組み合せた索引よりも小さくなります。プリフィックス索引およびサブストリング索引では、索引がかなり大きくなります。

7.8.4 データの形式は索引付けにどのように影響しますか

回答: Microsoft Wordファイルのように形式設定されたドキュメントの場合は、ドキュメントに含まれる実際のテキストに比べてサイズが大きくなる傾向があるため、記憶域オーバーヘッドはかなり低くなります。したがって、1GBのWordドキュメントに必要な索引領域が50MBのみであるのに対し、1GBのプレーン・テキストに必要な索引領域は500MBになることがあります。

索引付けに要する時間については、これほど単純ではありません。索引付け対象のテキスト量が減れば明らかな影響は出ますが、索引付けに要する時間を見積るためには、AUTO_FILTERフィルタまたはその他のユーザー定義フィルタを使用してドキュメントをフィルタ処理する時間を相殺することが必要になります。

7.8.5 パラレル索引付けにより、パフォーマンスは向上しますか

回答: データが大量にあり、CPUも複数ある場合は、パラレル索引付けにより、索引付けのパフォーマンスが向上します。

索引を作成するときに、次のようにPARALLELキーワードを使用します。

CREATE INDEX index_name ON table_name (column_name)
INDEXTYPE IS ctxsys.context PARAMETERS ('...') PARALLEL 3;

これで、リソースに応じて最大3つの索引付けプロセスを使用して索引が作成されます。

また、パラレル索引付けを使用して、パーティション表のローカル・パーティション索引を作成することもできます。ただし、CPUが複数あるときのみ、索引付けのパフォーマンスは向上します。

注意:
ローカル・パーティション索引を作成するのにPARALLELを使用すると、パラレル問合せが有効になります。(非パーティション索引をパラレルに作成しても、問合せはパラレルに処理されません。)
パラレル問合せにより、特に負荷の高いシステムでは、問合せのスループットが低下します。このため、パラレル索引作成後はパラレル問合せを使用禁止にすることをお薦めします。この場合は、ALTER INDEX NOPARALLELを使用します。

7.8.6 ローカル・パーティション索引を作成する場合、索引のパフォーマンスを改善するにはどうすればよいですか

回答: CPUが複数あるときは、ローカル索引をパラレルで作成することで索引付けのパフォーマンスを改善できます。索引付けをパラレルで行うには、次の2つの方法があります。

ローカル・パーティション索引をパラレルで作成するには、次の2つの方法があります。

- CREATE_INDEXで、LOCAL句とともにPARALLEL句を使用します。この場合、最大並列度はユーザーが持つパーティションの数によって制限されます。

- 使用禁止の索引を最初に作成し、次にDBMS_PCLXUTIL.BUILD_PART_INDEXユーティリティを実行します。このメソッドを使用すると、特にパーティション数以上のCPUがある場合に、並列度が高くなります。

2つ目の方法の例を次に示します。この例の元表には3つのパーティションがあります。まず使用禁止のローカル・パーティション索引を作成してから、DBMS_PCLUTIL.BUILD_PART_INDEXを実行すると、3つのパーティションがパラレルに作成されます(パーティション間並列性)。また、各パーティション内では、索引作成が並列度2でパラレルに実行されます(パーティション内並列性)。

create index tdrbip02bx on tdrbip02b(text)
indextype is ctxsys.context local (partition tdrbip02bx1,
partition tdrbip02bx2,
partition tdrbip02bx3)
unusable;

exec dbms_pclxutil.build_part_index(3,2,'TDRBIP02B','TDRBIP02BX',TRUE);

7.8.7 索引付けがどの程度完了したかはどうすればわかりますか

回答: CTX_OUTPUT.START_LOGプロシージャを使用すると、索引付けプロセスからの出力を記録できます。ファイル名は、通常$ORACLE_HOME/ctx/logに書き込まれますが、CTX_ADM.SET_PARAMETERでLOG_DIRECTORYパラメータを使用してディレクトリを変更できます。

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

7.9 索引の更新に関するFAQ(よくある質問)

この項では、索引の更新と関連するパフォーマンスの問題に関してよくある質問と、それに対する回答を提供します。

7.9.1 新規レコードまたは更新済レコードに索引を付ける頻度は、どれくらいがよいですか

回答: CTX_DLL.SYNC_INDEXを使用して再索引付けを実行する頻度が低いほど、索引の断片化が少なくなり、索引の最適化を実行する頻度も低く抑えることができます。

ただし、これではデータが次第に古くなるため、ユーザーにとっては不便になる可能性があります。

ほとんどのシステムでは、毎日の夜間の索引付けで対応可能です。この場合、作成されてから1日未満のデータは検索できないということになります。毎時、10分ごとまたは5分ごとに更新を行うシステムもあります。

関連項目:

- CTX_DDL.SYNC_INDEXの使用方法は、『Oracle Textリファレンス』を参照してください。

- 「CONTEXT索引に関するDML操作の管理」

7.9.2 索引の断片化は、どのようにするとわかりますか

回答: 最善の方法は、いくつかの問合せに要する時間を測定してから、索引の最適化を実行し、その後で同じ問合せの時間を再度測定することです(SGAをクリアするために、その都度データベースを再起動する必要があります)。問合せの速度が大幅に上がっている場合は、最適化が有効であったことを示しています。そうでない場合は、次回は待機時間が長くなる可能性があります。

索引の断片化の分析には、CTX_REPORT.INDEX_STATSを使用することもできます。

関連項目:

- CTX_REPORTパッケージの使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

- 「索引の最適化」

7.9.3 メモリー割当ては索引の同期化に影響しますか

回答: はい。通常の索引付けへの影響と同じです。同期操作中に索引付けされるレコード数が大幅に少ないことが多いので、通常は索引付けのメモリーに数百MBも準備する必要はありません。

8 Oracle Textでのドキュメント・セクションの検索

この章では、Oracle Textの問合せアプリケーションでドキュメントのセクションを使用する方法を説明します。

次の項目について説明します。

- Oracle Textでのドキュメントのセクション検索について

- Oracle Textを使用したHTMLのセクション検索

- Oracle Textを使用したXMLのセクション検索

8.1 Oracle Textでのドキュメントのセクション検索について

セクション検索を使用すると、テキスト問合せをドキュメント内のテキストのブロックに絞り込むことができます。セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に有効です。

また、テキストを文レベルと段落レベルで検索できます。

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

- Oracle Textでのセクション検索の使用可能化

- Oracle Textのセクション・タイプ

8.1.1 Oracle Textでのセクション検索の使用可能化

ドキュメント・コレクションのセクション検索を使用可能にする手順は、次のとおりです。

1. セクション・グループを作成します。

2. セクションを定義します。

3. ドキュメントを索引付けします。

4. WITHIN、INPATHまたはHASPATHの各演算子を使用してセクションを検索します。

8.1.1.1 セクション・グループの作成

セクション検索を使用可能にするには、セクション・グループを定義します。システム定義のセクション・グループのいずれかを使用して、セクション・グループのインスタンスを作成します。ドキュメント・コレクションに適したセクション・グループを選択します。

セクション・グループを使用して、所有しているドキュメント・セットのタイプを指定し、タグ構造を明示的に示します。たとえば、HTMLタグ付きのドキュメントを索引付けするには、HTML_SECTION_GROUPを使用します。同様に、XMLタグ付きのドキュメントを索引付けするには、XML_SECTION_GROUPを使用します。

表8-1は、使用可能な各種のセクション・グループを示しています。

表8-1 セクション・グループのタイプ

セクション・グループ・プリファレンス

説明

NULL_SECTION_GROUP

これはデフォルトです。どのセクションも定義しない場合、またはSENTENCEかPARAGRAPHセクションのみを定義する場合は、このグループ・タイプを使用します。

BASIC_SECTION_GROUP

開始および終了タグが<A>および</A>という形式のセクションを定義します。

注意: このグループ・タイプでは、片方のみのカッコ、コメント・タグおよび属性などの入力はサポートしません。このような入力にはHTML_SECTION_GROUPを使用します。

HTML_SECTION_GROUP

HTMLドキュメントを索引付けし、HTMLドキュメントにセクションを定義します。

XML_SECTION_GROUP

XMLドキュメントを索引付けし、XMLドキュメントにセクションを定義します。

AUTO_SECTION_GROUP

XMLドキュメントの開始タグ/終了タグに対して自動的にゾーン・セクションを作成します。XMLタグから導出されるセクション名は、XML内と同様に大/小文字が区別されます。

属性セクションは、属性を持つXMLタグに対して自動的に作成されます。属性セクションは、tag@attributeという形式でネーミングされます。

停止セクション、空のタグ、処理の指示およびコメントは、索引付けされません。

自動セクション・グループには次の制限事項が適用されます。

- ゾーン、フィールドまたは特殊セクションは、自動セクション・グループに追加できません。

- 自動セクション化は、XMLドキュメント・タイプ(ルート要素)を索引付けしません。ただし、ドキュメント・タイプに停止セクションを定義することはできます。

- 索引付けされたタグの長さは、プリフィックスおよび名前空間を含めて64バイト以下です。これより長いタグは索引付けされません。

PATH_SECTION_GROUP

XMLドキュメントを索引付けします。このタイプは、AUTO_SECTION_GROUPと同じように動作します。

相違点は、このセクション・グループを使用すると、INPATHおよびHASPATH演算子でパス検索を実行できることです。タグまたは属性名の問合せでは、大/小文字が同様に区別されます。

NEWS_SECTION_GROUP

RFC 1036に基づいて、ニュース・グループ形式のドキュメントのセクションを定義します。

注意:
HTML、XML、AUTOおよびPATHセクショナに送られるドキュメントは、\s*<で始まる必要があります(\s*は0文字以上の空白文字を表します)。それ以外のドキュメントはプレーンテキスト・ドキュメントとして処理され、いずれのセクションも認識されません。

CTX_DDLパッケージを使用してセクション・グループを作成し、セクション・グループの構成要素としてセクションを定義します。たとえば、HTMLドキュメントを索引付けするには、HTML_SECTION_GROUPを使用してセクション・グループを作成します。

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

8.1.1.2 セクションの定義

セクションは、セクション・グループの構成要素として定義します。次の例では、HTML <H1>タグ内の全テキストに対してheadingというゾーン・セクションを定義します。

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

注意:
AUTO_SECTION_GROUPまたはPATH_SECTION_GROUPを使用して、XMLドキュメント・コレクションを索引付けする場合は、セクションを明示的に定義する必要はありません。これは、システムが索引付け時にセクションを定義するためです。

関連項目:

- セクションの詳細は、「Oracle Textのセクション・タイプ」を参照してください。

- XMLによるセクション検索の詳細は、「Oracle Textを使用したXMLのセクション検索」を参照してください。

8.1.1.3 ドキュメントの索引付け

ドキュメントの索引付け時に、セクション・グループをCREATE INDEXのPARAMETERS句に指定します。

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

8.1.1.4 WITHIN演算子によるセクション検索

ドキュメントが索引付けされている場合は、WITHIN演算子を使用して、セクション内を問い合せることができます。たとえば、ドキュメントのヘッダー内にワードOracleを含むすべてのドキュメントを検索するには、次の問合せを入力します。

'Oracle WITHIN heading'

関連項目:
WITHIN演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

8.1.1.5 INPATHおよびHASPATH演算子によるパス検索

PATH_SECTION_GROUPを使用した場合、システムは自動的にXMLセクションを作成します。WITHIN演算子を使用して問合せを入力できる他、INPATH演算子とHASPATH演算子を使用してパス検索を入力できます。

関連項目:

- これらの演算子の使用方法は、「Oracle Textを使用したXMLのセクション検索」を参照してください。

- INPATH演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

8.1.2 Oracle Textのセクション・タイプ

セクション・タイプはすべて、ドキュメント内のテキストのブロックです。ただし、セクションを区切る方法や索引内での記録方法にそれぞれ相違があります。セクションは、次のタイプのいずれかです。

- ゾーン・セクション

- フィールド・セクション

- 停止セクション

- MDATAセクション

- SDATAセクション

- 属性セクション(XMLドキュメントの場合)

- 特殊セクション(文または段落)

表8-2に、各種セクション・グループとともに使用されるセクション・タイプを示します。

表8-2 セクション・タイプおよびセクション・グループ

セクション・グループ

ZONE

FIELD

STOP

MDATA

SDATA

ATTRIBUTE

SPECIAL

NULL

NO

NO

NO

NO

NO

NO

YES

BASIC

YES

YES

NO

YES

YES

NO

YES

HTML

YES

YES

NO

YES

YES

NO

YES

XML

YES

YES

NO

YES

YES

YES

YES

NEWS

YES

YES

NO

YES

YES

NO

YES

AUTO

NO

NO

YES

NO

NO

NO

NO

PATH

NO

NO

NO

NO

NO

NO

NO

8.1.2.1 ゾーン・セクション

ゾーン・セクションは、ドキュメント内の開始タグと終了タグで区切られたテキストの本体です。開始タグと終了タグの位置は索引内に記録されているため、タグで囲まれたワードはそのセクション内に存在するとみなされます。ゾーン・セクションのインスタンスすべてに開始タグと終了タグが付いている必要があります。

たとえば、<TITLE>と</TITLE>の2つのタグに挟まれたテキストは、ゾーン・セクションとして次のように定義できます。

<TITLE>Tale of Two Cities</TITLE>
It was the best of times...

ゾーン・セクションは、ドキュメント内でネスト、オーバーラップおよび繰返しができます。

ゾーン・セクションの問合せ時に、全セクション内の語句を検索するには、WITHIN演算子を使用します。Oracle Textにより、定義済のセクション内に問合せ語句を含むドキュメントが戻ります。

ゾーン・セクションは、HTMLおよびXMLドキュメントのセクションの定義に最適です。ゾーン・セクションを定義するには、CTX_DDL.ADD_ZONE_SECTIONを使用します。

たとえば、次のようにbooktitleというセクションを定義したとします。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'booktitle', 'TITLE');
end;

索引付けした後で、セクションbooktitle内の語句Citiesを含むすべてのドキュメントを次のように検索できます。

'Cities WITHIN booktitle'

(dog and cat) WITHIN booktitleのような複数の問合せ語句の場合は、Oracle Textにより、booktitleセクションの同じインスタンス内にcatとdogを含むドキュメントが検出されます。

8.1.2.1.1 繰返しゾーン・セクション

ゾーン・セクションは繰返しが可能です。各繰返しは別々のセクションとして処理されます。たとえば、<H1>がheadingセクションを示す場合は、次のように、同じドキュメント内で繰り返すことができます。

<H1> The Brown Fox </H1>
<H1> The Gray Wolf </H1>

これらのゾーン・セクションがHeadingという名前の場合、問合せBrown WITHIN Headingはこのドキュメントを戻します。ただし、(Brown and Gray) WITHIN Headingという問合せはこのドキュメントを戻しません。

8.1.2.1.2 ゾーン・セクションのオーバーラップ

ゾーン・セクションは互いにオーバーラップできます。たとえば、<B>と<I>が2つの異なるゾーン・セクションを示す場合、これらはドキュメント内で次のようにオーバーラップできます。

plain <B> bold <I> bold and italic </B> only italic </I>  plain

8.1.2.1.3 ネストされたゾーン・セクション

ゾーン・セクションは(それ自体も含めて)、次のようにネストできます。

<TD> <TABLE><TD>nested cell</TD></TABLE></TD>

WITHIN演算子を使用して、セクション内のセクションのテキストを検索するための問合せを記述できます。たとえば、BOOK1、BOOK2およびAUTHORのゾーン・セクションが、ドキュメントdoc1およびdoc2で次のように出現するとします。

doc1:

<book1> <author>Scott Tiger</author> This is a cool book to read.</book1>

doc2:

<book2> <author>Scott Tiger</author> This is a great book to read.</book2>

次のようにネストされた問合せを実行します。

'(Scott within author) within book1'

この問合せはdoc1のみを戻します。

8.1.2.2 フィールド・セクション

フィールド・セクションは、ゾーン・セクションと同じように、開始タグと終了タグで区切られたテキストの範囲です。フィールド・セクションがゾーン・セクションと異なる点は、その範囲がドキュメントの残りの部分とは別に索引付けされることです。

フィールド・セクションは異なる方法で索引付けされるため、大量のドキュメントが索引付けされている場合は、ゾーン・セクションに比べて問合せパフォーマンスが向上します。

フィールド・セクションは、ドキュメント内のセクションに1回のみ出現するニュース・ヘッダーのフィールドなどに最適です。また、フィールド・セクションは、ドキュメントの残りの部分で参照できます。

ゾーン・セクションとは異なり、フィールド・セクションには次の制限事項があります。

- フィールド・セクションはオーバーラップできません。

- フィールド・セクションは繰返しができません。

- フィールド・セクションはネストできません。

8.1.2.2.1 参照可能なフィールド・セクションと参照不能なフィールド・セクション

デフォルトでは、フィールド・セクションはドキュメントの残りの部分とは別にサブドキュメントとして索引付けされます。このため、フィールド・セクションは前後のテキストから参照不能であり、WITHIN句でそのセクション名を明示的に指定することによってのみ問い合せることができます。

フィールド・セクション内のテキストをドキュメント全体の一部として索引付けする場合は、フィールド・セクションを参照可能にできます。参照可能なフィールド・セクション内のテキストは、WITHIN演算子を使用するかどうかにかかわらず問い合せることができます。

次の例では、参照不能なフィールド・セクションと参照可能なフィールド・セクションの相違点を示します。

次のコードは、BASIC_SECTION_GROUP型のセクション・グループbasicgroupを定義します。次に、<A>タグに対してAuthorというフィールド・セクションをbasicgroupに作成します。また、参照可能フラグをFALSEに設定して、参照不能なセクションを作成します。

begin
ctx_ddl.create_section_group('basicgroup', 'BASIC_SECTION_GROUP');
ctx_ddl.add_field_section('basicgroup', 'Author', 'A', FALSE);
end;

Authorフィールド・セクションは参照不能であるため、Authorセクション内のテキストを検索するには、次のようにWITHIN演算子を使用する必要があります。

'(Martin Luther King) WITHIN Author'

WITHIN演算子を使用せずにMartin Luther Kingを問い合せても、フィールド・セクション内のこの語句のインスタンスは戻りません。WITHINを指定せずにフィールド・セクション内のテキストを問い合せる場合は、セクション作成時に次のように参照可能フラグをTRUEに設定する必要があります。

begin
ctx_ddl.add_field_section('basicgroup', 'Author', 'A', TRUE);
end;

8.1.2.2.2 ネストされたフィールド・セクション

フィールド・セクションはネストできません。たとえば、<TITLE>で始まるフィールド・セクションを定義し、<FOO>で始まる別のフィールド・セクションを定義した場合、この2つのセクションを次のようにネストすることはできません。

<TITLE> dog <FOO> cat </FOO> </TITLE>

ネストされたセクションを使用するには、これらをゾーン・セクションとして定義します。

8.1.2.2.3 繰返しフィールド・セクション

繰返しフィールド・セクションは使用できますが、WITHIN問合せはこれらを1つのセクションとして処理します。次に、ドキュメントの繰返しフィールド・セクションの例を示します。

<TITLE> cat </TITLE>
<TITLE> dog </TITLE>

問合せ(dog and cat)within titleは、これらのワードが別のセクション内に存在している場合でも、ドキュメントを検出します。

WITHIN問合せで繰返しセクションを区別するには、これらをゾーン・セクションとして定義します。

8.1.2.3 停止セクション

停止セクションは、自動セクション・グループに追加できます。停止セクションを追加すると、自動セクション索引付け演算子によってXMLドキュメントの特定のセクションが無視されます。

注意:
停止セクションを追加すると、索引にセクション情報が作成されません。ただし、停止セクション内のテキストは常に検索できます。

ユーザーのドキュメントに多数の下位レベルの情報タグが含まれているときに、停止セクションを追加すると役立ちます。停止セクションの追加により、自動セクション・グループのパフォーマンスもまた改善されます。

追加できる停止セクションの数は無制限です。

停止セクションにはセクション名がないため、セクション・ビューに記録されません。

8.1.2.4 MDATAセクション

MDATAセクションは、ドキュメントに対するユーザー定義済メタデータの参照で使用されます。MDATAセクションを使用すると、複合問合せを高速化できます。

テキストの内容およびドキュメント・タイプ(雑誌、新聞、小説など)の両方に応じた問合せをする場合を考えます。テキストの列およびドキュメント・タイプの列を使用して索引を作成し、次にこの形式の複合問合せを実行します。この場合は、Adam Thorpe(小説Ulvertonの作者)というフレーズを含むすべての小説を検索します。

SELECT id FROM documents
WHERE doctype = 'novel'
AND CONTAINS(text, 'Adam Thorpe')>0;

ただし、通常は、別々の列を使用するよりも、属性(この場合はドキュメント・タイプ)を1つのフィールド・セクションに組み込ませた方が速いです。次に、1つのCONTAINS問合せを使用します。

SELECT id FROM documents
WHERE CONTAINS(text, 'Adam Thorpe AND novel WITHIN doctype')>0;

この方法には、2つの短所があります。

- 属性が更新されるたびに、テキスト・ドキュメント全体を再索引付けする必要があります。その結果、索引の断片化が進み、DMLの処理レートが遅くなります。

- フィールド・セクションにより、セクション値がトークン化します。これは、次のように影響を及ぼします。小数点または通貨記号などの、メタデータ内の特殊文字は簡単に検索できない、値の検索が困難(「Thurston Howell」は検索できるが、「Thurston Howell, Jr.」は検索できないなど)、マルチ・ワードの値が句で問い合されるため、単一のトークン検索よりも遅くなる、マルチ・ワードの値がブラウズ・ワードで表示されないため、作成者のブラウズや主題のブラウズが不可能になる、などです。

そのため、フィールド・セクションではなくMDATAセクションを使用した方が有効です。MDATAセクションは、フィールド・セクションのように索引付けされますが、メタデータ値が追加され、ドキュメント・テキストを再索引付けせずにドキュメントから削除できます。フィールド・セクションとは異なり、MDATA値はトークン化されません。また、MDATAセクションの索引付けは、通常、フィールド・セクションの索引付けよりも使用するディスク・スペースが小さくてすみます。

MDATAセクションをセクション・グループに追加するには、CTX_DDL.ADD_MDATA_SECTIONを使用します。この例では、AUTHORというMDATAセクションを追加し、これに「Soseki Natsume」(小説「Kokoro」の作者)という値を指定します。

ctx_ddl.create.section.group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_mdata_section('htmgroup', 'author', 'Soseki Natsume');

MDATA値は、CTX_DDL.ADD_MDATAを使用して変更したり、CTX_DDL.REMOVE_MDATAを使用して削除できます。また、MDATAセクションには複数の値を含めることができます。索引の所有者のみがCTX_DDL.ADD_MDATAおよびCTX_DDL.REMOVE_MDATAをコールできます。

CTX_DDL.ADD_MDATAおよびCTX_DDL.REMOVE_MDATAは、両方ともCTXCAT索引、CTXXPTH索引およびCTXRULE索引に対してサポートされていません。

MDATA値はレクサーを介して渡されません。かわりに、すべての値は簡単に正規化されます。

- 値の前後の空白は削除されます。

- 値は64バイトに切り捨てられます。

- 値は単一の値として索引付けされます。値が複数のワードで構成されている場合、分割されません。

- 大/小文字区別は保護されます。ドキュメントが動的に生成される場合は、MDATA値を大文字化し、大文字のみが検索されることを確認することで、大/小文字区別を実装できます。

ドキュメントにMDATAメタデータが追加された後、MDATA CONTAINS問合せ演算子を使用して、メタデータを問い合せることができます。

SELECT id FROM documents
WHERE CONTAINS(text, 'Tokyo and MDATA(author, Soseki Natsume)')>0;

AUTHORタグに正確な値「Soseki Natsume」がある場合(単純なトークン化後)のみ、この問合せは正常に行われます。「Soseki」または「Natsume Soseki」では機能しません。

MDATAに関して、他に注意する点は次のとおりです。

- MDATA値はハイライト表示されません。CTX_DOC.TOKENSの出力では表示されず、FILTER PLAINTEXTが有効なときも表示されません。

- MDATAセクションは、セクション・グループ内で一意にする必要があります。同じセクション・グループ内に、FOOというMDATAセクション、および同じ名前のゾーン・セクションまたはフィールド・セクションを含めることはできません。

- フィールド・セクションと同様に、MDATAセクションはオーバーラップまたはネストできません。MDATAセクションは、最初に発生したタグにより、暗黙的にクローズされます。たとえば、次の例のようになります。

<AUTHOR>Dickens <B>Shelley</B> Keats</AUTHOR>

<B>タグにより、AUTHOR MDATAセクションがクローズされます。その結果、このドキュメントには「Shelley」や「Keats」ではなく、「Dickens」というAUTHORが含まれます。

- 競合状態を未然に防ぐため、ADD_MDATAおよびREMOVE_MDATAをそれぞれコールして、すべての値とセクションの索引のROWIDに対する他のコールをロックします。ただし、ADD_MDATAおよびREMOVE_MDATAはコミットを行わないため、両方をコールするとアプリケーションでデッドロックが発生する可能性があります。デッドロックを回避するのはアプリケーションの役割です。

関連項目:

- MDATA演算子の詳細は、『Oracle Textリファレンス』の「Oracle Text CONTAINS問合せ演算子」を参照してください。

- MDATAセクションの追加および削除の詳細は、『Oracle Textリファレンス』の「CTX_DDLパッケージ」を参照してください。

8.1.2.5 NDATAセクション

NDATAセクションをBASIC_SECTION_GROUP、HTML_SECTION_GROUP、またはXML_SECTION_GROUPセクション・グループ・タイプに追加して、名前検索用に索引付けするデータを含むフィールドを排他的に指定できます。

ユーザーは、使用可能な2つのデータストア(MULTI_COLUMN_DATASTOREまたはUSER_DATASTORE)を使用して、名前データを含むテキスト・ドキュメントを合成できます。次に、MULTI_COLUMN_DATASTOREを使用して、索引付けする名前データを含む関連する列を選択する例を示します。

create table people(firstname varchar2(80), surname varchar2(80));
insert into people values('John', 'Smith');
commit;
begin
ctx_ddl.create_preference('nameds', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('nameds', 'columns', 'firstname,surname');
end;
/

これにより、索引付けに使用する次の仮想テキストが作成されます。

<FIRSTNAME>
John
</FIRSTNAME>
<SURNAME>
Smith
</SURNAME>

これで、FIRSTNAMEおよびSURNAMEセクションにNDATAセクションを作成できます。

begin
ctx_ddl.create_section_group('namegroup', 'BASIC_SECTION_GROUP');
ctx_ddl.add_ndata_section('namegroup', 'FIRSTNAME', 'FIRSTNAME');
ctx_ddl.add_ndata_section('namegroup', 'SURNAME', 'SURNAME');
end;
/

次に、以前に作成したデータストア・プリファレンスとセクション・グループ・プリファレンスを使用して、索引を作成します。

create index peopleidx on people(firstname) indextype is ctxsys.context
parameters('section group namegroup datastore nameds');

NDATAセクションでは、シングルバイト・データとマルチバイト・データの両方がサポートされていますが、文字および語句に関する制約があります。索引付けされるNDATAセクション・データには、次のような制約があります。

- 1文字の空白で区切られた語句の文字数
511

- 空白で区切られた語句の数
255

- 空白を含む文字の総数
511

8.1.2.6 SDATAセクション

SDATAセクションの値は、他のセクションのようにドキュメントのテキストから抽出されますが、SDATAとも呼ばれる構造化データとして索引付けされます。SDATAセクションの使用では、投影、範囲検索、順序付けなどの操作がサポートされます。埋込みタグ、詳細な表または関数の起動など、セクション・データのSDATA索引付けも有効になります。これにより、1つのSQL文でテキスト検索と構造化検索の様々な組合せを実行できます。

SDATA演算子は、非SDATAの子も持つAND演算子の子としてのみ使用する必要があります。SDATA演算子は、二次的な確認または非駆動基準として使用されることになっています。たとえば、「評価> 4のドキュメントを検索」するのではなく、「価格> 5でもありDOGを含むドキュメントを検索」します。他の使用方法でも正しく動作しますが、パフォーマンスが最善にはならないことがあります。

CTX_DDL.ADD_SDATA_SECTIONを使用して、SDATAセクションをセクション・グループに追加します。SDATAセクション内で問い合せる場合は、CONTAINS演算子を使用します。次の例では、itemsという表を作成し、my_sec_groupというSDATAセクションを追加して、セクション内のSDATAを問い合せます。

表itemsを作成します。

CREATE TABLE items
(id  NUMBER PRIMARY KEY,
doc VARCHAR2(4000));

INSERT INTO items VALUES (1, '<description> Honda Pilot </description>
<category> Cars & Trucks </category>
<price> 27000 </price>');
INSERT INTO items VALUES (2, '<description> Toyota Sequoia </description>
<category> Cars & Trucks </category>
<price> 35000 </price>');
INSERT INTO items VALUES (3, '<description> Toyota Land Cruiser </description>
<category> Cars & Trucks </category>
<price> 45000 </price>');
INSERT INTO items VALUES (4, '<description> Palm Pilot </description>
<category> Electronics </category>
<price> 5 </price>');
INSERT INTO items VALUES (5, '<description> Toyota Land Cruiser Grill </description>
<category> Parts & Accessories </category>
<price> 100 </price>');
COMMIT;

SDATAセクションmy_sec_groupを追加します。

BEGIN
CTX_DDL.CREATE_SECTION_GROUP('my_sec_group', 'BASIC_SECTION_GROUP');
CTX_DDL.ADD_SDATA_SECTION('my_sec_group', 'category', 'category', 'VARCHAR2');
CTX_DDL.ADD_SDATA_SECTION('my_sec_group', 'price', 'price', 'NUMBER');
END;

CONTEXT索引を作成します。

CREATE INDEX items$doc
ON items(doc)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS('SECTION GROUP my_sec_group');

問合せを実行します。

SELECT id, doc
FROM items
WHERE contains(doc, 'Toyota
AND SDATA(category = ''Cars & Trucks'')
AND SDATA(price <= 40000 )') > 0;

結果を返します。

ID DOC
---- ----------------------------------------------------------------------
2 <description> Toyota Sequoia </description>
<category> Cars & Trucks </category>
<price> 35000 </price>

関連項目:

- SDATA演算子の詳細は、『Oracle Textリファレンス』の「Oracle Text CONTAINS問合せ演算子」を参照してください。

- SDATAセクションの追加および削除の詳細は、『Oracle Textリファレンス』の「CTX_DDLパッケージ」を参照してください。

8.1.2.7 属性セクション

属性セクションを定義すると、XMLの属性テキストを問い合せることができます。また、システムで自動的にXML属性を定義し、索引付けすることもできます。

関連項目:
「Oracle Textを使用したXMLのセクション検索」

8.1.2.8 特殊セクション

特殊セクションは、タグで認識されるのではありません。現在サポートされている特殊セクションは、文と段落のみです。特殊セクションを使用すると、文または段落内のワードの組合せを検索できます。

文および段落の境界はレクサーにより決定されます。たとえば、BASIC_LEXERは、文および段落のセクション境界を次のように認識します。

表8-3 BASIC_LEXERの文および段落セクション境界

特殊セクション

境界

SENTENCE

WORD/PUNCT/WHITESPACE

WORD/PUNCT/NEWLINE

PARAGRAPH

WORD/PUNCT/NEWLINE/WHITESPACE

WORD/PUNCT/NEWLINE/NEWLINE

レクサーが境界を認識できない場合、文または段落のセクションには索引が付けられません。

特殊セクションを追加するには、CTX_DDL.ADD_SPECIAL_SECTIONプロシージャを使用します。たとえば、次のコードによって、HTMLドキュメントの文内での検索が使用可能になります。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_special_section('htmgroup', 'SENTENCE');
end;

文検索の他にゾーン検索を使用可能にするために、ゾーン・セクションをグループに追加することもできます。次の例では、ゾーン・セクションHeadlineをセクション・グループhtmgroupに追加します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_special_section('htmgroup', 'SENTENCE');
ctx_ddl.add_zone_section('htmgroup', 'Headline', 'H1');
end;

8.2 Oracle Textを使用したHTMLのセクション検索

HTMLには、セクション検索に使用できるタグ付きテキスト形式の内部構造があります。たとえば、<H1>タグに対してheadingsというセクションを定義できます。これによって、ドキュメント・セット全体のこのタグ内でのみ語句を検索できます。

問合せには、WITHIN演算子を使用します。Oracle Textにより、headingsセクション内に問合せ語句を含むすべてのドキュメントを検出します。したがって、headingsセクション内にワードoracleを含むすべてのドキュメントを検索する場合は、次の問合せを入力します。

'oracle within headings'

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

- HTMLのセクションの作成

- HTMLのMetaタグの検索

8.2.1 HTMLのセクションの作成

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

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('filter ctxsys.null_filter section group htmgroup');

セクション・グループhtmgroupで索引付けした後、次のように問合せを発行してheadingセクション内を問い合せることができます。

'Oracle WITHIN heading'

8.2.2 HTMLのMetaタグの検索

HTMLドキュメントの場合は、<META>タグのNAME/CONTENTのペアにセクションを作成できます。セクションの作成時に、検索をCONTENT内のテキストに制限できます。

8.2.2.1 例: <META>タグに対するセクションの作成

次のようなMETAタグを持つHTMLドキュメントがあるとします。

<META NAME="author" CONTENT="ken">

NAME値がauthorであるMETAタグについて、すべてのCONTENT属性を索引付けるゾーン・セクションを作成します。

begin
ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP');
ctx_ddl.add_zone_section('htmgroup', 'author', 'meta@author');
end

セクション・グループhtmgroupで索引付けした後、次のようにドキュメントを問い合せることができます。

'ken WITHIN author'

8.3 Oracle Textを使用したXMLのセクション検索

HTMLドキュメントと同様、XMLドキュメントにもタグ付きテキストがあるため、これを使用して、セクション検索を行うテキストのブロックを定義できます。セクションの内容は、WITHIN演算子またはINPATH演算子を使用して検索できます。

次の各項では、様々なタイプのXML検索について説明します。

- 自動セクション

- 属性検索

- ドキュメント・タイプ別のセクションの作成

- パス・セクション検索

8.3.1 自動セクション

セクション・グループAUTO_SECTION_GROUPを使用してXMLドキュメントからセクションを自動的に作成するように索引付け操作を設定できます。システムは、XMLタグに対してゾーン・セクションを作成します。属性セクションは、属性を持つタグに対して作成され、tag@attributeという形式でネーミングされます。

たとえば、次の文は、AUTO_SECTION_GROUPを使用してXMLファイルを含む列に索引myindexを作成します。

CREATE INDEX myindex
ON xmldocs(xmlfile)
INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
filter ctxsys.null_filter
section group ctxsys.auto_section_group'
);

8.3.2 属性検索

XML属性テキストは、次のいずれかの方法で検索できます。

- CTX_DDL.ADD_ATTR_SECTIONを使用して属性セクションを作成し、次にXML_SECTION_GROUPを使用して索引付けします。索引付け時にAUTO_SECTION_GROUPを使用すると、属性セクションは自動的に作成されます。属性セクションは、WITHIN演算子で問い合せることができます。

- PATH_SECTION_GROUPを使用して索引付けし、INPATH演算子で属性テキストを問い合せます。

8.3.2.1 属性セクションの作成

次のように、TITLE属性を持つBOOKタグを定義するXMLファイルがあるとします。

<BOOK TITLE="Tale of Two Cities">
It was the best of times.
</BOOK>

タイトル属性を属性セクションとして定義するには、次のようにXML_SECTION_GROUPを作成し、属性セクションを定義します。

begin
ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_attr_section('myxmlgroup', 'booktitle', 'book@title');
end;

索引付けは、次のように行います。

CREATE INDEX myindex
ON xmldocs(xmlfile)
INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
filter ctxsys.null_filter
section group myxmlgroup'
);

XML属性セクションbooktitleは、次のように問い合せることができます。

'Cities within booktitle'

8.3.2.2 INPATH演算子による属性の検索

属性テキストは、INPATH演算子を使用して検索できます。そのためには、XMLドキュメント・セットをPATH_SECTION_GROUPで索引付けする必要があります。

関連項目:
「パス・セクション検索」

8.3.3 ドキュメント・タイプ別のセクションの作成

異なるドキュメント・タイプに対して宣言された<book>タグを持つXMLドキュメント・セットの場合、各ドキュメント・タイプに対して個別のbookセクションを作成する必要がある場合があります。次の例では、各ドキュメント・タイプに対してbookセクションを作成して検索機能を改善する方法を示します。

mydocname1がXMLドキュメント・タイプ(ルート要素)として、次のように宣言されているとします。

<!DOCTYPE mydocname1 ... [...

mydocname1の中で、要素<book>が宣言されています。このタグに対し、タグのドキュメント・タイプを区別するmybooksec1という名前のセクションを次のように作成できます。

begin

ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_zone_section('myxmlgroup', 'mybooksec1', 'mydocname1(book)');

end;

mydocname2が別のXMLドキュメント・タイプ(ルート要素)として、次のように宣言されているとします。

<!DOCTYPE mydocname2 ... [...

mydocname2の中で、要素<book>が宣言されています。このタグに対し、タグのドキュメント・タイプを区別するmybooksec2という名前のセクションを次のように作成できます。

begin

ctx_ddl.create_section_group('myxmlgroup', 'XML_SECTION_GROUP');
ctx_ddl.add_zone_section('myxmlgroup', 'mybooksec2', 'mydocname2(book)');

end;

セクションmybooksec1内で問合せを行うには、WITHINを次のように使用します。

'oracle within mybooksec1'

8.3.4 パス・セクション検索

XMLドキュメントには、次のような親子タグの構造を設定できます。

<A> <B> <C> dog </C> </B> </A>

この例のタグCは、タグAの子であるタグBの子です。

Oracle Textでは、PATH_SECTION_GROUPを使用してパス検索を実行できます。このセクション・グループを使用すると、問合せ内に直接の親子関係を指定できます。たとえば、要素Bの子である要素Cにある語句dogを含むすべてのドキュメントを検索できます。

PATH_SECTION_GROUPを使用すると、属性値検索および属性の等価性のテストも実行できます。

この機能に関連する新しい演算子は、次のとおりです。

- INPATH

- HASPATH

8.3.4.1 PATH_SECTION_GROUPによる索引の作成

パス・セクション検索を使用可能にするには、PATH_SECTION_GROUPを使用してXMLドキュメント・セットを索引付けします。たとえば、次の式を使用します。

プリファレンスを作成します。

begin
ctx_ddl.create_section_group('xmlpathgroup', 'PATH_SECTION_GROUP');
end;

索引を作成します。

CREATE INDEX myindex
ON xmldocs(xmlfile)
INDEXTYPE IS ctxsys.context
PARAMETERS ('datastore ctxsys.default_datastore
filter ctxsys.null_filter
section group xmlpathgroup'
);

索引を作成するときに、INPATH演算子とHASPATH演算子を使用できます。

8.3.4.2 トップレベルのタグ検索

トップレベルのタグ<A>に、語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH (/A)

または

dog INPATH(A)

8.3.4.3 任意レベルのタグ検索

任意レベルの<A>タグに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH(//A)

この問合せは、次のドキュメントを検出します。

<A>dog</A>

および

<C><B><A>dog</A></B></C>

8.3.4.4 直接の親子関係の検索

トップレベルの要素Aの直接の子である要素Bに語句dogが含まれているすべてのドキュメントを検索するには、次の問合せを行います。

dog INPATH(A/B)

この問合せは、次のXMLドキュメントを検出します。

<A><B>My dog is friendly.</B></A>

ただし、次のドキュメントは検出しません。

<C><B>My dog is friendly.</B></C>

8.3.4.5 タグ値のテスト

タグの値をテストできます。たとえば、次の問合せがあるとします。

dog INPATH(A[B="dog"])

この問合せは、次のドキュメントを検出します。

<A><B>dog</B></A>

ただし、次のドキュメントは検出しません。

<A><B>My dog is friendly.</B></A>

8.3.4.6 属性検索

属性の内容を検索できます。たとえば、次の問合せがあるとします。

dog INPATH(//A/@B)

この問合せは、次のドキュメントを検出します。

<C><A  B="snoop dog"> </A> </C>

8.3.4.7 属性値のテスト

属性の値をテストできます。たとえば、次の問合せがあるとします。

California INPATH (//A[@B = "home address"])

この問合せは、次のドキュメントを検出します。

<A B="home address">San Francisco, California, USA</A>

ただし、次のドキュメントは検出しません。

<A B="work address">San Francisco, California, USA</A>

8.3.4.8 パスのテスト

HASPATH演算子を使用して、パスの存在をテストできます。たとえば、次の問合せがあるとします。

HASPATH(A/B/C)

この問合せは、ドキュメントを検出し、スコア100を戻します。

<A><B><C>dog</C></B></A>

この問合せでは、dogは参照されません。

8.3.4.9 HASPATHによるセクションの等価性のテスト

HASPATH演算子を使用すると、セクションの等価性をテストできます。たとえば、次の問合せがあるとします。

dog INPATH A

この問合せは、次のドキュメントを検出します。

<A>dog</A>

さらに、次のドキュメントも検出します。

<A>dog park</A>

問合せを、語句dogのみに制限し、それ以外の語句を検索しないようにする場合は、HASPATH演算子によるセクションの等価性のテストを使用できます。たとえば、次の問合せがあるとします。

HASPATH(A="dog")

この問合せは、最初のドキュメントを検索し、スコア100を戻します。2番目のドキュメントは検索しません。

関連項目:
INPATHおよびHASPATH演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照してください。

9 Oracle Textの名前検索の使用

この章では、名前検索機能の使用方法について説明します。内容は次のとおりです。

- 名前検索の概要

- 名前検索の使用例

9.1 名前検索の概要

特定の文化のスペル・ルールに慣れている人は、そのルールを異なる文化に基づく名前に適用することに抵抗があります。(名前マッチングとも呼ばれる)名前検索では、表記バリエーションのためにスペルが異なっても正しい名前を照合するソリューションを提供しています。また、これを使用すると、レコードの名および姓が正しくセグメント化されていない場合などに発生する可能性がある、正確さに欠けるデータも検索できます。このように正確さに欠けるデータを処理できることが、名前検索の主なメリットです。

9.2 名前検索の使用例

次の例は、名前検索にNDATAセクションを使用する方法を示しています。

drop table people;

create table people (
full_name varchar2(2000)
);

insert into people values
('John Black Smith');

-- multi_column datastore is a convenient way of adding section tags around our data
exec ctx_ddl.drop_preference('name_ds')
begin
ctx_ddl.create_preference('name_ds', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('name_ds', 'COLUMNS', 'full_name');
end;
/

exec ctx_ddl.drop_section_group('name_sg');
begin
ctx_ddl.create_section_group('name_sg', 'BASIC_SECTION_GROUP');
ctx_ddl.add_ndata_section('name_sg', 'full_name', 'full_name');
end;
/
-- You can optionally load a thesaurus of nicknames
-- HOST ctxload -thes -name nicknames -file nicknames.txt

exec ctx_ddl.drop_preference('name_wl');
begin
ctx_ddl.create_preference('name_wl', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('name_wl', 'NDATA_ALTERNATE_SPELLING', 'FALSE');
ctx_ddl.set_attribute('name_wl', 'NDATA_BASE_LETTER', 'TRUE');
-- Include the following line only if you have loaded the thesaurus
-- file nicknames.txt:
-- ctx_ddl.set_attribute('name_wl', 'NDATA_THESAURUS', 'nicknames');
ctx_ddl.set_attribute('name_wl', 'NDATA_JOIN_PARTICLES',
'de:di:la:da:el:del:qi:abd:los:la:dos:do:an:li:yi:yu:van:jon:un:sai:ben:al');
end;
/

create index people_idx on people(full_name) indextype is ctxsys.context
parameters ('datastore name_ds section group name_sg wordlist name_wl');

-- Now you can do name searches with the following SQL:

var name varchar2(80);
exec :name := 'Jon Blacksmith'

select /*+ FIRST_ROWS */ full_name, score(1)
from people
where contains(full_name,  'ndata( full_name, '||:name||') ',1)>0
order by score(1) desc
/

次の例は、NDATAセクションを使用して名前を検索するさらに複雑なバージョンを示しています。

create table emp (
first_name    varchar2(30),
middle_name   varchar2(30),
last_name     varchar2(30),
email         varchar2(30),
phone         varchar2(30));

insert into emp values
('John', 'Black', 'Smith', 'john.smith@example.org', '123-456-7890');

-- user datastore procedure
create or replace procedure empuds_proc
(rid in rowid, tlob in out nocopy clob) is
tag varchar2(30);
phone varchar2(30);
begin
for c1 in (select FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL, PHONE
from emp
where rowid = rid)
loop
tag :='<email>';
dbms_lob.writeappend(tlob, length(tag), tag);
if (c1.EMAIL is not null) then
dbms_lob.writeappend(tlob, length(c1.EMAIL), c1.EMAIL);
end if;
tag :='</email>';
dbms_lob.writeappend(tlob, length(tag), tag);
tag :='<phone>';
dbms_lob.writeappend(tlob, length(tag), tag);
if (c1.PHONE is not null) then
phone := nvl(REGEXP_SUBSTR(c1.PHONE, '\d\d\d\d($|\s)'), ' ');
dbms_lob.writeappend(tlob, length(phone), phone);
end if;
tag :='</phone>';
dbms_lob.writeappend(tlob, length(tag), tag);
tag :='<fullname>';
dbms_lob.writeappend(tlob, length(tag), tag);
if (c1.FIRST_NAME is not null) then
dbms_lob.writeappend(tlob, length(c1.FIRST_NAME), c1.FIRST_NAME);
dbms_lob.writeappend(tlob, length(' '), ' ');
end if;
if (c1.MIDDLE_NAME is not null) then
dbms_lob.writeappend(tlob, length(c1.MIDDLE_NAME), c1.MIDDLE_NAME);
dbms_lob.writeappend(tlob, length(' '), ' ');
end if;
if (c1.LAST_NAME is not null) then
dbms_lob.writeappend(tlob, length(c1.LAST_NAME), c1.LAST_NAME);
end if;
tag :='</fullname>';
dbms_lob.writeappend(tlob, length(tag), tag);
end loop;
end;
/

--list
show errors

exec ctx_ddl.drop_preference('empuds');
begin
ctx_ddl.create_preference('empuds', 'user_datastore');
ctx_ddl.set_attribute('empuds', 'procedure', 'empuds_proc');
ctx_ddl.set_attribute('empuds', 'output_type', 'CLOB');
end;
/

exec ctx_ddl.drop_section_group('namegroup');
begin
ctx_ddl.create_section_group('namegroup', 'BASIC_SECTION_GROUP');
ctx_ddl.add_ndata_section('namegroup', 'fullname', 'fullname');
ctx_ddl.add_ndata_section('namegroup', 'phone', 'phone');
ctx_ddl.add_ndata_section('namegroup', 'email', 'email');
end;
/

-- Need to load nicknames thesaurus
-- ctxload -thes -name nicknames -file dr0thsnames.txt
-- You can find sample nicknames thesaurus file, dr0thsnames.txt, under
-- $ORACLE_HOME/ctx/sample/thes directory.

exec ctx_ddl.drop_preference('ndata_wl');
begin
ctx_ddl.create_preference('NDATA_WL', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('NDATA_WL', 'NDATA_ALTERNATE_SPELLING', 'FALSE');
ctx_ddl.set_attribute('NDATA_WL', 'NDATA_BASE_LETTER', 'TRUE');
ctx_ddl.set_attribute('NDATA_WL', 'NDATA_THESAURUS', 'NICKNAMES');
ctx_ddl.set_attribute('NDATA_WL', 'NDATA_JOIN_PARTICLES',
'de:di:la:da:el:del:qi:abd:los:la:dos:do:an:li:yi:yu:van:jon:un:sai:ben:al');
end;
/

exec ctx_output.start_log('emp_log');
create index name_idx on emp(first_name) indextype is ctxsys.context
parameters ('datastore empuds section group namegroup wordlist ndata_wl
memory 500M');

exec ctx_output.end_log;

-- Now you can do name searches with the following SQL:
var name varchar2(80);
exec :name := 'Jon Blacksmith'

select first_name, middle_name, last_name, phone, email, scr from
(select /*+ FIRST_ROWS */
first_name, middle_name, last_name, phone, email, score(1) scr
from emp
where contains(first_name,
'ndata(phone, '||:name||') OR  ndata(email,'||:name||') OR
ndata(fullname, '||:name||') ',1)>0
order by score(1) desc
) where rownum <= 10;

10 Oracle Textでのシソーラスの使用

この章では、問合せアプリケーションをシソーラスを使用して改善する方法を説明します。次の項目について説明します。

- Oracle Textシソーラス機能の概要

- シソーラスの用語の定義

- 問合せアプリケーションでのシソーラスの使用

- 提供されるナレッジ・ベース

10.1 Oracle Textシソーラス機能の概要

問合せアプリケーションのユーザーが、特定のトピックに関する情報を検索するとき、そのトピックについて書かれたドキュメント内で使用されているワードがわからない場合があります。

Oracle Textでは、ワードと句のシノニムおよび階層関係を定義する大/小文字を区別するシソーラスまたは大/小文字を区別しないシソーラスを作成できます。その結果、シソーラスで定義した類似語または関連語が含まれるように問合せを拡張して、関連テキストを含むドキュメントを取り出すことができます。

シソーラスは、アプリケーション開発者が作成し、システムにロードできます。

注意:
Oracle Textのシソーラスの形式および機能性は、ISO-2788およびANSI Z39.19(1993)の両標準に準拠しています。

10.1.1 Oracle Textシソーラスの作成とメンテナンス

シソーラスとシソーラスのエントリは、CTXAPPロールを持つすべてのOracle Textユーザーが作成、変更および削除できます。

10.1.1.1 CTX_THESパッケージ

シソーラスをプログラムでメンテナンスおよびブラウズするには、PL/SQLパッケージCTX_THESを使用できます。このパッケージを使用すると、語句および階層関係のブラウズ、語句の追加と削除、およびシソーラス・リレーションの追加と削除を実行できます。

10.1.1.2 シソーラス演算子

また、CONTAINS句でシソーラス演算子を使用すると、ロードしたシソーラスに基づいて問合せ語句を拡張できます。たとえば、SYN演算子を使用すると、次のようにdogなどの語句をそのシノニムに拡張できます。

'syn(dog)'

10.1.1.3 ctxloadユーティリティ

ctxloadユーティリティは、シソーラスをプレーン・テキスト・ファイルからシソーラス表にロードする場合、およびシソーラスをシソーラス表から出力(つまりダンプ)ファイルにダンプする場合に使用できます。

ctxloadで作成されたシソーラスのダンプ・ファイルは、出力したり、他のアプリケーションの入力として使用できます。ダンプ・ファイルは、シソーラス表にシソーラスをロードする場合にも使用できます。このことは、既存のシソーラスを新しいシソーラスを作成するための基礎として使用する場合に便利です。

注意:

セキュリティを確実にするために、インタラクティブ・モードを使用し、ユーザー・パスワードの入力を求められたときにctxloadにパスワードを入力することをお薦めします。コマンドラインにパスワードを入力しないことをお薦めします。

10.1.2 大/小文字を区別するシソーラスの使用

大/小文字を区別するシソーラスでは、語句(ワードおよび句)は、入力したとおり正確に格納されます。たとえば、語句を大/小文字の混合で入力した場合(CTX_THESパッケージまたはシソーラスのロード・ファイルのいずれかを使用)、シソーラスでは、そのエントリを大/小文字の混合で格納します。

注意:
大/小文字を区別するシソーラスから取得した問合せ拡張を利用するには、索引も大/小文字を区別する必要があります。

シソーラスのロード時に、-thescaseパラメータを使用して、大/小文字を区別してロードするように指定できます。

CTX_THES.CREATE_THESAURUSによるシソーラスの作成時に、大/小文字を区別して作成するように指定できます。

また、大/小文字を区別するシソーラスを問合せで指定した場合、シソーラス検索では、問合せ語句は問合せで入力したとおりに正確に使用されます。したがって、大/小文字を区別するシソーラスを使用する問合せでは、索引も大/小文字を区別しているかぎり、問合せ拡張における精度が向上し、検索が容易になります。

たとえば、大/小文字を区別するシソーラスを作成する場合、異なる意味を持つ語句、たとえばTurkey(国名)とturkey(鳥の種類)には、異なるエントリが使用されます。このシソーラスを使用すると、Turkeyへの問合せは、Turkeyに対応付けられているエントリのみを含むように拡張されます。

10.1.3 大/小文字を区別しないシソーラスの使用

大/小文字を区別しないシソーラスでは、語句は、当初の入力時の文字に関係なく、すべて大文字で格納されます。

ctxloadプログラムは、デフォルトでは大/小文字を区別しないモードでシソーラスをロードします。

CTX_THES.CREATE_THESAURUSによるシソーラスの作成時、シソーラスは、デフォルトでは大/小文字を区別せずに作成されます。

また、大/小文字を区別しないシソーラスを問合せで指定した場合、シソーラス検索では、問合せ語句はすべて大文字に変換されます。その結果、Oracle Textでは、大/小文字の混合で表記されたときに異なる意味を持つ語句を区別できません。

たとえば、大/小文字を区別しないシソーラスを作成する場合、2つの異なる意味を持つ語句TURKEY(国名と鳥の種類)には、異なるエントリが使用されます。このシソーラスを使用すると、Turkeyまたはturkeyのいずれに対する問合せも、シソーラス検索ではTURKEYに変換された後、2つの意味に対応付けられているすべてのエントリを含むように拡張されます。

関連項目:
「ctxloadユーティリティ」

10.1.4 デフォルトのシソーラス

問合せでシソーラス名を指定しない場合、デフォルトで、シソーラス演算子は、DEFAULTという名前のシソーラスを使用します。ただし、Oracle Textには、デフォルトのシソーラスはありません。

したがって、シソーラス演算子に対してデフォルトのシソーラスを使用する場合は、DEFAULTという名前のシソーラスを作成する必要があります。このシソーラスの作成には、Oracle Textがサポートしている次のシソーラス作成方法を使用できます。

- CTX_THES.CREATE_THESAURUS(PL/SQL)

- ctxloadユーティリティ

関連項目:
ctxloadおよびCTX_THESパッケージの使用方法の詳細は、『Oracle Textリファレンス』およびこの章の「ctxloadユーティリティ」を参照してください。

10.1.5 提供されるシソーラス

Oracle Textには、デフォルトのシソーラスはありません。ただし、Oracle Textでは、シソーラスをctxloadでロードするファイルの形式で提供しています。このファイルを使用して汎用の英語シソーラスを作成できます。

このシソーラス・ロード・ファイルを使用すると、Oracle Textのデフォルトのシソーラスを作成できます。あるいは、このファイルを特定の主題または主題の範囲にあわせたシソーラスを作成するための基礎として使用することもできます。

関連項目:
ctxloadおよびCTX_THESパッケージの使用方法の詳細は、『Oracle Textリファレンス』およびこの章の「ctxloadユーティリティ」を参照してください。

10.1.5.1 提供されるシソーラスの構造と内容

提供されるシソーラスは、Roget's Thesaurus(ロジェの分類語彙辞典)のような従来のシソーラスに類似しています。同義の語句や語義的に関連する語句のリストを備えています。

提供されるシソーラスは語句を階層形式に編成し、下位語とその上位語との実世界での実用的な関係を定義して付加価値を付けています。

また、階層の異なる領域の語句間で相互参照もできます。

10.1.5.2 提供されるシソーラスの場所

このシソーラス・ロード・ファイルの正確な名前と場所は、オペレーティング・システム固有です。ただし、通常、ファイル名は、dr0thsus(適切なテキスト・ファイルの拡張子が付きます)で、ファイルは次のディレクトリ構造内に置かれます。

<Oracle_home_directory>
<interMedia_Text_directory>
sample
thes

関連項目:
Oracle Textのディレクトリ構造の詳細は、使用しているオペレーティング・システム固有のOracle Databaseのインストレーション・マニュアルを参照してください。

10.2 シソーラスの用語の定義

シソーラスを使用して、シノニム、関連語および階層関係を作成できます。次の各項で、例を示します。

10.2.1 シノニムの定義

コンピュータ・サイエンス用語のシソーラスがある場合、語句XMLのシノニムをExtensible Markup Languageと定義します。これによって、この語句のいずれを問い合せても、同じドキュメントが戻ります。

XML

SYN Extensible Markup Language

次のようにSYN演算子を使用すると、XMLをそのシノニムにまで拡張できます。

'SYN(XML)'

次のように拡張されます。

'XML, Extensible Markup Language'

10.2.2 階層関係の定義

ドキュメント・セットがニュース記事で構成されている場合は、シソーラスを使用して、地理用語の階層を定義できます。たとえば、米国のカリフォルニア州の地理階層を示す次の階層があるとします。

California
NT Northern California
NT San Francisco
NT San Jose
NT Central Valley
NT Fresno
NT Southern California
NT Los Angeles

NT演算子を使用すると、カリフォルニアに対する問合せを次のように拡張できます。

'NT(California)'

次のように拡張されます。

'California, Northern California, San Francisco, San Jose, Central Valley,
Fresno, Southern California, Los Angeles'

結果のヒットリストには、米国のカリフォルニア州の地域や都市に関連するすべてのドキュメントが表示されます。

10.3 問合せアプリケーションでのシソーラスの使用

カスタム・シソーラスを定義すると、問合せをより優れた方法で処理できます。使用しているアプリケーションのユーザーには、トピックを表現するワードがわからない場合があるため、予想される問合せ語句にシノニムまたは下位語を定義できます。シソーラス演算子を使用すると、問合せをシソーラス語句に拡張できます。

カスタム・シソーラスを使用して、問合せをよりインテリジェントに処理できるように問合せアプリケーションを拡張するには、次の2つの方法があります。

- カスタム・シソーラスをロードし、シソーラス演算子を使用して問合せを入力します。

- カスタム・シソーラスを使用してナレッジ・ベースを補強し(英語のみ)、ABOUT演算子を使用して問合せを拡張します。

どちらのアプローチにも、それぞれメリットとデメリットがあります。

10.3.1 カスタム・シソーラスのロードおよびシソーラス・ベースの問合せの発行

カスタム・シソーラスを作成する手順は、次のとおりです。

1. シソーラスを作成します。「シソーラスの用語の定義」を参照してください。

2. ctxloadを使用してシソーラスをロードします。次の例では、tech_docというシソーラスをtech_thesaurus.txtというインポート・ファイルからインポートします。

ctxload -thes -name tech_doc -file tech_thesaurus.txt

3. プロンプト表示されたら、ユーザー名とパスワードを入力します。セキュリティを確実にするために、コマンドラインにパスワードを入力しないでください。

4. シソーラス演算子を使用して問合せを行います。たとえば次のようにすると、XMLと、tech_docで定義したXMLのシノニムを含むすべてのドキュメントを検索できます。

'SYN(XML, tech_doc)'

10.3.1.1 メリット

この方法を使用するメリットは、索引付け後にシソーラスを変更できることです。

10.3.1.2 制限事項

この方法では、問合せでシソーラス拡張演算子を使用する必要があります。問合せが長いと、シソーラスの拡張で余分なオーバーヘッドが発生し、問合せ速度が遅くなります。

10.3.2 カスタム・シソーラスによるナレッジ・ベースの補強

カスタム・シソーラスを既存のナレッジ・ベースのブランチに追加できます。ナレッジ・ベースは、テーマの索引付け、ABOUT問合せおよびドキュメント・サービスでのドキュメント・テーマの抽出などに使用する概念の階層ツリーです。

既存のナレッジ・ベースを新しいシソーラスで補強する場合は、シノニムや下位語に暗黙的に拡張するABOUT演算子を使用して問い合せます。この問合せにシソーラス演算子は使用しません。

カスタム・シソーラスで既存のナレッジ・ベースを補強する手順は、次のとおりです。

1. カスタム・シソーラスを作成し、新規語句を既存のナレッジ・ベースの語句にリンクします。「シソーラスの用語の定義」および「新規語句の既存語句へのリンク」を参照してください。

2. ctxloadを使用してシソーラスをロードします。「ctxloadによるシソーラスのロード」を参照してください。

3. ctxkbtcコンパイラを使用して、ロード済のシソーラスを次のようにコンパイルします。「ロード済のシソーラスのコンパイル」を参照してください。

4. ドキュメントを索引付けします。デフォルトでは、システムが索引のテーマ・コンポーネントを作成します。

5. ABOUT演算子を使用して問合せを行います。たとえば、語句politicsに関連するシノニムまたは下位語を含むすべてのドキュメントを検索するには、次の問合せを入力します。

'about(politics)'

10.3.2.1 メリット

カスタム・シソーラスを索引付けの前に既存のナレッジ・ベースにコンパイルすると、ABOUT演算子を使用することにより問合せが高速かつ単純になります。また、ドキュメント・サービスで、テーマ・サマリーと要旨を作成する際にカスタマイズされた情報を利用できます。

10.3.2.2 制限事項

ABOUT演算子を使用するには、索引内にテーマ・コンポーネントが存在していることが必要であり、この場合は必要なディスク領域が多少増加します。ドキュメントを索引付けする前にシソーラスを定義する必要があります。シソーラスを変更した場合は、シソーラスを再コンパイルし、ドキュメントを再索引付けする必要があります。

10.3.2.3 新規語句の既存語句へのリンク

ナレッジ・ベースに語句を追加する場合は、テーマの検証で最適な結果が得られるように、新規語句をナレッジ・ベースのカテゴリの1つにリンクすることをお薦めします。

関連項目:
提供される英語のナレッジ・ベースの詳細は、『Oracle Textリファレンス』を参照してください。

新規語句が既存のカテゴリから完全に分離している場合は、新規語句から検証されるテーマが少なくなります。その結果、ABOUT問合せの精度が低下し、要旨およびテーマのハイライト表示の品質も低下します。

既存語句を新規語句の上位語にすることによって、新規語句を既存語句にリンクします。

10.3.2.3.1 例: 新規語句の既存語句へのリンク

医学用語の階層を含む医学シソーラスmedthesを購入したとします。このシソーラスの4つの最上位語は、次のとおりです。

- Anesthesia and Analgesia(麻酔および無痛)

- Anti-Allergic and Respiratory System Agents(抗アレルギ薬および呼吸器系薬)

- Anti-Inflammatory Agents, Antirheumatic Agents, and Inflammation Mediators(抗炎症薬、抗リウマチ薬および炎症伝達物質)

- Antineoplastic and Immunosuppressive Agents(抗腫瘍薬および免疫抑制薬)

これらの語句を既存のナレッジ・ベースにリンクするには、医学シソーラスに次のエントリを追加して、新規語句を既存のhealth and medicineブランチにマップします。

health and medicine
NT Anesthesia and Analgesia
NT Anti-Allergic and Respiratory System Agents
NT Anti-Inflamammatory Agents, Antirheumatic Agents, and Inflamation Mediators
NT Antineoplastic and Immunosuppressive Agents

10.3.2.4 ctxloadによるシソーラスのロード

医学シソーラスがmed.thesというファイルにあるとします。次のように、ctxloadを使用して、シソーラスをmedthesとしてロードします。

ctxload -thes -thescase y -name medthes -file med.thes -user ctxsys

ctxloadコマンドラインを入力すると、ユーザー・パスワードの入力を要求されます。セキュリティを確実にするために、コマンドラインにパスワードを入力しないでください。かわりに、-userを省略し、ユーザー名とパスワードのそれぞれに対してctxloadでプロンプト表示するようにできます。

10.3.2.5 ロード済のシソーラスのコンパイル

ロードされたシソーラスmedthesをナレッジ・ベースにリンクするには、次のようにctxkbtcを使用します。

ctxkbtc -user ctxsys -name medthes

ctxkbtcコマンドラインを入力すると、ユーザー・パスワードの入力を要求されます。ctxloadに関して、セキュリティを確実にするために、コマンドラインにパスワードを入力しないでください。

重要:

セキュリティを確実にするために、インタラクティブ・モードを使用し、ユーザー・パスワードの入力を求められたときにctxloadおよびctxkbtcにパスワードを入力することをお薦めします。コマンドラインにパスワードを入力しないことをお薦めします。

10.4 提供されるナレッジ・ベース

Oracle Textでは、英語とフランス語のナレッジ・ベースを提供します。提供されるナレッジ・ベースには、テーマ分析の実行に使用する情報が含まれています。テーマ分析には、テーマの索引付け、ABOUT問合せおよびCTX_DOCパッケージによるテーマの抽出が含まれます。

ナレッジ・ベースは、概念とカテゴリの階層ツリーです。次の6つの主要ブランチがあります。

- Science and technology

- Business and economics

- Government and military

- Social environment

- Geography

- Abstract ideas and concepts

関連項目:
カテゴリ階層の分類は、『Oracle Textリファレンス』を参照してください。

提供されるナレッジ・ベースは階層形式であり、上位語、下位語および関連語情報が含まれているという点で、シソーラスに似ています。したがって、新規語句を既存語句にリンクして業界固有のシソーラスで既存のナレッジ・ベースを補強することで、テーマ分析の精度を向上させることができます。

関連項目:
「カスタム・シソーラスによるナレッジ・ベースの補強」

注意:
Oracle Textで提供されるナレッジ・ベースは、Oracle Textとともにインストールされない場合があります。ナレッジ・ベースがインストールされなかった場合は、個別のインストールが必要になることがあります。詳細は、使用しているオペレーティング・システム固有のOracle Databaseのインストレーション・マニュアルを参照してください。

また、言語固有のシソーラスをナレッジ・ベースにコンパイルすると、テーマ機能を別の言語に拡張できます。

関連項目:
「言語固有のナレッジ・ベースの追加」

ナレッジ・ベースのキャラクタ・セット

ナレッジ・ベースは、任意のシングルバイト・キャラクタ・セットで格納できます。提供されるナレッジ・ベースは、キャラクタ・セットWE8ISO8859P1を使用しています。拡張ナレッジ・ベースは、US7ASCIIなどの別のキャラクタ・セットで格納できます。

10.4.1 言語固有のナレッジ・ベースの追加

シングルバイトの空白で区切られた言語の独自のナレッジ・ベースをロードすると、スペイン語など、英語やフランス語以外の言語にテーマ機能を拡張できます。

テーマ機能には、テーマの索引付け、ABOUT問合せ、テーマのハイライト表示およびCTX_DOCを使用したテーマ、要旨およびテーマ・サマリーの生成などの機能が含まれます。

テーマ機能は、ユーザー定義ナレッジ・ベースを追加して拡張します。たとえば、スペイン語シソーラスからスペイン語のナレッジ・ベースを作成できます。

言語固有のナレッジ・ベースをロードする手順は、次のとおりです。

1. ユーザー定義のカスタム・シソーラスをctxloadを使用してロードします。「ctxloadによるシソーラスのロード」を参照してください。

2. 言語部分がターゲット言語になるように、NLS_LANGを設定します。キャラクタ・セット部分は、シングルバイト・キャラクタ・セットに設定する必要があります。

3. ロード済のシソーラスをctxkbtcを使用して次のようにコンパイルします。
ctxkbtc -user ctxsys -name my_lang_thes

プロンプト表示されたら、-userのパスワードを入力します。「ロード済のシソーラスのコンパイル」を参照してください。

この文は、言語固有のナレッジ・ベースをロード済のシソーラスからコンパイルします。

索引付けおよびABOUT問合せ時のテーマ分析にこのナレッジ・ベースを使用するには、NLS_LANG言語をBASIC_LEXERプリファレンスのTHEME_LANGUAGE属性として指定します。

10.4.1.1 制限事項

ナレッジ・ベースの追加には、次の制限事項が適用されます。

- Oracleが提供するナレッジ・ベースは、英語とフランス語のみです。それ以外の言語に対しては、独自のシソーラスを用意する必要があります。

- ナレッジ・ベースは、シングルバイト・キャラクタ・セットを持つ言語に対してのみ追加できます。マルチバイト・キャラクタ・セットのみで表現される言語に対して、ナレッジ・ベースを作成することはできません。データベースが、UTF-8などのマルチバイト・ユニバーサル・キャラクタ・セットの場合は、そのシソーラスのコンパイル時に、NLS_LANGパラメータを互換性のあるシングルバイト・キャラクタ・セットに設定する必要があります。

- ナレッジ・ベースの追加によって、空白で区切られた言語が最適に機能します。

- NLS_LANG言語ごとに最大で1つのナレッジ・ベースを持つことができます。

- 上位語、下位語および関連語などの階層問合せフィードバック情報の取得操作は、英語とフランス語以外の言語では機能しません。その他の言語は、ナレッジ・ベースがユーザーのシソーラスからのみ導出されます。したがって、使用しているシソーラスから直接階層情報を取得することをお薦めします。

関連項目:
テーマの索引付け、ABOUT問合せ、CTX_DOCパッケージの使用方法および提供される英語のナレッジ・ベースの詳細は、『Oracle Textリファレンス』を参照してください。

11 XML問合せの結果セット・インタフェースの使用

この章では、XML問合せの結果セット・インタフェースの使用方法について説明します。内容は次のとおりです。

- XML問合せの結果セット・インタフェースの概要

- XML問合せの結果セット・インタフェースの使用

11.1 XML問合せの結果セット・インタフェースの概要

アプリケーション内の検索結果のページは、多くの異種要素(最初のいくつかのドキュメントのメタデータ、合計ヒット数、ワード当たりのヒット数など)で構成されます。以前のバージョンのOracle Textでこれらの結果を生成するには、複数の問合せとコール(元表に対する問合せやCTX_QUERY.COUNT_HITSのコールなど)が必要でした。追加のコールのたびに、問合せを再解析して索引メタデータを検索するための時間がかかります。また、SQLでは、反復問合せ絞込みや上位10の内訳といった一部の検索操作が難しくなります。SQL文を構成して目的の結果を達成することが可能であっても、通常はこのようなSQLは次善の選択となります。

結果セット・インタフェースは、検索結果のページに必要な様々な種類のデータを同時に作成でき、オーバーヘッドを共有することでパフォーマンスを向上させます。結果セット・インタフェースは、SQLでは表現しにくいデータ・ビュー(カテゴリ問合せによる上位Nなど)も戻すことができます。

11.2 XML問合せの結果セット・インタフェースの使用

CTX_QUERY.RESULT_SET() APIにより、複数のCONTAINS()問合せで結果を取得することなく単一の問合せで問合せ結果を取得できます。たとえば、検索結果ページを表示するには、次の情報を最初に取得する必要があります。

- 日時および関連性でソートされた上位20個のヒット・リスト

- 指定されたテキスト問合せのヒットの総数

- 公開日でグループ化した件数

- 作成者でグループ化した件数

検索するドキュメントを格納する次の表定義を前提とします。

create table docs (
docid    number,
author   varchar2(30),
pubdate  date,
title    varchar2(60),  doc      clob);

次のOracle Text索引の定義を前提とします。

create index docidx on docs(doc) indextype is ctxsys.context
filter by author, pubdate, title,
order by pubdate;

これらの定義を使用する場合、4つのSQL文を発行することによって、検索結果ページを表示するための4つの情報を取得できます。

-- Get top 20 hits sorted by date and relevancy
select * from
(select /*+ first_rows */ rowid, title, author, pubdate
from docs where contains(doc, 'oracle',1)>0
order by pubdate desc, score(1) desc)
where rownum < 21;

-- Get total number of hits for the given Text query
select count(*) from docs where contains(doc, 'oracle',1)>0;

-- Get counts group by publication date
select pubdate, count(*) from docs where contains(doc, 'oracle',1)>0
group by pubdate;

-- Get counts group by author
select author, count(*) from docs where contains(doc, 'oracle',1)>0 group by author;

表示されているとおり、同じ問合せを4回実行しているため、別々のSQL文を使用するとリソース集中型の問合せになります。ただし、CTX_QUERY.RESULT_SET()を使用すると、単一のOracle Textの問合せにこのすべての情報を入力できます。

declare
rs clob;
begin
dbms_lob.createtemporary(rs, true, dbms_lob.session);
ctx_query.result_set('docidx', 'oracle text performance tuning', '
<ctx_result_set_descriptor>
<count/>
<hitlist start_hit_num="1" end_hit_num="20" order="pubDate desc,
score desc">
<score/>
<rowid/>
<sdata name="title"/>
<sdata name="author"/>
<sdata name="pubDate"/>
</hitlist>
<group sdata="pubDate">
<count/>
</group>
<group sdata="author">
<count/>
</group>
</ctx_result_set_descriptor>
', rs);

-- Put in your code here to process the Output Result Set XML
dbms_lob.freetemporary(rs);
exception
when others then
dbms_lob.freetemporary(rs);
raise;
end;
/

結果セットの出力は、検索結果ページの作成に必要なすべての情報を含むXMLになります。

<ctx_result_set>
<hitlist>
<hit>
<score>90</score>
<rowid>AAAPoEAABAAAMWsAAC</rowid>
<sdata name="TITLE"> Article 8 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>86</score>
<rowid>AAAPoEAABAAAMWsAAG</rowid>
<sdata name="TITLE"> Article 20 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>78</score>
<rowid>AAAPoEAABAAAMWsAAK</rowid>
<sdata name="TITLE"> Article 17 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>77</score>
<rowid>AAAPoEAABAAAMWsAAO</rowid>
<sdata name="TITLE"> Article 37 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
...
<hit>
<score>72</score>
<rowid>AAAPoEAABAAAMWsAAS</rowid>
<sdata name="TITLE"> Article 56 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
</hitlist>

<count>100</count>

<groups sdata="PUBDATE">
<group value="2001-01-01 00:00:00"><count>25</count></group>
<group value="2001-01-02 00:00:00"><count>50</count></group>
<group value="2001-01-03 00:00:00"><count>25</count></group>
</groups>

<groups sdata="AUTHOR">
<group value="John"><count>50</count></group>
<group value="Mike"><count>25</count></group>
<group value="Steve"><count>25</count></group>
</groups>

</ctx_result_set>

関連項目:
構文の詳細は、『Oracle Textリファレンス』を参照してください。

12 Oracle Textの管理

この章では、Oracle Textの管理について説明します。次の項目について説明します。

- Oracle Textのユーザーとロール

- DMLキュー

- CTX_OUTPUTパッケージ

- CTX_REPORTパッケージ

- Oracle Enterprise ManagerのText Manager

- サーバーと索引付け

- Oracle Enterprise Managerのデータベース機能使用状況トラッキング

- Oracle Real Application Clusters上のOracle Text

12.1 Oracle Textのユーザーとロール

すべてのユーザーがOracle Textの索引を作成してCONTAINS問合せを入力できる一方、Oracle Textでは、管理用のCTXSYSユーザーおよびアプリケーション開発者用のCTXAPPロールを提供しています。

12.1.1 CTXSYSユーザー

CTXSYSユーザーは、インストール時に作成されます。CTXSYSユーザーは、次の作業を実行できます。

- すべての索引の表示

- すべての索引の同期化

- ナレッジ・ベース拡張子コンパイラ、ctxkbtcの実行

- すべてのシステム定義ビューへの問合せ

- CTXAPPロールを持つユーザーのすべての作業の実行

注意:
以前のリリースのOracle Textでは、CTXSYSにはSYSDBA権限があり、CTXSYSのみがシステム定義プリファレンスの変更やシステム・パラメータの設定などの特定の機能を実行できました。

12.1.2 CTXAPPロール

CTXAPPロールは、システム定義のロールです。ユーザーは次の作業を実行できます。

- Oracle Textのプリファレンスの作成および削除

- Oracle TextのPL/SQLパッケージの使用

すべてのユーザーは、Oracle Textの索引の作成およびテキスト問合せの入力を行うことができます。CTXAPPロールを使用して、ユーザーはプリファレンスを作成し、PL/SQLパッケージを使用できます。

12.1.3 ユーザーへのロールおよび権限の付与

システムでは、標準SQLモデルを使用してロールをユーザーに付与します。テキスト・ロールをユーザーに付与するには、GRANT文を使用します。

また、アプリケーション開発者にOracle TextのPL/SQLパッケージにあるプロシージャをコールする許可を与えるには、各ユーザーに対してOracle TextのパッケージのEXECUTE権限を明示的に付与する必要があります。

関連項目:
第2章「Oracle Textの使用の開始」の「Oracle Textユーザーの作成」

12.2 DMLキュー

元表のドキュメントに対して挿入、更新または削除がある場合、DMLキューでは、索引付けを待機しているドキュメントの要求を格納します。CTX_DDL.SYNC_INDEXを使用して索引を同期化すると、その要求はキューから削除されます。

保留中のDML要求は、CTX_PENDINGビューとCTX_USER_PENDINGビューを使用して問い合せることができます。

DMLエラーは、CTX_INDEX_ERRORSビューまたはCTX_USER_INDEX_ERRORSビューを使用して問い合せることができます。

関連項目
これらのビューの詳細は、『Oracle Textリファレンス』を参照してください。

12.3 CTX_OUTPUTパッケージ

索引付け要求およびドキュメント・サービス要求のロギングには、PL/SQLパッケージCTX_OUTPUTを使用します。

関連項目:
このパッケージの詳細は、『Oracle Textリファレンス』を参照してください。

12.4 CTX_REPORTパッケージ

CTX_REPORTパッケージを使用して、索引および問合せのレポートを作成します。このレポートを使用すると、アプリケーションの微調整およびトラブルシューティングができます。

関連項目:
このパッケージの詳細は、『Oracle Textリファレンス』を参照してください。

CTX_REPORTパッケージには、次のプロシージャが含まれます。

CTX_REPORT.DESCRIBE_INDEX

CTX_REPORT.DESCRIBE_POLICY

これらのプロシージャにより、索引メタデータの設定、使用される索引付けオブジェクト、オブジェクトの属性の設定および(CTX_REPORT.DESCRIBE_INDEX用の)索引パーティション情報(ある場合)を含む、既存の索引またはポリシーについて説明するレポートが作成されます。これらのプロシージャは、索引関連の問題の診断で特に役立ちます。

これは、単純なCONTEXT索引上で実行される、DESCRIBE_INDEXのサンプル出力です。

=================================================================
INDEX DESCRIPTION
=================================================================
index name:                      "DR_TEST"."TDRBPRX0"
index id:                        1160
index type:                      context
base table:                      "DR_TEST"."TDRBPR"
primary key column:              ID
text column:                     TEXT2
text column type:                VARCHAR2(80)
language column:
format column:
charset column:
=================================================================
INDEX OBJECTS
=================================================================
datastore:                       DIRECT_DATASTORE
filter:                          NULL_FILTER
section group:                   NULL_SECTION_GROUP
lexer:                           BASIC_LEXER
wordlist:                        BASIC_WORDLIST
stemmer:                         ENGLISH
fuzzy_match:                     GENERIC
stoplist:                        BASIC_STOPLIST
stop_word:                       teststopword
storage:                         BASIC_STORAGE
r_table_clause:                  lob (data) store as (cache)
i_index_clause:                  compress 2

CTX_REPORT.CREATE_INDEX_SCRIPT

CTX_REPORT.CREATE_POLICY_SCRIPT

CREATE_INDEX_SCRIPTは、指定したテキスト索引の複製を作成できるSQL*Plusスクリプトを作成します。索引はあるが、そのスクリプトの作成に使用された元のスクリプト(ある場合)がないとき、索引を再作成できるようにする場合は、これを使用します。たとえば、誤ってスクリプトを削除した場合、CREATE_INDEX_SCRIPTを使用するとスクリプトを再作成できます。同様に、別のユーザーから索引を継承したが、それを作成したスクリプトは継承していない場合も、CREATE_INDEX_SCRIPTを使用すると便利です。

索引ではなくポリシーを再作成できるという点を除くと、CREATE_POLICY_SCRIPTはCREATE_INDEX_SCRIPTと同様に動作します。

これは、(完全なリスト表示ではない)単純なCONTEXT索引上で実行される、CREATE_INDEX_SCRIPTのサンプル出力です。

begin
ctx_ddl.create_preference('"TDRBPRX0_DST"','DIRECT_DATASTORE');
end;
/
...
/
begin
ctx_ddl.create_section_group('"TDRBPRX0_SGP"','NULL_SECTION_GROUP');
end;
/
...
begin
ctx_ddl.create_preference('"TDRBPRX0_WDL"','BASIC_WORDLIST');
ctx_ddl.set_attribute('"TDRBPRX0_WDL"','STEMMER','ENGLISH');
ctx_ddl.set_attribute('"TDRBPRX0_WDL"','FUZZY_MATCH','GENERIC');
end;
/
begin
ctx_ddl.create_stoplist('"TDRBPRX0_SPL"','BASIC_STOPLIST');
ctx_ddl.add_stopword('"TDRBPRX0_SPL"','teststopword');
end;
/
...
/
begin
ctx_output.start_log('TDRBPRX0_LOG');
end;
/
create index "DR_TEST"."TDRBPRX0"
on "DR_TEST"."TDRBPR"
("TEXT2")
indextype is ctxsys.context
parameters('
datastore       "TDRBPRX0_DST"
filter          "TDRBPRX0_FIL"
section group   "TDRBPRX0_SGP"
lexer           "TDRBPRX0_LEX"
wordlist        "TDRBPRX0_WDL"
stoplist        "TDRBPRX0_SPL"
storage         "TDRBPRX0_STO"
')
/

CTX_REPORT.INDEX_SIZE

このプロシージャは、内部索引オブジェクト名とその表領域、割当てサイズおよび使用サイズを示すレポートを作成します。DBAが索引のサイズを監視する必要がある場合(たとえば、ディスク領域が不足している場合)は、これを使用すると便利です。

このプロシージャのサンプル出力は次のようになります(部分的にリスト表示します)。

=================================================================
INDEX SIZE FOR DR_TEST.TDRBPRX10
=================================================================
TABLE:                          DR_TEST.DR$TDRBPRX10$I
TABLESPACE NAME:                DRSYS
BLOCKS ALLOCATED:                                            4
BLOCKS USED:                                                 1
BYTES ALLOCATED:                               8,192 (8.00 KB)
BYTES USED:                                    2,048 (2.00 KB)

INDEX (LOB):                    DR_TEST.SYS_IL0000023161C00006$$
TABLE NAME:                     DR_TEST.DR$TDRBPRX10$I
TABLESPACE NAME:                DRSYS
BLOCKS ALLOCATED:                                            5
BLOCKS USED:                                                 2
BYTES ALLOCATED:                             10,240 (10.00 KB)
BYTES USED:                                    4,096 (4.00 KB)

INDEX (NORMAL):                 DR_TEST.DR$TDRBPRX10$X
TABLE NAME:                     DR_TEST.DR$TDRBPRX10$I
TABLESPACE NAME:                DRSYS
BLOCKS ALLOCATED:                                            4
BLOCKS USED:                                                 2
BYTES ALLOCATED:                               8,192 (8.00 KB)
BYTES USED:                                    4,096 (4.00 KB)

CTX_REPORT.INDEX_STATS

INDEX_STATSにより、索引付けされるドキュメントの数、索引に含まれる一意のトークンの数、トークンの平均サイズ、索引の断片化情報など、索引に関する様々な統計が算出されます。INDEX_STATSの使用例は、ストップリストの最適化に含まれる場合があります。

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

CTX_REPORT.QUERY_LOG_SUMMARY

このプロシージャは、ログに記録された問合せのレポートを作成します。これを使用すると、単純な分析を実行できます。問合せ分析を行うと、次のことがわかります。

- 行われた問合せ

- 成功した問合せ

- 失敗した問合せ

- 各問合せが行われた回数

これらの要素を様々な方法で組み合せると、アプリケーションで最も頻繁に行われた、失敗した50個の問合せなどのような判断ができます。

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

CTX_REPORT.TOKEN_INFO

TOKEN_INFOは、主に問合せに関する問題の診断(たとえば、索引データが破損していないかの確認)で使用されます。たとえば、これを使用すると、どのドキュメントが予期しないトークンまたは不正なトークンを生成しているかがわかります。

CTX_REPORT.TOKEN_TYPE

これは参照ファンクションであり、他のファンクション(CTX_DDL.OPTIMIZE_INDEX、CTX_REPORT.TOKEN_INFOなど)に対する入力として主に使用されます。

12.5 Oracle Enterprise ManagerのText Manager

Oracle Enterprise Managerには、Oracle Text索引の構成、メンテナンスおよび管理を行うためのText Managerが用意されています。Text Managerを使用すると、Oracle Text索引の構成および管理に関する基本的なタスクをすべて実行できます。単一のOracleデータベース・インスタンスまたはOracle Real Application Clusters環境におけるテキスト索引の全般的な状態を監視できます。Text Managerには重要な情報のサマリーが表示され、目的の詳細レベルへのドリルダウンや問題の解決、実行の必要があるアクションの理解が可能です。Text Managerにアクセスするには、Oracle Enterprise Managerのデータベース・ホームページから「スキーマ」をクリックし、「Text Manager」グループの下の「テキスト索引」を選択します。「テキスト索引」ページで、索引名を選択して「表示」をクリックすると、その索引の情報と属性が表示されます。

「テキスト索引」ページに、処理中のジョブ、直前の7日間以内にスケジュールされているジョブ、または問題が発生しているジョブが表示されます。このページから「ジョブ・スケジューラ」に移動して、このデータベース・インスタンスに対するすべてのジョブの概要を表示したり、選択したジョブを管理できます。Oracle Enterprise Managerのオンライン・ヘルプでは、Text Managerの各機能を使用するための詳細および手順を説明しています。

注意:
Text ManagerによってOracle Textの索引を作成することはできません。Oracle Textの索引を作成するには、第3章「Oracle Textでの索引付け」の「Oracle Textの索引の作成」で説明しているように、CREATE INDEX文を使用します。

12.5.1 Text Managerの使用

Text Managerのメイン・ページで、「アクション」リストから選択した索引に対し、次のアクションを実行できます。

- 同期化

- 最適化

- 再構築

- 失敗した操作の再開

- ログの表示

- エラーの表示

また、指定した索引に対してジョブをスケジュールできます。

Text Managerにアクセスする手順は、次のとおりです。

1. Database Controlへのアクセス権限を持つユーザー・アカウントによってデータベースにログインします。たとえば、データベースのインストール中に指定したパスワードを使用して、SYSまたはSYSTEMからログインします。
Database Controlに、データベース・ホーム・ページが表示されます。

2. データベース・ホーム・ページで「スキーマ」タブを選択します。

3. 「Text Manager」の下にある、「テキスト索引」をクリックします。
「テキスト索引」ページが表示され、そこに、このデータベース・インスタンスのテキスト索引がリストされます。

「テキスト索引」ページからテキスト索引を選択すると、その索引に対するオプションが使用可能となり、編集やアクションの実行が可能になります。たとえば、検索の属性を構成するには、選択した索引に対して「編集」をクリックします。「テキスト索引の編集」ページで、ワイルド・カードの語句の最大数、ファジー・スコア、およびファジーの拡張の数などを含む属性を設定できます。索引名およびパーティション名の変更、URL_DATASTOREの設定の指定、およびその他のオプションを実行できます。

12.5.2 テキスト索引の一般情報の表示

「テキスト索引の表示」ページを使用して、指定した索引の一般的な情報(索引タイプ、並列度、同期モード、ワイルド・カード制限、ファジー・スコア、ファジーの数値的結果、データストアなど)を表示できます。索引のパーティションに関する情報も表示できます。

テキスト索引の一般情報を表示する手順は、次のとおりです。

- 「テキスト索引」ページで、「テキスト索引」リスト内の索引名をクリックします。
「テキスト索引の表示」ページが「一般」タブが選択された状態で表示されます。

このページでアクションを選択して、メンテナンス・タスクを実行できます。

12.5.3 テキスト索引の状態のチェック

Text Managerの「テキスト索引」ページでは、テキスト索引のリストおよびデータベース・インスタンスに対するテキスト索引の状態が表示されるため、アプリケーション全体が適切に実行されていることを確認するために必要となる重要なアクションがある場合、それを把握できます。索引のステータスや過去7日間にユーザーが発行したジョブなどの情報が表示されます。Text索引の重要な情報も表形式で表示されます。

「テキスト索引」ページを使用して、次の情報を表示できます。

- 無効なパーティションを含むテキスト索引、つまり無効なテキスト索引の数。すべてのテキスト索引の無効なパーティション(ある場合)の数もまた表示されます。

- 処理中の索引の数および処理中のパーティション(ある場合)の数。

- すべてのパーティションが有効で、処理中のアクティビティを含まない索引の数。

- このデータベース・インスタンスに対して検出されたテキスト索引の合計数。

また、「テキスト索引」ページを使用して、各テキスト索引の索引タイプ、所有者、同期化されていないドキュメントの数、ドキュメントの合計数、および断片化の割合を表示できます。

リストからテキスト索引を選択すると、その索引に対するオプションが使用可能となり、編集やアクションの実行が可能になります。

12.6 サーバーと索引付け

ドキュメントの索引付けと問合せの入力には、標準SQLを使用します。バッチDMLの実行にサーバーは不要です。CONTEXT索引は、CTX_DDL.SYNC_INDEXプロシージャを使用するか、またはOracle Enterprise ManagerのText Managerから同期化できます。

関連項目:
索引付けおよび索引の同期化の詳細は、第3章「Oracle Textでの索引付け」を参照してください。

12.7 Oracle Enterprise Managerのデータベース機能使用状況トラッキング

Oracle Enterprise Managerのデータベース機能の使用状況統計では、様々なデータベース機能の使用頻度の概算が提供されます。この情報のトラッキングは、アプリケーションの開発および監視に役立ちます。「データベース機能の使用」にアクセスするには、Oracle Enterprise Managerの「サーバー」タブをクリックし、「データベース構成」グループの下にある「データベース機能の使用」を選択します。

Oracle Textの次の情報が収集されます。

- パッケージ使用状況の統計

- 索引使用状況の統計

- SQL演算子使用状況の統計

12.7.1 パッケージ使用状況の統計

パッケージ使用状況の統計で「データベース機能の使用」は、次のパッケージが使用されている場合、その頻度と時期に関する情報を取得します。

- CTX_ADM

- CTX_CLS

- CTX_DDL

- CTX_DOC

- CTX_OUTPUT

- CTX_QUERY

- CTX_REPORT

- CTX_THES

- CTX_ULEXER

12.7.2 索引使用状況の統計

索引使用状況の統計で「データベース機能の使用」は、データベースに存在する索引の数を取得します。統計は、各索引タイプ(CONTEXT、CTXCATおよびCTXRULE)ごとに個別に取得されます。

12.7.3 SQL演算子使用状況の統計

SQL演算子使用状況の統計で「データベース機能の使用」は、ユーザーによるCONTAINS、CATSEARCHおよびMATCHESの使用の有無を取得します。

注意:
機能の使用状況トラッキングは、完全に正確ではない場合があります。

12.8 Oracle Real Application Clusters上のOracle Text

Oracle Textの問合せをOracle RACノード間でパラレル化して、OLAPアプリケーションのスループットおよびパフォーマンスを最大にすることができます。前述の「Oracle Enterprise ManagerのText Manager」の項で説明しているように、Oracle Enterprise ManagerのText Manageを使用して、Oracle Text索引をOracle RACノード上で管理できます。

関連項目:
「Oracle RACノード間のパラレル問合せ」

13 Oracle Textアプリケーションの移行

この章では、以前のリリースのOracle Textからの、アプリケーションの移行に関する注意事項を説明します。次の項目について説明します。

- Oracle Text 11gリリース2(11.2)への移行

- Oracle Text 11gリリース1(11.1)への移行

- Oracle Text 10gリリース2(10.2)への移行

13.1 Oracle Text 11gリリース2(11.2)への移行

Oracle Text 11gリリース2(11.2)への移行時には、アプリケーションに変更を加える必要はありません。

13.2 Oracle Text 11gリリース2 (11.1)への移行

Oracle Text 11gリリース1(11.1)への移行時には、アプリケーションに変更を加える必要はありません。

13.3 Oracle Text 10gリリース2(10.2)への移行

この項では、Oracle Text 10gリリース2(10.2)へのアプリケーションの移行に関連する問題について説明します。この情報は、Oracle Textの1つ前のリリースからアップグレードするユーザーと、最新リリースへのアップグレードに必要な移行手順に関する情報を必要とするユーザーを対象としています。

13.3.1 新規フィルタ(INSO_FILTERとAUTO_FILTER)

Oracle Text 11gリリース1以上では、INSO_FILTERフィルタ型がAUTO_FILTERフィルタ型で置き換えられています。既存のOracle Textアプリケーションとの互換性を維持するために、INSO_FILTER機能はAUTO_FILTERでサポートされ、INSO_FILTERフィルタ型は保持されますが、その動作はAUTO_FILTERの動作と一致するように変更されています。

ほとんどのユーザーの場合、フィルタ型の変更による重大な影響はなく、アプリケーションを変更したり新規フィルタ型への移行手順を実行する必要はありません。フィルタ型の変更による最も重要な変更点は次のとおりです。

- AUTO_FILTERでは、INSO_FILTERとは異なるドキュメント・タイプ・セットがサポートされます。サポートされているドキュメント・タイプのリストは、『Oracle Textリファレンス』の付録「Oracle Textでサポートされているドキュメント形式」を参照してください。

- 新規フィルタからのHTML出力の表示特性は、旧フィルタからの出力とは異なる場合があります。

- AUTO_FILTERタイプをサポートしているプラットフォーム・セットは、INSO_FILTERとは異なります。サポートされているプラットフォームのリストは、『Oracle Textリファレンス』の付録「Oracle Textでサポートされているドキュメント形式」を参照してください。

INSO_FILTERからAUTO_FILTERへの変更に伴い、フィルタの移行には関連する変更点もいくつか含まれています。

- MAIL_FILTERのINSO_TIMEOUTおよびINSO_OUTPUT_FORMATTING属性は、それぞれAUTO_FILTER_TIMEOUTおよびAUTO_FILTER_OUTPUT_FORMATTING属性に置き換えられています。

- MAIL_FILTERのメール構成ファイルで使用されていたINSOFILTERディレクティブは、AUTO_FILTERディレクティブに置き換えられています。

- CTX_OUTPUT.ADD_TRACEなどのプロシージャで使用されていたトレーシング用のPL/SQL定数TRACE_IDX_INSO_FILTERは、TRACE_IDX_AUTO_FILTERフィルタに置き換えられています。

- システム定義プリファレンスCTXSYS.INSO_FILTERは、CTXSYS.AUTO_FILTERプリファレンスに置き換えられています。

- DEFAULT_FILTER_FILEおよびDEFAULT_FILTER_BINARYシステム・パラメータのデフォルト値が変更されていない場合は、新規インストールおよびデータベースをこのリリースにアップグレードできるように、これらのデフォルト値がCTXSYS.INSO_FILTERからCTXSYS.AUTO_FILTERに変更されています。このリリースにアップグレードするデータベースでこれらのデフォルト値が変更済の場合は、変更済のデフォルト値が引き続き使用されます。

下位互換性を保つために、このリリースではINSO_FILTERとほとんどの関連フィルタ型、定数および属性が保持されています。ただし、新規アプリケーションではAUTO_FILTERを使用し、古いアプリケーションはできるだけ更新する必要があります。

13.3.1.1 AUTO_FILTERフィルタ型への移行

ほとんどのアプリケーションは、変更しなくてもAUTO_FILTER型への変更が反映されます。このリリースへのアップグレード時に、次の移行手順が自動的に実行されます。

- 既存の索引でINSO_FILTERフィルタ型が使用されている場合は、AUTO_FILTERフィルタ型に移行されます。

- 既存の索引でMAIL_FILTERフィルタ型が使用されている場合は、INSO_TIMEOUTおよびINSO_OUTPUT_FORMATTING属性がそれぞれAUTO_FILTER_TIMEOUTおよびAUTO_FILTER_OUTPUT_FORMATTING属性に移行されます。

- システム・パラメータDEFAULT_FILTER_FILEおよびDEFAULT_FILTER_BINARYのデフォルト値が変更されていない場合は、CTXSYS.INSO_FILTERからCTXSYS.AUTO_FILTERに移行されます。

新しいフィルタ・システムに移行するために必要なアクションはありませんが、Oracle Textユーザーがデータベースをこのリリースにアップグレードする場合、次の手順を実行して、このリリースで非推奨となったAPIを使用しないで移行する必要があります。

- 索引でデフォルト以外のメール構成ファイルとともにMAIL_FILTERフィルタ型が使用されている場合は、ファイルを編集し、使用されているINSOFILTERディレクティブをすべてAUTO_FILTERディレクティブで置き換えます。

- アプリケーションで使用されているPL/SQL定数TRACE_IDX_INSO_FILTERをTRACE_IDX_AUTO_FILTER定数に置き換えます。

- アプリケーションで使用されているシステム定義プリファレンスCTXSYS.INSO_FILTERをCTXSYS.AUTO_FILTERに置き換えます。

A CONTEXT問合せアプリケーション

この付録では、独自のコードを記述するか、またはOracle Textウィザードを使用して、CONTEXT索引タイプを使用した簡単なWeb検索アプリケーションを作成する方法を説明します。次の項目について説明します。

- Web問合せアプリケーションの概要

- PSP Webアプリケーション

- JSP Webアプリケーション

A.1 Web問合せアプリケーションの概要

Oracle Textの一般的な使用目的は、Webサイト上のHTMLファイルを索引付けし、ユーザーに検索機能を提供することです。この付録のサンプル・アプリケーションでは、データベースに格納されているHTMLファイルのセットを索引付けし、Oracle Databaseに接続しているWebサーバーを使用して検索サービスを提供します。

この付録では、Web問合せアプリケーションの次の2つのバージョンについて説明します。

- PL/SQL Server Pages(PSP)を使用するバージョン

- Java Server Pages(JSP)を使用するバージョン

これらのアプリケーションのバージョンは両方とも、必要なコードを自動的に作成する問合せアプリケーション・ウィザードを使用して作成できます。

PSP、JSP両方のアプリケーション・コードおよびテキスト問合せアプリケーション・ウィザードは、次のOracle Technology NetworkのWebサイトで表示およびダウンロードできます。

http://www.oracle.com/technology/products/text

テキスト問合せアプリケーション・ウィザードのWebページには、このウィザードの使用方法の詳細な説明もあります。

図A-1に、テキスト問合せアプリケーションのJSPバージョンはどのようなものかを示します。このアプリケーションは、Oracle Textアプリケーション・ウィザードを使用して作成されています。

図A-1 テキスト問合せアプリケーション

図A-2に、テキスト問合せの結果を示します。

図A-2 結果を表示したテキスト問合せアプリケーション

このアプリケーションでは、検索用語を含むドキュメントへのリンクを戻します。各ドキュメントには、次の4つのリンクがあります。

- 「HTML」リンクによりドキュメントが表示されます。
フィルタ処理されたドキュメントでは、図版は表示されません。(図5-1「ハイライト表示、要旨作成およびテーマ抽出のサンプル・ドキュメント」に、最初にヒットしたドキュメントのソースを示しています。)

- 「ハイライト」リンクにより、検索用語をハイライト表示したドキュメントが表示されます。図5-2「petがハイライト表示されたPet Magnetドキュメント」に、ハイライトの例を示しています。

- 「テーマ」リンクにより、ドキュメントに関連する上位50位までのテーマが表示されます。図5-3「ドキュメントのテーマを表示する問合せアプリケーション」に、テーマの抽出例を示しています。

- 「要旨」リンクにより、ドキュメントの簡単な要約が表示されます。図5-4「ドキュメントの要旨を表示する問合せアプリケーション」に、この要旨表示機能の例を示しています。

A.2 PSP Webアプリケーション

このアプリケーションは、PL/SQL Server Pagesに基づいています。図A-3「PSP Webアプリケーション」は、ブラウザが、Webサーバーを経由してOracle DatabaseのPSPストアド・プロシージャをコールする方法を示しています。

図A-3 PSP Webアプリケーション

A.2.1 Webアプリケーションの前提条件

このアプリケーションには、次の要件があります。

- Oracle Database(リリース8.1.6以上)が起動され、実行中であること。

- Oracle PL/SQL Gatewayが実行中であること。

- ApacheなどのWebサーバーが起動され、実行中であり、Oracle Databaseに要求を送信するように適切に構成されていること。

A.2.2 Webアプリケーションの作成

この項では、PSP Webアプリケーションの作成方法を説明します。

手順1   テキスト表の作成

HTMLファイルを格納するテキスト表を作成する必要があります。この例では、次のようにsearch_tableという表を作成します。

create table search_table (tk numeric primary key, title varchar2(2000),
text clob);

手順2   HTMLドキュメントのテキスト表へのロード(SQL*Loaderを使用)

テキスト表は、HTMLファイルを使用してロードする必要があります。この例では、制御ファイルloader.ctlを使用して、loader.datで指定したファイルをロードします。SQL*Loader文は次のとおりです。

% sqlldr userid=scott/tiger control=loader.ctl

手順3   CONTEXT索引の作成

テキスト問合せウィザードを使用している場合: このウィザードにより、索引を作成するスクリプトが作成されます。(ダウンロードしたWebページの、ウィザードについての説明を参照してください。)そのスクリプトを実行します。

ウィザードを使用していない場合: HTMLファイルを索引付けするには、次のようにCONTEXT索引をテキスト列に作成します。HTMLの索引付けであるため、この例では、フィルタ処理が不要なNULL_FILTERプリファレンス型とHTML_SECTION_GROUP型を使用します。

create index idx_search_table on search_table(text)
indextype is ctxsys.context parameters
('filter ctxsys.null_filter section group CTXSYS.HTML_SECTION_GROUP');

手順4   Oracle Databaseでのsearch_htmlservicesパッケージのコンパイル

アプリケーションには、選択したドキュメントが表示される必要があります。このために、Oracle Databaseではsearch_tableのCLOBからドキュメントを読み取り、その結果を出力して表示する必要があります。これは、search_htmlservicesパッケージ内のプロシージャをコールして実行します。ファイルsearch_htmlservices.sqlをコンパイルする必要があります。この操作は、SQL*Plusプロンプトで実行できます。

SQL> @search_htmlservices.sql

Package created.

手順5   search_html PSPページのコンパイル(loadpspを使用)

検索ページを呼び出すには、ブラウザからsearch_html.pspをコールします。search_htmlは、Oracle Databaseのloadpspコマンドライン・プログラムを使用して、次のようにコンパイルします。

% loadpsp -replace -user scott/tiger search_html.psp
"search_html.psp": procedure "search_html" created.

関連項目
PSPの使用方法の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

手順6   Webサーバーの構成

クライアントのPSP要求をURLとして受け入れるように、Webサーバーを構成する必要があります。Webサーバーは、クライアントの要求をOracle Databaseに転送し、サーバー出力をブラウザに戻します。図A-3を参照してください。

Oracle WebDB Webリスナー、またはApache Webサーバーが組み込まれているOracle Application Serverを使用できます。詳細は、使用しているWebサーバーのマニュアルを参照してください。

手順7   ブラウザからの問合せの入力

URLを使用して、ブラウザから問合せアプリケーションにアクセスできます。URLをWebサーバーで構成します。URLの例は、次のようになります。

http://server.example.com:7777/mypath/search_html

図A-1および図A-2で示すように、アプリケーションでは、ブラウザに問合せのエントリ・ボックスを表示し、問合せ結果をHTMLリンクのリストとして戻します。

A.2.3 PSPのサンプル・コード

この項では、Webアプリケーションのサンプルの作成に使用するコードを示します。次のファイルを記載しています。

- loader.ctl

- loader.dat

- search_htmlservices.sql

- search_html.psp

関連項目:
http://www.oracle.com/technology/products/text/

A.2.3.1 loader.ctl

この例では、loader.ctlファイルのサンプルを示します。sqlldrでは、このファイルを使用してデータファイルloader.datがロードされます。

LOAD DATA
INFILE 'loader.dat'
INTO TABLE search_table
REPLACE
FIELDS TERMINATED BY ';'
(tk             INTEGER,
title          CHAR,
text_file      FILLER CHAR,
text           LOBFILE(text_file) TERMINATED BY EOF)

A.2.3.2 loader.dat

この例では、loader.datファイルのサンプルを示します。各行は、3つのフィールド(ドキュメントの参照番号、ラベル(すなわちタイトル)、およびsearch_tableのテキスト列にロードされるHTMLドキュメント名)で構成されます。この例では、ファイルは切り捨てられています。

1;   Pizza Shredder;Pizza.html
2;   Refrigerator w/ Front-Door Auto Cantaloupe Dispenser;Cantaloupe.html
3;   Self-Tipping Couch;Couch.html
4;   Home Air Dirtier;Mess.html
5;   Set of Pet Magnets;Pet.html
6;   Esteem-Building Talking Pillow;Snooze.html
. . .
28;   Shaggy Found Inspiration For Success In Jamaica ;shaggy_found.html
29;   Solar Flare Eruptions Likely ;solar_flare.html
30;   Supersonic Plane Breaks Food Barrier ;food_barrier.html
31;   SOUNDSCAN REPORT: Recipe for An Aspiring Top Ten;urban_groove_1.html
. . .

A.2.3.3 search_htmlservices.sql

set define off
create or replace package search_htmlServices as
procedure showHTMLDoc (p_id in numeric);
procedure showDoc  (p_id in varchar2, p_query in varchar2);
end;
/
show errors;

create or replace package body search_htmlServices as

procedure showHTMLDoc (p_id in numeric) is
v_clob_selected   CLOB;
v_read_amount     integer;
v_read_offset     integer;
v_buffer          varchar2(32767);
begin

select text into v_clob_selected from search_table where tk = p_id;
v_read_amount := 32767;
v_read_offset := 1;
begin
loop
dbms_lob.read(v_clob_selected,v_read_amount,v_read_offset,v_buffer);
htp.print(v_buffer);
v_read_offset := v_read_offset + v_read_amount;
v_read_amount := 32767;
end loop;
exception
when no_data_found then
null;
end;
end showHTMLDoc;

procedure showDoc (p_id in varchar2, p_query in varchar2) is

v_clob_selected   CLOB;
v_read_amount     integer;
v_read_offset     integer;
v_buffer          varchar2(32767);
v_query           varchar(2000);
v_cursor          integer;

begin
htp.p('<html><title>HTML version with highlighted terms</title>');
htp.p('<body bgcolor="#ffffff">');
htp.p('<b>HTML version with highlighted terms</b>');

begin
ctx_doc.markup (index_name => 'idx_search_table',
textkey    => p_id,
text_query => p_query,
restab     => v_clob_selected,
starttag   => '<i><font color=red>',
endtag     => '</font></i>');

v_read_amount := 32767;
v_read_offset := 1;
begin
loop
dbms_lob.read(v_clob_selected,v_read_amount,v_read_offset,v_buffer);
htp.print(v_buffer);
v_read_offset := v_read_offset + v_read_amount;
v_read_amount := 32767;
end loop;
exception
when no_data_found then
null;
end;

exception
when others then
null; --showHTMLdoc(p_id);
end;
end showDoc;
end;
/
show errors

set define on

A.2.3.4 search_html.psp

<%@ plsql procedure="search_html" %>
<%@ plsql parameter="query" default="null" %>
<%! v_results numeric := 0; %>

<html>
<head>
<title>search_html Search </title>
</head>
<body>

<%

If query is null Then
%>

<center>
<form method=post action="search_html">
<b>Search for: </b>
<input type=text name="query" size=30>&nbsp;
<input type=submit value=Search>
</center>
<hr>

<%
Else
%>

<p>
<%!
color varchar2(6) := 'ffffff';
%>

<center>
<form method=post action="search_html">
<b>Search for:</b>
<input type=text name="query" size=30 value="<%= query %>">
<input type=submit value=Search>
</form>
</center>
<hr>
<p>

<%
-- select statement
for doc in (
select /*+ DOMAIN_INDEX_SORT */ rowid, tk, title, score(1) scr
from search_table
where contains(text, query,1) >0
order by score(1) desc
)
loop
v_results := v_results + 1;
if v_results = 1 then

%>

<center>
<table border="0">
<tr bgcolor="#6699CC">
<th>Score</th>
<th>Title</th>
</tr>

<%      end if; %>
<tr bgcolor="#<%= color %>">
<td> <%= doc.scr %>% </td>
<td> <%= doc.title %>
[<a href="search_htmlServices.showHTMLDoc?p_id=
<%= doc.tk %>">HTML</a>]
[<a href="search_htmlServices.showDoc?p_id=
<%= doc.tk %>&p_query=<%= query %>">Highlight</a>]
</td>
</tr>

<%
if (color = 'ffffff') then
color := 'eeeeee';
else
color := 'ffffff';
end if;

end loop;
%>

</table>
</center>

<%
end if;
%>
</body></html>

A.3 JSP Webアプリケーション

JSPベースのWebアプリケーションの作成は、PSPベースのアプリケーションの作成とほぼ同じ手順で行われます(「Webアプリケーションの作成」を参照してください)。同じloader.datファイルおよびloader.ctlファイルを使用できます。ただし、JSPベースのアプリケーションでは、次のことは不要です。

- search_htmlservicesパッケージのコンパイル

- search_htmlのPSPページのコンパイル(loadpspを使用)

A.3.1 Webアプリケーションの前提条件

このアプリケーションには、次の要件があります。

- Oracle Database(リリース8.1.6以上)が起動され、実行中であること。

- ApacheなどのWebサーバーが起動され、実行中であり、Oracle Databaseに要求を送信するように適切に構成されていること。

A.3.2 JSPのサンプル・コード

この項では、Webアプリケーションのサンプルの作成に使用するJavaコードを示します。次のファイルを記載しています。

- search_html.jsp
このファイルのコードは、テキスト問合せアプリケーション・ウィザードで生成されました。(長い行の一部は、コードが読み取りやすいように分割されました。)

A.3.2.1 search_html.jsp

<%@ page import="java.sql.*, java.util.*, java.net.*,
oracle.jdbc.*, oracle.jsp.dbutil.*" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<% oracle.jsp.util.PublicUtil.setReqCharacterEncoding(request, "UTF-8"); %>
<jsp:useBean id="name" class="oracle.jsp.jml.JmlString" scope ="request" >
<jsp:setProperty name="name" property="value" param="query" />
</jsp:useBean>

<%
String connStr="jdbc:oracle:thin:@jsmith-pc.us.oracle.com:1521:zippy922";

java.util.Properties info=new java.util.Properties();
Connection conn = null;
ResultSet rset = null;
OracleCallableStatement callStmt = null;
Statement stmt = null;
String userQuery = null;
String myQuery = null;
URLEncoder myEncoder;
int count=0;
int loopNum=0;
int startNum=0;
if (name.isEmpty()) {
%>
<html>
<title>Text Search</title>
<body>
<table width="100%">
<tr bgcolor="#336699">
<td><font face="arial, helvetica" align="left"
color="#CCCC99" size=+2>Text Search</td>
</tr>
</table>
<center>
<form method = post>
Search for:
<input type=text name=query size = 30>
<input type=submit value="Search">
</form>
</center>
</body>
</html>

<%}

else {
%>
<html>
<title>Text Search</title>
<body text="#000000" bgcolor="#FFFFFF" link="#663300"
vlink="#996633" alink="#ff6600">
<table width="100%">
<tr bgcolor="#336699">
<td><font face="arial, helvetica" align="left"
color="#CCCC99" size=+2>Text Search</td>
</tr>
</table>
<center>
<form method = post action="TextSearchApp.jsp">
Search for:
<input type=text name="query" value="<%=name.getValue() %>" size = 30>
<input type=submit value="Search">
</form>
</center>
<%
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver() );
info.put ("user", "jsmith");
info.put ("password","hello");
conn = DriverManager.getConnection(connStr,info);
stmt = conn.createStatement();
userQuery =   request.getParameter("query");
myQuery =   URLEncoder.encode(userQuery);
String numStr =   request.getParameter("sn");
if(numStr!=null)
startNum=Integer.parseInt(numStr);
String theQuery =   translate(userQuery);
callStmt =(OracleCallableStatement)conn.prepareCall("begin "+
"?:=ctx_query.count_hits(index_name=>'ULTRA_IDX1', "+
"text_query=>?"+
"); " +
"end; ");
callStmt.setString(2,theQuery);
callStmt.registerOutParameter(1, OracleTypes.NUMBER);
callStmt.execute();
count=((OracleCallableStatement)callStmt).getNUMBER(1).intValue();
if(count>=(startNum+20)){
%>
<font color="#336699" FACE="Arial,Helvetica" SIZE=+1>Results
<%=startNum+1%> - <%=startNum+20%> of <%=count%> matches
<%
}
else if(count>0){
%>
<font color="#336699" FACE="Arial,Helvetica" SIZE=+1>Results
<%=startNum+1%> - <%=count%> of <%=count%> matches
<%
}
else {
%>
<font color="#336699" FACE="Arial,Helvetica" SIZE=+1>No match found
<%
}
%>
<table width="100%">
<TR ALIGN="RIGHT">
<%
if((startNum>0)&(count<=startNum+20))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum-20 %>&query=
<%=myQuery %>">previous20</a>
</TD>
<%
}
else if((count>startNum+20)&(startNum==0))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum+20
%>&query=<%=myQuery %>">next20</a>
</TD>
<%
}
else if((count>startNum+20)&(startNum>0))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum-20 %>&query=
<%=myQuery %>">previous20</a>
<a href="TextSearchApp.jsp?sn=<%=startNum+20 %>&query=
<%=myQuery %>">next20</a>
</TD>
<%
}
%>
</TR>
</table>
<%
String ctxQuery = "select /*+ DOMAIN_INDEX_SORT */ rowid, 'TITLE',
score(1) scr from 'ULTRA_TAB1' where contains('TEXT', '"+theQuery+"',1 )
> 0 order by score(1) desc";
rset = stmt.executeQuery(ctxQuery);
String color = "ffffff";
String rowid = null;
String fakeRowid = null;
String[] colToDisplay = new String[1];
int myScore = 0;
int items = 0;
while (rset.next()&&items< 20) {
if(loopNum>=startNum)
{
rowid = rset.getString(1);
fakeRowid = URLEncoder.encode(rowid);
colToDisplay[0] = rset.getString(2);
myScore = (int)rset.getInt(3);
items++;
if (items == 1) {
%>
<center>
<table BORDER=1 CELLSPACING=0 CELLPADDING=0 width="100%"
<tr bgcolor="#CCCC99">
<th><font face="arial, helvetica" color="#336699">Score</th>
<th><font face="arial, helvetica" color="#336699">TITLE</th>
<th> <font face="arial, helvetica"
color="#336699">Document Services</th>
</tr>
<%   } %>
<tr bgcolor="#FFFFE0">
<td ALIGN="CENTER"> <%= myScore %>%</td>
<td> <%= colToDisplay[0] %>
<td>
</td>
</tr>
<%
if (color.compareTo("ffffff") == 0)
color = "eeeeee";
else
color = "ffffff";
}
loopNum++;
}
} catch (SQLException e) {
%>
<b>Error: </b> <%= e %><p>
<%
} finally {
if (conn != null) conn.close();
if (stmt != null) stmt.close();
if (rset != null) rset.close();
}
%>
</table>
</center>
<table width="100%">
<TR ALIGN="RIGHT">
<%
if((startNum>0)&(count<=startNum+20))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum-20 %>&query=
<%=myQuery %>">previous20</a>
</TD>
<%
}
else if((count>startNum+20)&(startNum==0))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum+20 %>&query=
<%=myQuery %>">next20</a>
</TD>
<%
}
else if((count>startNum+20)&(startNum>0))
{
%>
<TD ALIGN="RIGHT">
<a href="TextSearchApp.jsp?sn=<%=startNum-20 %>&query=
<%=myQuery %>">previous20</a>
<a href="TextSearchApp.jsp?sn=<%=startNum+20 %>&query=
<%=myQuery %>">next20</a>
</TD>
<%
}
%>
</TR>
</table>
</body></html>
<%}

%>
<%!
public String translate (String input)
{
Vector reqWords = new Vector();
StringTokenizer st = new StringTokenizer(input, " '", true);
while (st.hasMoreTokens())
{
String token = st.nextToken();
if (token.equals("'"))
{
String phrase = getQuotedPhrase(st);
if (phrase != null)
{
reqWords.addElement(phrase);
}
}
else if (!token.equals(" "))
{
reqWords.addElement(token);
}
}
return getQueryString(reqWords);
}

private String getQuotedPhrase(StringTokenizer st)
{
StringBuffer phrase = new StringBuffer();
String token = null;
while (st.hasMoreTokens() && (!(token = st.nextToken()).equals("'")))
{
phrase.append(token);
}
return phrase.toString();
}

private String getQueryString(Vector reqWords)
{
StringBuffer query = new StringBuffer("");
int length = (reqWords == null) ? 0 : reqWords.size();
for (int ii=0; ii < length; ii++)
{
if (ii != 0)
{
query.append(" & ");
}
query.append("{");
query.append(reqWords.elementAt(ii));
query.append("}");
}
return query.toString();
}
%>

B CATSEARCH問合せアプリケーション

この付録では、独自のコードを記述するか、またはOracle Textウィザードを使用して、CATSEARCH索引タイプを使用した簡単なWeb検索アプリケーションを作成する方法を説明します。次の項目について説明します。

- CATSEARCH Web問合せアプリケーションの概要

- JSP Webアプリケーション

B.1 CATSEARCH Web問合せアプリケーションの概要

CTXCAT索引タイプは、短い説明テキストおよびそれに関連する構造化データを含む、商品カタログに最適です。この付録では、ユーザーが書籍のタイトルと価格を検索できるブラウザ・ベースの書店カタログの作成方法を説明します。

このアプリケーションは、Java Server Pages(JSP)で作成されています。

このアプリケーションは、必要なコードを自動的に作成する、カタログ問合せアプリケーション・ウィザードを使用して作成できます。JSPのアプリケーション・コードおよびカタログ問合せアプリケーション・ウィザードは、次のOracle Technology NetworkのWebサイトで表示およびダウンロードできます。

http://www.oracle.com/technology/products/text

このWebサイトには、カタログ問合せウィザードの使用方法の詳細な説明もあります。

B.2 JSP Webアプリケーション

このアプリケーションはJava Server Pagesを基にしており、次の要件があります。

- Oracle Database(リリース8.1.7以上)が起動され、実行中であること。

- ApacheなどのWebサーバーが起動され、実行中であり、Oracle Databaseに要求を送信するように適切に構成されていること。

B.2.1 JSP Webアプリケーションの作成

このアプリケーションは、書籍のタイトルと価格を検索できるオンライン書店をモデル化したものです。

手順1   表の作成

書籍のタイトル、発行者、価格などの書籍情報を格納する表を作成する必要があります。SQL*Plusで次を実行します。

sqlplus>create table book_catalog (
id        numeric,
title     varchar2(80),
publisher varchar2(25),
price     numeric )

手順2   SQL*Loaderを使用したデータのロード

書籍データは、オペレーティング・システムのコマンドラインからSQL*Loaderを使用して、次のようにロードします。

% sqlldr userid=ctxdemo/ctxdemo control=loader.ctl

手順3   索引セットの作成

SQL*Plusから索引セットを次のように作成します。

sqlplus>begin
ctx_ddl.create_index_set('bookset');
ctx_ddl.add_index('bookset','price');
ctx_ddl.add_index('bookset','publisher');
end;
/

手順4   索引の作成

SQL*PlusからCTXCAT索引を次のように作成します。

sqlplus>create index book_idx on book_catalog (title)
indextype is ctxsys.ctxcat
parameters('index set bookset');

手順5   CATSEARCHを使用した単純な検索

新しく作成した索引をSQL*Plusで次のようにテストします。

sqlplus>select id, title from book_catalog
where catsearch(title,'Java','price > 10 order by price') > 0

手順6   WebサイトのJSPディレクトリへのcatalogSearch.jspファイルのコピー

このコピーを行うと、ブラウザからアプリケーションにアクセスできます。URLには、http://localhost:port/path/catalogSearch.jspを指定する必要があります。

アプリケーションでは、ブラウザに問合せのエントリ・ボックスを表示し、問合せ結果をHTMLリンクのリストとして戻します。図B-1を参照してください。

図B-1 Web問合せアプリケーションの画面

B.2.2 JSPのサンプル・コード

この項では、Webアプリケーションのサンプルの作成に使用するコードを示します。次のファイルを記載しています。

- loader.ctl

- loader.dat

- catalogSearch.jsp

関連項目
http://www.oracle.com/technology/products/text/

B.2.2.1 loader.ctl

LOAD DATA
INFILE 'loader.dat'
INTO TABLE book_catalog
REPLACE
FIELDS TERMINATED BY ';'
(id, title, publisher, price)

B.2.2.2 loader.dat

1; A History of Goats; SPINDRIFT BOOKS;50
2; Robust Recipes Inspired by Eating Too Much;SPINDRIFT BOOKS;28
3; Atlas of Greenland History; SPINDRIFT BOOKS; 35
4; Bed and Breakfast Guide to Greenland; SPINDRIFT BOOKS; 37
5; Quitting Your Job and Running Away; SPINDRIFT BOOKS;25
6; Best Noodle Shops of Omaha ;SPINDRIFT BOOKS; 28
7; Complete Book of Toes; SPINDRIFT BOOKS;16
8; Complete Idiot's Guide to Nuclear Technology;SPINDRIFT BOOKS; 28
9; Java Programming for Woodland Animals; LOW LIFE BOOK CO; 10
10; Emergency Surgery Tips and Tricks;SPOT-ON PUBLISHING;10
11; Programming with Your Eyes Shut; KLONDIKE BOOKS; 10
12; Forest Fires of North America, 1858-1882; CALAMITY BOOKS; 11
13; Spanish in Twelve Minutes; WRENCH BOOKS 11
14; Better Sex and Romance Through C++; CALAMITY BOOKS; 12
15; Oracle Internet Application Server Enterprise Edition; KANT BOOKS; 12
16; Oracle Internet Developer Suite; SPAMMUS BOOK CO;13
17; Telling the Truth to Your Pets; IBEX BOOKS INC; 13
18; Go Ask Alice's Restaurant;HUMMING BOOKS;    13
19; Life Begins at 93;  CALAMITY BOOKS;   17
20; Dating While Drunk;  BALLAST BOOKS;  14
21; The Second-to-Last Mohican; KLONDIKE BOOKS;  14
22; Eye of Horus; An Oracle of Ancient Egypt; BIG LITTLE BOOKS;     15
23; Introduction to Sitting Down; IBEX BOOKS INC;  15

B.2.2.3 catalogSearch.jsp

<%@ page import="java.sql.* , oracle.jsp.dbutil.*" %>
<jsp:useBean id="name" class="oracle.jsp.jml.JmlString" scope="request" >
<jsp:setProperty name="name" property="value" param="v_query" />
</jsp:useBean>

<%
String connStr="jdbc:oracle:thin:@machine-domain-name:1521:betadev";

java.util.Properties info = new java.util.Properties();

Connection conn = null;
ResultSet  rset = null;
Statement  stmt = null;

if (name.isEmpty() ) {

%>
<html>
<title>Catalog Search</title>
<body>
<center>
<form method=post>
Search for book title:
<input type=text name="v_query" size=10>
where publisher is
<select name="v_publisher">
<option value="ADDISON WESLEY">ADDISON WESLEY
<option value="HUMMING BOOKS">HUMMING BOOKS
<option value="WRENCH BOOKS">WRENCH BOOKS
<option value="SPOT-ON PUBLISHING">SPOT-ON PUBLISHING
<option value="SPINDRIFT BOOKS">SPINDRIFT BOOKS
<option value="LOW LIFE BOOK CO">LOW LIFE BOOK CO
<option value="KLONDIKE BOOKS">KLONDIKE BOOKS
<option value="CALAMITY BOOKS">CALAMITY BOOKS
<option value="IBEX BOOKS INC">IBEX BOOKS INC
<option value="BIG LITTLE BOOKS">BIG LITTLE BOOKS
</select>
and price is
<select name="v_op">
<option value="=">=
<option value="&lt;">&lt;
<option value="&gt;">&gt;
</select>
<input type=text name="v_price" size=2>
<input type=submit value="Search">
</form>
</center>
<hr>
</body>
</html>

<%
}
else {

String v_query = request.getParameter("v_query");
String v_publisher = request.getParameter("v_publisher");
String v_price = request.getParameter("v_price");
String v_op    = request.getParameter("v_op");
%>

<html>
<title>Catalog Search</title>
<body>
<center>
<form method=post action="catalogSearch.jsp">
Search for book title:
<input type=text name="v_query" value=
<%= v_query %>
size=10>
where publisher is
<select name="v_publisher">
<option value="ADDISON WESLEY">ADDISON WESLEY
<option value="HUMMING BOOKS">HUMMING BOOKS
<option value="WRENCH BOOKS">WRENCH BOOKS
<option value="SPOT-ON PUBLISHING">SPOT-ON PUBLISHING
<option value="SPINDRIFT BOOKS">SPINDRIFT BOOKS
<option value="LOW LIFE BOOK CO">LOW LIFE BOOK CO
<option value="KLONDIKE BOOKS">KLONDIKE BOOKS
<option value="CALAMITY BOOKS">CALAMITY BOOKS
<option value="IBEX BOOKS INC">IBEX BOOKS INC
<option value="BIG LITTLE BOOKS">BIG LITTLE BOOKS
</select>
and price is
<select name="v_op">
<option value="=">=
<option value="&lt;">&lt;
<option value="&gt;">&gt;
</select>
<input type=text name="v_price" value=
<%= v_price %> size=2>
<input type=submit value="Search">
</form>
</center>

<%
try {

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver() );
info.put ("user", "ctxdemo");
info.put ("password","ctxdemo");
conn = DriverManager.getConnection(connStr,info);

stmt = conn.createStatement();
String theQuery = request.getParameter("v_query");
String thePrice = request.getParameter("v_price");

// select id,title
// from book_catalog
// where catsearch (title,'Java','price >10 order by price') > 0

// select title
// from book_catalog
// where catsearch(title,'Java','publisher = ''CALAMITY BOOKS''
and price < 40 order by price' )>0

String myQuery = "select title, publisher, price from book_catalog
where catsearch(title, '"+theQuery+"',
'publisher = ''"+v_publisher+"'' and price "+v_op+thePrice+"
order by price' ) > 0";
rset = stmt.executeQuery(myQuery);

String color = "ffffff";

String myTitle = null;
String myPublisher = null;
int myPrice = 0;
int items = 0;

while (rset.next()) {
myTitle     = (String)rset.getString(1);
myPublisher = (String)rset.getString(2);
myPrice     = (int)rset.getInt(3);
items++;

if (items == 1) {
%>
<center>
<table border="0">
<tr bgcolor="#6699CC">
<th>Title</th>
<th>Publisher</th>
<th>Price</th>
</tr>
<%
}
%>
<tr bgcolor="#<%= color %>">
<td> <%= myTitle %></td>
<td> <%= myPublisher %></td>
<td> $<%= myPrice %></td>
</tr>
<%
if (color.compareTo("ffffff") == 0)
color = "eeeeee";
else
color = "ffffff";

}

} catch (SQLException e) {

%>

<b>Error: </b> <%= e %><p>

<%

} finally {
if (conn != null) conn.close();
if (stmt != null) stmt.close();
if (rset != null) rset.close();
}

%>
</table>
</center>
</body>
</html>
<%
}
%>

用語集

代替スペル

Oracle Textでの代替スペルとは、特にドイツ語、スウェーデン語およびオランダ語でスペルのバリエーションを使用することです。BASIC_LEXER属性のALTERNATE_SPELLINGが指定されている場合は、これらのバリエーションに索引付けできます。

属性

属性は、プリファレンスに関連付けられているオプションのパラメータです。たとえば、BASIC_LEXERプリファレンスにはbase_letter属性が含まれ、この属性には値YES (基本文字変換を実行)またはNO (基本文字変換を実行しない)を指定できます。属性は、CTX_DDL.SET_ATTRIBUTEプロシージャまたはALTER INDEX文を使用して設定します。「プリファレンス」、「基本文字変換」も参照してください。

属性セクション

AUTHORまたはTITLEなど、XMLドキュメントの属性を表すユーザー定義セクション。属性セクションは、CTX_DDL.ADD_ATTR_SECTIONまたはALTER INDEX文を使用してセクション・グループに追加します。「AUTO_SECTION_GROUP」、「セクション」、「XML_SECTION_GROUP」も参照してください。

AUTO_SECTION_GROUP

XMLドキュメント内で開始タグと終了タグのペアごとにゾーン・セクションを自動作成するために使用されるセクション・グループ。属性セクションは、属性を持つXMLタグに対して自動的に作成されます。「属性セクション」、「セクション」、「セクション・グループ」、「XML_SECTION_GROUP」、「ゾーン・セクション」も参照してください。

基本文字変換

代替書式(アクセント、ウムラウトまたはセディラなど)を持つ文字を基本書式(アクセントなしなど)に変換すること。

BASIC_SECTION_GROUP

開始および終了タグが<tag>および</tag>という形式のセクションを定義するために使用されるセクション・グループ。コメント・タグ、属性付きタグまたは片方のみのカッコ付きタグなど、基本以外のタグはサポートされません。「HTML_SECTION_GROUP」、「セクション」、「セクション・グループ」も参照してください。

ケース

ケースは、語句や文字を大文字にすることを意味します(たとえば、mではなくMとなります)。大文字のない言語もあります。特に西ヨーロッパなどの一部の言語では、大/小文字混合の索引付けがサポートされています。

分類

ドキュメント分類と同義。ソース・ドキュメントをその内容に基づいてグループまたはクラスタに概念的に分割すること。たとえば、ドキュメント・グループを医薬、金融およびスポーツに関するクラスタに分割できます。

Oracle Textには、ルールベース分類、管理型分類およびクラスタ化(非管理型分類)が組み込まれています。ルールベース分類では、ユーザーがドキュメントの分類ルールを(問合せ形式で)記述すると、Oracle Textでルールに従ってドキュメント分類が実行されます。管理型分類では、サンプル・ドキュメント・セットに基づいてOracle Textにより分類ルールが作成されます。クラスタ化分類では、クラスタとルールの両方がOracle Textにより作成されます。

クラスタ化

非管理型分類と同義。「分類」を参照してください。

コンポジット・ドメイン索引

CDIタイプの索引とも呼ばれます。指定されたテキスト列を索引付けおよび処理するだけでなく、索引の作成中に指定されたFILTER BYおよびORDER BY構造化列も索引付けおよび処理するOracle Text索引です。「ドメイン索引」も参照してください。

CONTEXT索引

基本的なタイプのOracle Text索引(テキスト列の索引)。CONTEXT索引は、ソース・テキストが大量のまとまったドキュメントで構成されている場合に有用です。CONTEXT索引を使用するアプリケーションは、CONTAINS問合せ演算子を使用してテキストを取り出します。

CTXAPPロール

ユーザーがOracle Text索引と索引プリファレンスを作成し、PL/SQLパッケージを使用できるようにする、アプリケーション開発者のロール。このロールはOracle Textユーザーに付与する必要があります。

CTXCAT索引

1つのテキスト列と他の1つ以上の列が結合された索引。通常は、カタログによくある品目名、価格および説明など、小さいドキュメントやテキスト断片の索引付けに使用します。一般に、CTXCAT索引は、CONTEXT索引よりも複合問合せのパフォーマンスが優れています。

アプリケーションは、この索引をCATSEARCH演算子を使用して問い合せます。この索引はトランザクションに基づき、元表に対するDMLにより自動的に更新されます。

CTXRULE索引

CTXRULE索引は、ドキュメント分類アプリケーションの作成に使用される索引。CTXRULE索引は、問合せ表に作成する索引で、問合せが分類基準を定義するルールとして機能します。この索引は、MATCHES演算子で問い合せます。

CTXSYSユーザー

CTXSYSユーザーは、インストール時に作成されます。CTXSYSユーザーは、全索引の表示、全索引の同期化、ctxkbtc(ナレッジ・ベース拡張コンパイラ)の実行、すべてのシステム定義ビューの問合せ、およびCTXAPPロールを持つユーザーの全タスクの実行が可能です。

CTXXPATH索引

XMLType列に対するexistsNode()問合せを高速にするために使用される索引。

データストア

Oracle Textでは、データストアはテキストの格納方法を意味します。格納方法は、特定の型の記憶域プリファレンスを指定することで決定されます。たとえば、DIRECT_DATASTORE型ではデータはテキスト列に直接格納されますが、URL_DATASTOREではデータをURLで指定した外部の場所に格納するように指定されます。

ドメイン索引

指定されたテキスト列を索引付けおよび処理するOracle Databaseのドメイン索引。「コンポジット・ドメイン索引」も参照してください。

endjoin

トークンの最終文字として出現し、トークンの終わりを明示的に識別する英数字以外の1文字以上の文字。この文字と直後のstartjoin文字は、トークンのテキスト索引エントリに含まれます。たとえば、endjoinとして++を指定すると、C++が認識されて単一トークンとして索引付けされます。「printjoin」、「skipjoin」、「startjoin」も参照してください。

フィールド・セクション

フィールド・セクションはゾーン・セクションに似ていますが、主な違いはフィールド・セクションの開始タグと終了タグの間にある内容をドキュメントの他の部分とは別に索引付けできることです。このため、フィールド・セクションの内容を通常の問合せから非表示にすることができます。(INPATHおよびWITHIN演算子を使用すると、このようなセクション内の語句を検索できます。)フィールド・セクションは、ドキュメント内のセクションに1回のみ出現するニュース・ヘッダーのフィールドなどに適しています。フィールド・セクションは、CTX_DDL.ADD_FIELD_SECTIONプロシージャまたはALTER INDEX文を使用してセクション・グループに追加します。「INPATH演算子」、「セクション」、「WITHIN演算子」、「ゾーン・セクション」も参照してください。

フィルタ処理

Oracle Textの索引作成プロセスのステップの1つ。索引作成に関連付けられているフィルタ・プリファレンスに応じて、フィルタ処理中に3つの処理(形式設定されたドキュメントがマークアップされたテキストにフィルタ処理される、テキストが非データベース・キャラクタ・セットからデータベース・キャラクタ・セットに変換される、フィルタ処理が発生しない)のいずれかが発生します(HTML、XMLおよびプレーン・テキスト・ドキュメントはフィルタ処理されません)。

ファジー・マッチング

ファジー・マッチング問合せでは、指定した語句に似たスペルを持つワードまで含むように問合せが拡張されます。このタイプの拡張は、ドキュメント・セットにスペルミスが頻出する場合に、より正確な結果を検出する上で有用です。ファジー・マッチングはFUZZY問合せ演算子で呼び出します。

HASPATH演算子

問合せで指定したとおりのセクション・パスを含むXMLドキュメントの検索に使用するCONTAINS問合せ演算子。「PATH_SECTION_GROUP」も参照してください。

ハイライト表示

Oracle Textでのハイライト表示とは、一般に、問合せ語句が特別な方法で表示またはコールアウトされた状態でドキュメントまたはドキュメント断片のバージョンが生成されることです。

ハイライト表示には次の3つの形式があります。CTX_DOC.MARKUPは、問合せ語句をプレーン・テキストまたはHTMLタグで囲んだドキュメントを戻します。CTX_DOC.HIGHLIGHTは、ユーザーが必要に応じてドキュメントをマークアップできるように、問合せ語句のオフセットを戻します。CTX_DOC.SNIPPETは、問合せ語句を前後のテキスト・マークアップの断片に表示したコンコーダンスを生成します。

HTML_SECTION_GROUP

HTMLドキュメントのセクション定義に使用するセクション・グループ・タイプ。「BASIC_SECTION_GROUP」、「セクション」、「セクション・グループ」も参照してください。

INPATH演算子

XMLドキュメントのタグ内またはパス内の検索に使用するCONTAINS問合せ演算子。WITHIN演算子よりも汎用的なパス名の指定が可能。「WITHIN演算子」も参照してください。

KWIC

Oracle Textで、ソース・ドキュメント内の前後のテキストとともに問合せ用語を表示する方法。この表示方法は、問合せ用語の単一インスタンス、複数インスタンスまたはソース・ドキュメント内の各インスタンスで構成されます。これはCTX_DOC.SNIPPETプロシージャにより生成されます。Key Word in Context(KWIC)とも呼ばれます。

ナレッジ・ベース

ナレッジ・ベースは、テーマの索引付け、ABOUT問合せおよびドキュメント・サービスでのテーマの抽出などに使用される、Oracle Textに組み込まれた概念の階層ツリーです。ナレッジ・ベースはオプションでインストールできます。独自のナレッジ・ベースの作成、または標準のOracle Textのナレッジ・ベースの拡張が可能です。

レクサー

Oracle Textのレクサーは、指定された言語に従ってソース・テキストをトークン(通常はワード)に分割します。レクサーは、トークンの抽出にレクサー・プリファレンスに定義されたパラメータを使用します。これらのパラメータには、トークンの分割に使用する空白などの文字の定義や、テキストをすべて大文字に変換するかどうかなどの定義が含まれています。テーマの索引付けが使用可能の場合、レクサーはテキストを分析してテーマ・トークンを作成します。

アプリケーションで複数の言語によるドキュメントを含む表を索引付けする必要がある場合は、MULTI_LEXER (マルチ言語レクサー)を使用し、サブレクサーを作成して各言語を処理できます。各サブレクサーは、CTX_DDl.ADD_SUB_LEXERプロシージャを使用してメインのマルチレクサーに追加されます。

マークアップ

ハイライト表示の形式の1つ。CTX_DOC.MARKUPおよびCTX_DOC.POLICY_MARKUPプロシージャにより、問合せ語句とドキュメントを使用して、問合せ語句がマークアップされた(つまり、プレーン・テキスト文字またはHTMLタグで囲まれた)ドキュメントが戻されます。事前定義済のマークアップ・タグを使用するか、独自のマークアップ・タグを指定できます。これに対して、CTX_DOC.HIGHLIGHTおよびCTX_DOC.POLICY_HIGHLIGHTは問合せ語句のオフセットを戻すため、独自のハイライト表示タグを追加できます。「ハイライト表示」も参照してください。

MDATA

「メタデータ」を参照してください。

MDATAセクション

MDATAセクションには、ユーザー定義索引メタデータが含まれます。このメタデータを使用すると、複合CONTAINS問合せを高速化できます。「メタデータ」、「複合問合せ」、「セクション」も参照してください。

メタデータ

メタデータは、ドキュメントの通常の内容に含まれていないドキュメント関連情報です。たとえば、HTMLドキュメントに<author>Mark Twain</author>が含まれている場合、authorはメタデータのタイプとみなされ、Mark Twainはauthorの値とみなされます。

メタデータを含むセクションはMDATAセクションと呼ばれ、CTX_DDL.ADD_MDATA_SECTIONプロシージャを使用してドキュメントに追加できます。メタデータを利用すると、複合問合せを高速化できます。このような問合せは、MDATA演算子を使用して実行できます。「複合問合せ」、「セクション」も参照してください。

複合問合せ

テキストの内容とドキュメント・タイプなど、タイプの異なる2つの情報を検索する問合せ。<title>メタデータ内のRomeo and Julietの検索は複合問合せの一例です。

名前検索

(名前マッチングとも呼ばれる)名前検索では、表記バリエーションのためにスペルが異なっても正しい名前を照合するソリューションを提供しています。また、これを使用すると、レコードの名および姓が正しくセグメント化されていない場合などに発生する可能性がある、正確さに欠けるデータも検索できます。

NEWS_SECTION_GROUP

RFC 1036で定義されたニュース・グループ形式のドキュメントのセクションを定義するために使用されるセクション・グループ・タイプ。「セクション」、「セクション・グループ」も参照してください。

正規化されたワード

有効な変換ルールに従って索引付けのために変換された後のワードの書式。有効なルールによっては、ワードの正規化形式がソース・ドキュメント内の形式と同一の場合があります。正規化形式のワードには、オリジナル・バージョンと変換済バージョンの両方が含まれる場合もあります。たとえば、ドイツ語の新規スペルが指定されている場合、ワードPotentialはPotenzialおよびPotentialの両方に正規化されます。

NULL_SECTION_GROUP

セクションが定義されていない場合や、SENTENCEまたはPARAGRAPHセクションのみが定義されている場合の、デフォルトのセクション・グループ・タイプ。「セクション」、「セクション・グループ」、「特殊セクション」も参照してください。

PATH_SECTION_GROUP

XMLドキュメントの索引付けに使用されるセクション・グループ・タイプ。AUTO_SECTION_GROUPタイプに似ていますが、HASPATHおよびINPATH演算子を使用できます。「AUTO_SECTION_GROUP」、「HASPATH演算子」、「INPATH演算子」、「セクション」、「セクション・グループ」も参照してください。

プリファレンス

プリファレンスは、Oracle Textでの索引の作成方法に影響するオプションのパラメータです。たとえば、レクサー・プリファレンスでは、JAPANESE_VGRAM_LEXERなど、ドキュメントの処理時に使用するレクサーを指定します。格納、フィルタ処理、レクサー、分類、ワードリスト、セクション・タイプなどのプリファレンスがあります。プリファレンスには、属性が関連付けられている場合と関連付けられていない場合があります。プリファレンスの設定にはCTX_DDL.CREATE_PREFERENCEプロシージャを使用します。「属性」も参照してください。

printjoin

ワードの任意の場所(先頭、中間または最後)に出現した場合に、英数字として処理されてOracle Text索引にトークンとともに含まれる、英数字以外の1文字以上の文字。これには、連続的に発生するprintjoinが含まれます。

たとえば、ハイフン(-)とアンダースコア(_)がprintjoinとして定義されている場合、pseudo-intellectualや_file_などの語句はOracle Text索引にpseudo-intellectualおよび_file_として格納されます。

endjoinおよびstartjoinとは異なり、printjoinの場合は位置は無関係です。たとえば、$がstartjoinまたはprintjoinとして定義されている場合、$35は1つのトークンとして索引付けされますが、endjoinとして定義されている場合は2つのトークンとして索引付けされます。「endjoin」、「printjoin」、「startjoin」も参照してください。

結果セット

アプリケーション内の検索結果のページは、多くの異種要素(最初のいくつかのドキュメントのメタデータ、合計ヒット数、ワード当たりのヒット数など)で構成されます。以前のバージョンのOracle Textでこれらの結果を生成するには、複数の問合せとコールが必要でした。追加のコールのたびに、問合せを再解析して索引メタデータを検索するための時間がかかります。また、SQLでは、反復問合せ絞込みや上位10の内訳といった一部の検索操作が難しくなります。

結果セット・インタフェースは、検索結果のページに必要な様々な種類のデータを同時に作成でき、オーバーヘッドを共有することでパフォーマンスを向上させます。結果セット・インタフェースは、SQLでは表現しにくいデータ・ビュー(カテゴリ問合せによる上位Nなど)も戻すことができます。

ルールベース分類

「分類」を参照してください。

SDATAセクション

構造化/ソート・データ・セクション。等価性検索のみをサポートするMDATAセクション・タイプとは異なり、SDATAセクションは範囲検索もサポートするように設計されています。デフォルトでは、すべてのFILTER BY列とORDER BY列がSDATAセクションとしてマップされます。SDATAセクションにはユーザー定義索引メタデータが含まれています。このタイプのセクションを使用すると、複合CONTAINS問合せを高速化できます。「複合問合せ」、「セクション」も参照してください。

セクション

ドキュメントの下位区分。たとえば、HTMLページの<a>...</a>セクション内の内容全体。

1つのドキュメントを複数のセクションに分割してからセクション内で検索すると、テキスト問合せをドキュメント内のテキスト・ブロックに絞り込むことができます。セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に有効です。また、テキストを文レベルと段落レベルで検索できます。

セクション検索は、HASPATH、ISPATHまたはWITHIN演算子を使用して実行します。セクション検索を使用可能にするには、索引作成時にセクション・グループを使用します。

各種セクション・タイプには、属性、フィールド、HTML、MDATA、特殊、停止、XMLおよびゾーンなどがあります。

セクション・グループ

ドキュメント・セットのタイプを識別し、索引付けに使用するタグ構造を暗黙的に示すグループ。たとえば、HTMLタグ付きのドキュメントを索引付けするには、HTML_SECTION_GROUPセクション・グループ・タイプを使用します。同様に、XMLタグ付きのドキュメントを索引付けするには、XML_SECTION_GROUPセクション・グループ・タイプを使用します。セクション・グループは、CTX_DDL.CREATE_SECTION_GROUPプロシージャまたはALTER INDEX文を使用して宣言します。「セクション」も参照してください。

skipjoin

ワード内に出現した場合に、そのワードを単一トークンとして識別する英数字以外の文字。ただし、その文字はテキスト索引にトークンとともに格納されません。たとえば、ハイフン文字(-)がskipjoinとして定義されている場合、ワードpseudo-intellectualは、テキスト索引にpseudointellectualとして格納されます。「endjoin」、「printjoin」、「startjoin」も参照してください。

startjoin

トークンの第1文字として出現し、トークンの始まりを明示的に識別する英数字以外の1文字以上の文字。この文字と直後の他のstartjoin文字は、トークンのテキスト索引エントリに含まれます。たとえば、$がstartjoinとして定義されている場合、$35は単一トークンとして索引付けされます。また、startjoin文字列の最初のstartjoin文字は、前のトークンを暗黙的に終了させます。「endjoin」、「printjoin」、「skipjoin」も参照してください。

ステミング

同じ語幹のワードを持つ語句をすべて含むように問合せ語句を拡張すること。たとえば、動詞talkをステミングすると、talkのみでなくtalking、talksおよびtalkedが導出されます(ただし、talkieは導出されません)。ステミングと異なり、ワイルド・カード拡張の場合は結果がスペルにのみ関連し、語形には関連しません。「ワイルド・カード拡張」も参照してください。

特殊セクション

タグで境界が設定されていないドキュメント・セクション。かわりに、セクションは文や段落などのプレーン・テキスト・ドキュメント構造で形成されます。特殊セクションは、CTX_DDL.ADD_SPECIAL_SECTIONプロシージャを使用してセクション・グループに追加されます。「セクション」、「セクション・グループ」も参照してください。

停止セクション

AUTO_SECTION_GROUPに追加され、そのタイプのドキュメント・セクションの情報を索引作成中に無視させるセクション。ただし、この場合もセクションの内容は検索可能です。停止セクションは、CTX_DDL.ADD_STOP_SECTIONプロシージャを使用してセクション・グループに追加します。「AUTO_SECTION_GROUP」、「セクション」、「セクション・グループ」も参照してください。

ストップクラス

NUMBERなど、索引作成時にスキップされるトークンのクラス。ストップクラスを指定するには、CTX_DDL.ADD_STOPCLASSを使用してストップリストにストップクラスを追加します。「ストップリスト」も参照してください。

ストップリスト

ストップワード、テーマ(ストップテーマ)およびデータ・クラス(ストップクラス)と呼ばれ、索引作成の対象にならないワードのリスト。デフォルトでは、指定のデータベース言語に対応するシステム提供のストップリストを使用してテキストが索引付けされます。

Oracle Textには、英語、フランス語、ドイツ語、スペイン語、中国語、オランダ語およびデンマーク語など、最も一般的な言語用のデフォルトのストップリストが用意されています。これらのデフォルト・ストップリストには、ストップワードのみが含まれています。ストップリストは、CTX_DDL.CREATE_STOPLISTまたはALTER INDEX文で作成します。「ストップクラス」、「ストップテーマ」、「ストップワード」も参照してください。

ストップテーマ

索引作成時にスキップされるテーマ。ストップテーマを指定するには、CTX_DDL.ADD_STOPTHEMESを使用してストップリストにストップテーマを追加します。「ストップリスト」も参照してください。

ストップワード

索引作成時にスキップされるワード。ストップワードを指定するには、CTX_DDL.ADD_STOPWORDを使用してストップリストにストップワードを追加します。ALTER INDEX文を使用して索引に動的に追加することもできます。「ストップリスト」も参照してください。

サブレクサー

「レクサー」を参照してください。

管理型分類

「分類」を参照してください。

テーマ

特定のドキュメントに関連付けられているトピック。1つのドキュメントに多数のテーマが存在する場合があります。ドキュメントにテーマが表示される必要はなく、たとえば、ワードSan Franciscoを含むドキュメントがテーマの1つとしてCaliforniaを持つ場合があります。

テーマ・コンポーネントを索引に追加するには、BASIC_LEXERプリファレンスのINDEX_THEMES属性を使用します。ドキュメントから抽出するにはCTX_DOC.THEMESを使用し、問合せにはABOUT演算子を使用します。

非管理型分類

クラスタ化とも呼ばれます。「分類」を参照してください。

ワイルド・カード拡張

指定したパターンと一致するワードを戻すように問合せ語句を拡張すること。たとえば、問合せ語句%rot%を拡張すると、trotとrottenの両方が戻されます。ワイルド・カード拡張は、ステミングとは異なります。「ステミング」も参照してください。

空白

トークン間の空白として扱われる文字。空白の事前定義済のデフォルト値は「space」と「tab」です。BASIC_LEXERでは、空白文字を(句読点および改行文字とともに)使用して、文と段落の検索に文デリミタとして機能する文字列が識別されます。

WITHIN演算子

特定のXMLドキュメント・セクション内で問合せ語句の検索に使用されるCONTAINS問合せ演算子。INPATH演算子に似ていますが、より限定的です。「INPATH演算子」も参照してください。

ワードリスト

サブストリングおよびプリフィックス索引付けとともに、ファジー、ステミングおよびプリフィックス索引付けなどの機能を使用可能にしてワイルド・カード検索を向上させるOracle Textプリファレンス。ワードリスト・プリファレンスは、CONTAINSおよびCATSEARCHを使用してワイルド・カード問合せのパフォーマンスを向上させます。ワードリストは、CTX_DDL.ADD_WORDLISTプロシージャまたはALTER INDEX文を使用して作成します。「プリファレンス」も参照してください。

XMLセクション

XMLタグで定義され、XMLセクション検索を可能にするセクション。XMLセクションで索引付けすると、ドキュメント・タイプ別のセクションを宣言できるのみでなく、自動セクション化が可能です。XMLセクション検索には、INPATH、HASPATHおよびWITHIN演算子を使用したパス・セクション検索のみでなく属性検索が含まれます。「セクション」も参照してください。

XML_SECTION_GROUP

索引付けするXMLドキュメントの識別に使用されるセクション・グループ。「セクション」、「セクション・グループ」も参照してください。

ゾーン・セクション

基本的なタイプのドキュメント・セクションであり、ドキュメント内の開始タグと終了タグで区切られたテキストの本体です。ゾーン・セクションは、HTMLおよびXMLドキュメントのセクションの定義に最適です。ゾーン・セクションは、CTX_DDL.ADD_ZONE_SECTIONプロシージャまたはALTER INDEX文を使用してセクション・グループに追加します。「フィールド・セクション」、「セクション」、「セクション・グループ」も参照してください。

索引
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Z

A

ABOUT問合せ, 4.2.1

言語への追加, 10.4.1

大/小文字区別, 4.1.8.2

定義, 4.1.6

アクセント

文字の索引付け, 3.2.8.2

ACCUM演算子, 4.2.2 ADD_STOPCLASSプロシージャ, 3.3.4.3 ADD_STOPTHEMEプロシージャ, 3.3.4.3, 3.3.4.3 ADD_STOPWORDプロシージャ, 3.3.4, 3.3.4.3 ADD_SUB_LEXERプロシージャ

例, 3.3.2.5

管理ツール, 12.5 ALTER INDEX文

索引の再構築, 3.4.5

失敗した索引の再開, 3.4.3

代替スペル, 3.2.8.3 代替文法, 4.1.18 代替文法テンプレート, 4.1.18 代替スコアリング, 4.1.17 代替スコアリング・テンプレート, 4.1.17 AND演算子, 4.2.2 アプリケーション

サンプル, A, B

アプリケーション, アップデート, 13 属性

XMLの検索, 8.3.2

属性セクション, 8.1.2.7 AUTO_FILTERフィルタ, 3.1.3.2, 3.2.2, 3.2.4, 7.8.4 AUTO_SECTION_GROUPオブジェクト, 8.1.1.1 自動セクション, 8.3.1

B

バックグラウンドDML, 12.6

基本文字変換, 3.2.8.2

BASIC_LEXER, 3.2.5

BASIC_SECTION_GROUPオブジェクト, 8.1.1.1

BFILE列, 3.2.1.1

索引付け, 3.3.5.2

BINARY形式列の値, 3.2.2.2 BLOB列, 3.2.1.1

索引付け, 3.3.5.2

ブロック操作

問合せのチューニング, 7.6

行のバイパス, 3.2.3

C

cantaloupe dispenser, A.1

大/小文字区別

ABOUT問合せ, 4.1.8.2

索引付け, 3.2.7

問合せ, 4.1.8

シソーラス, 10.1.2

カタログ・アプリケーション, 2.4

例, 2.4

CATSEARCH, 4.1.2

索引の作成, 3.3.6.3

演算子, 4.3

SQL例, 4.1.2.1

CATSEARCH問合せ, 2.4 CHAR列, 3.2.1.1 キャラクタ・ラージ・オブジェクト(CLOB), 2.3 キャラクタ・セット

索引付け, 3.2.4

複合の索引付け, 3.2.4.2

キャラクタ・セット列, 3.2.1.6 キャラクタ・セット列, 3.2.4.2 CHARSET_FILTER, 3.1.3.2, 3.2.4 中国語の索引付け, 3.2.8.5 CHINESE_VGRAM_LEXER, 3.2.8.5 分類

意思決定ツリー(管理型), 6.4.1

ルールベース, 6.3

単純, 「ルールベース分類」を参照

管理型, 6.4

SVM(管理型), 6.4.2

非管理型

分類アプリケーション

例, 2.5

CLOB(キャラクタ・ラージ・オブジェクト)データ型, 2.3 CLOB列, 3.2.1.1

索引付け, 3.3.5.2

クラスタ化, 「非管理型分類」を参照 列型

索引付けでのサポート, 3.2.1.1

複合語

索引付け, 3.2.8.4

コンコーダンス, 5.1.3.3 CONTAINS

演算子, 4.2

PL/SQL例, 4.1.1.2

問合せ, 4.1.1

SQL例, 4.1.1.1

構造化問合せ, 4.1.1.3

CONTAINS問合せ, 2.3 CONTEXT文法, 4.2 CONTEXT索引

概要, 3.1.1

作成, 3.3.1, 3.3.5

HTML例, 2.3, 3.3.5.5, A.2.2

couch, self-tipping, A.1 ヒット数のカウント, 4.2.10 CREATE_INDEX_SCRIPT, 12.4 CREATE_POLICY_SCRIPT, 12.4, 12.4 CREATE_STOPLISTプロシージャ, 3.3.4, 3.3.4.3 CTX_CLS.TRAINプロシージャ, 6.4 CTX_DDL.SYNC_INDEXプロシージャ, 2.3 CTX_DOC.POLICY_SNIPPETプロシージャ, 5.1.3.3 CTX_DOC.SNIPPETプロシージャ, 5.1.3.3 CTX_INDEX_ERRORSビュー, 3.4.1, 12.2 CTX_OUTPUT.END_QUERY_LOG, 4.1.19 CTX_OUTPUT.START_QUERY_LOG, 4.1.19 CTX_PENDINGビュー, 12.2 CTX_QUERY.RESULT_SETプロシージャ, 11.2 CTX_REPORT, 3.5.3.5 CTX_REPORTパッケージ, 12.4 CTX_REPORT_QUERY_LOG_SUMMARY, 4.1.19 CTX_REPORT_TOKEN_TYPE, 12.4 CTX_REPORT.CREATE_INDEX_SCRIPT, 12.4 CTX_REPORT.CREATE_POLICY_SCRIPT, 12.4, 12.4 CTX_REPORT.DESCRIBE_INDEX, 12.4 CTX_REPORT.DESCRIBE_POLICY, 12.4 CTX_REPORT.INDEX_SIZE, 12.4 CTX_REPORT.INDEX_STATS, 12.4 CTX_REPORT.QUERY_LOG_SUMMARY, 12.4 CTX_REPORT.TOKEN_INFO, 12.4 CTX_THESパッケージ

概要, 10.1.1.1

CTX_USER_INDEX_ERRORSビュー, 3.4.1, 12.2 CTX_USER_PENDINGビュー, 12.2 CTXAPP role, 2.2, 12.1 CTXCAT文法, 4.3 CTXCAT索引

概要, 3.1.1

パフォーマンス, 7.7.17

自動同期化, 2.4

作成, 2.4

例, 3.3.6

ctxkbtc

例, 10.3.2.5

ctxload

シソーラスのロード例, 10.1.1.3, 10.3.1, 10.3.2.4

CTXRULE索引, 6.3.2

概要, 3.1.1

使用可能な問合せ, 6.3.2

作成, 2.5.1, 3.3.7

レクサー・タイプ, 6.3.2

制限事項, 6.3.2

パラメータ, 6.3.2

CTXSYSユーザー, 12.1 CTXXPATH索引, 1.5.3.2

概要, 3.1.1

D

データ記憶域

索引デフォルト, 3.3.5.2

プリファレンス例, 3.3.2.1.4

データストア

概要, 3.1.3.1, 3.3.1

DATE列, 3.3.5.2 意思決定ツリー管理型分類, 6.4.1 デフォルトのシソーラス, 10.1.4 DEFAULT_INDEX_MEMORY, 7.8.2 デフォルト

索引, 3.3.5.2

DEFINEMERGE演算子, 4.2.11 DEFINESCORE演算子, 4.2.11 DESCRIBE_INDEX, 12.4 DETAIL_DATASTORE, 3.2.1.2.1

概要, 3.2.1.8

発音区別記号

文字, 3.2.8.2

DIRECT_DATASTORE, 3.2.1.2.1

概要, 3.2.1.8

例, 3.3.2.1.1

DML

保留中の表示, 3.5.1

DML処理

バックグラウンド, 12.6

DMLキュー, 12.2 ドキュメント

分類, 3.3.7, 6

ドキュメント形式

索引パフォーマンスへの影響, 7.8.4

パフォーマンスへの影響, 7.7.5

ドキュメント形式

フィルタ処理, 3.2.2

サポート, 3.2.1.7

ドキュメントの無効性, 3.5.3.3 ドキュメントの表示方法

概要, 5.3

ドキュメント・セクション, 3.3.3 ドキュメント・サービス

概要, 5.3

DOMAIN_INDEX_NO_SORTヒント

スループットの向上例, 7.2.2

DOMAIN_INDEX_SORTヒント

応答時間の短縮例, 7.1.2.1

DROP INDEX文, 3.4.2 DROP_STOPLISTプロシージャ, 3.3.4.3 索引の削除, 3.4.2

E

EQUIV演算子, 4.2.2

エラー

DML, 12.2

表示, 3.4.1

実行計画, 4.1.10

F

フィードバック

問合せ, 4.1.9

フィールド・セクション

定義, 8.1.2.2

ネストされた, 8.1.2.2.2

繰返し, 8.1.2.2.3

参照可能および参照不能, 8.1.2.2.1

ファイル・パス

格納, 3.2.1.3

FILE_DATASTORE, 3.1.3.1

概要, 3.2.1.3, 3.2.1.8

例, 3.3.2.1.4

フィルタ

概要, 3.1.3.2, 3.3.1

フィルタ処理

カスタム, 3.2.2.3

索引デフォルト, 3.3.5.2

プレーン・テキストおよびHTML, 5.3

ドキュメントのフィルタ処理, 3.2.2 FIRST_ROWSヒント, 4.2.9

スループットの向上例, 7.2.2

FIRST_ROWSヒント, 7.1.2 形式列, 3.2.1.6, 3.2.2.2, 3.2.3 形式

フィルタ処理, 3.2.2

サポート, 3.2.1.7

索引の断片化, 3.5.3.2, 7.9.2

表示, 3.5.3.5

全テーマ

取得, 5.2.1.2.2

機能的検索, 7.7.6 ファジー・マッチング, 3.2.9

デフォルト, 3.3.5.2

FUZZY演算子, 4.2.5

G

ガベージ・コレクション, 3.5.3.3

ドイツ語

代替スペル, 3.2.8.3

複合語, 3.2.8.4

要旨

定義, 5.2

例, 5.2.2.1

GISTプロシージャ, 5.2.2 文法

代替, 4.1.18

CTXCAT, 4.3

文法CONTEXT, 4.2 ロールの付与, 2.2, 12.1.3

H

HASPATH演算子, 8.3.4

例, 8.3.4.8

HFEEDBACKプロシージャ, 4.1.9 ハイライト表示

概要, 5.3

概要, 5.1

ドキュメントのハイライト表示, 2.3 テキストのハイライト表示, 5.1.1 テーマのハイライト表示, 5.1.2 ヒット数, 4.2.10 home air dirtier, A.1 HTML

フィルタ処理, 5.3

索引付け, 3.3.2.2, 8.1.1.1

索引付けの例, 2.3, A.2.2

METAタグの検索, 8.2.2

ゾーン・セクションの例, 3.3.3.1, 8.2.1

HTML_SECTION_GROUPオブジェクト, 3.3.3.1, 8.1.1.1, 8.2.1

NULL_FILTER, 2.3, 3.3.2.2, A.2.2

I

IGNORE

形式列の値, 3.2.3

IGNORE形式列の値, 3.2.2.2 索引

概要, 3.1

作成, 3.3

削除, 3.4.2

断片化, 3.5.3.2

レポートの取得, 12.4

追加的な索引, 3.3.5.3

メンテナンス, 3.4

オンラインでの再作成, 3.4.4.1

最適化, 3.5.3, 3.5.3.6

再構築, 3.4.5

統計, 12.4

構造, 3.1.2, 3.5.3.1

同期化, 3.5.2, 12.6

情報の表示, 12.4

索引デフォルト

全般, 3.3.5.2

索引エンジン

概要, 3.1.3.5

索引エラー

表示, 3.4.1

索引の断片化, 7.9.2 索引メモリー, 7.8.2 索引同期化, 2.3 索引タイプ

選択, 3.1.1

INDEX_SIZE, 12.4 INDEX_STATS, 12.4 INDEX_STATSプロシージャ, 3.5.3.5 索引付き検索, 7.7.6 索引付け

ビュー, 3.1.7

行のバイパス, 3.2.3

考慮事項, 3.2

処理の概要, 3.1.3

パラレル, 3.1.6, 7.8.5

失敗した場合の再開, 3.4.3

特殊文字, 3.2.6

索引付けのパフォーマンス

FAQ, 7.8

パラレル, 7.8.6

索引付けの時間, 7.8.1 INPATH演算子, 8.3.4

例, 8.3.4.2

INSO_FILTER(非推奨), 13.3.1 INSO_OUTPUT_FORMATTING属性(非推奨), 13.3.1 INSO_TIMEOUT属性(非推奨), 13.3.1 INSOFILTERディレクティブ(非推奨), 13.3.1

J

日本語の索引付け, 3.2.8.5

JAPANESE_LEXER, 3.2.8.5

Jdeveloper

Textウィザード, 2.3.1, A, B

K

ナレッジ・ベース

概要, 10.4

補強, 10.3.2

新規語句のリンク, 10.3.2.3

サポートされているキャラクタ・セット, 10.4

ユーザー定義, 10.4.1

韓国語の索引付け, 3.2.8.5 KOREAN_MORPH_LEXER, 3.2.8.5

L

言語

索引付けのためのデフォルト設定, 3.3.5.2

各国語別の機能, 3.2.8 言語

索引付け, 3.2.5

言語固有のナレッジ・ベース, 10.4.1 レクサー

概要, 3.1.3.4, 3.3.1

CTXRULE, 6.3.2

テーマのリスト

定義, 5.2

取得, 5.2.1

テキストのロード

概要, 3.2.1

LOB列

問合せパフォーマンスの向上, 7.7.11

索引付け, 3.3.5.2

ローカル・パーティション索引, 7.7.14

レスポンス時間の短縮, 7.1.3

テキストの場所, 3.2.1 sync_indexのロック・パラメータ, 3.5.2.3 論理演算子, 4.2.2

M

magnet, pet, 「pet magnet」を参照

索引のメンテナンス, 3.4

マークアップされたドキュメント

取得, 5.1.3.1

MARKUPプロシージャ, 2.3, 5.1.3.1 MATCHES

概要, 4.1.3

PL/SQL例, 3.3.7.3, 4.1.3.2

SQL例, 4.1.3.1

MATCHES演算子, 2.5.1, 6.3.1 マテリアライズド・ビュー、索引 MAX_INDEX_MEMORY, 7.8.2 sync_indexのmaxtimeパラメータ, 3.5.2.2 MDATA演算子, 8.1.2.4 MDATAセクション, 8.1.2.4 メモリー割当て

索引の同期化, 7.9.3

索引付け, 7.8.2

問合せ, 7.7.10

METAタグ

ゾーン・セクションの作成, 8.2.2.1

メタデータ

追加, 8.1.2.4

削除, 8.1.2.4

セクション, 8.1.2.4

以前のリリースからの移行, 13 複合書式

フィルタ処理, 3.2.2.2

複合問合せ, 8.1.2.4, 8.1.2.6 MULTI_COLUMN_DATASTORE, 3.2.1.2.1

概要, 3.2.1.8

例, 3.3.2.1.2

MULTI_LEXER, 3.2.5.2

例, 3.3.2.5

マルチ言語列

索引付け, 3.2.5.2

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

概要, 3.3.4.1

複数のCONTAINS

パフォーマンスの向上, 7.7.12

MVIEW, 「マテリアライズド・ビュー」を参照

N

名前マッチング, 9.1

名前検索, 9.1

NCLOB列, 3.3.5.2

NEAR演算子, 4.2.4

NEAR_ACCUM演算子, 4.2.4

ネストされたゾーン・セクション, 8.1.2.1.3

NESTED_DATASTORE, 3.2.1.2.1

概要, 3.2.1.8

NEWS_SECTION_GROUPオブジェクト, 8.1.1.1 NOPOPULATEキーワード

追加的再構築および置換パラメータ, 3.3.5.3

RECREATE_INDEX_ONLINEによる非移入, 3.4.4.1 NOT演算子, 4.2.2 NULL_FILTER, 3.1.3.2

例, 2.3, 3.3.2.2, A.2.2

NULL_SECTION_GROUPオブジェクト, 8.1.1.1 NUMBER列, 3.3.5.2

O

オフセット情報

ハイライト表示, 5.1.3.2

オンライン

CONTEXT索引タイプの再作成, 3.4.4.1

演算子

MDATA, 8.1.2.4

SDATA, 8.1.2.6

演算子

CATSEARCH, 4.3

CONTAINS, 4.2

論理, 4.2.2

シソーラス, 10.1.1.2

索引の最適化, 3.5.3

例, 3.5.3.6

単一のトークン, 3.5.3.4

問合せの最適化, 4.2.9

FAQ, 7.7

レスポンス時間, 7.1

スループット, 7.2

ブロック操作, 7.6

OR演算子, 4.2.2 ora

contains, 1.5.2

Oracle Enterprise Manager, 12.5 Oracle Enterprise ManagerおよびOracle Text, 12.5 OEMのOracle Textページ, 12.5 Oracle XML DB, 1.5 表外のLOBへの格納

パフォーマンスの向上, 7.7.11

P

パラレル索引付け, 3.1.6, 7.8.5

パーティション表, 7.8.6

パラレル問合せ, 7.5, 7.7.15

Real Application Clusters(RAC)ノード間, 7.5

パーティション索引, 7.7.14

レスポンス時間の短縮, 7.1.3

パス・セクション検索, 8.3.4 PATH_SECTION_GROUP

例, 8.3.4.1

保留中のDML

表示, 3.5.1

保留中の更新, 12.2 パフォーマンス・チューニング

索引付け, 7.8

問合せ, 7.7

索引の更新, 7.9

pet magnet, A.1

要旨, 5.3.3

例, 5.3

テーマ, 5.3.2

句問合せ, 4.1.4 pizza shredder, A.1 プレーン・テキスト

NULL_FILTERによる索引付け, 3.3.2.2

プレーン・テキストのフィルタ処理, 5.3 PL/SQLファンクション

CONTAINSでのコール, 4.2.8

POPULATE_PENDING, 3.3.5.4 プリファレンス

作成(例), 3.3.2

管理ツールによる作成, 12.5

削除, 3.4.6

以前のリリース, 移行, 13 printjoin文字, 3.2.6.1 PROCEDURE_FILTER, 3.2.2.3 PSPアプリケーション, A.2, B.2

Q

問合せ

概要, 4.2.1

分析, 4.1.19

ブロック操作, 7.6

大/小文字区別, 4.1.8

CATSEARCH, 4.1.2, 4.1.2.1

CONTAINS, 4.1.1

ヒット数のカウント, 4.2.10

CTXRULE, 6.3.2

レポートの取得, 12.4

ログ, 4.1.19

MATCHES, 4.1.3

複合, 8.1.2.4, 8.1.2.6

スループットの向上のための最適化, 7.2

概要, 4.1

パラレル, 7.5

MDATAを使用した高速化, 8.1.2.4

SDATAを使用した高速化, 8.1.2.6

情報の表示, 12.4

表示ログ, 12.4

問合せ分析, 4.1.19 問合せアプリケーション

例, 2.3

サンプル, 1.2.1

問合せの実行計画, 4.1.10 問合せ式, 4.1.7 問合せ機能, 4.1.20 問合せのフィードバック, 4.1.9 問合せ言語, 4.1.16 問合せログ, 4.1.19, 12.4 問合せの最適化, 4.2.9

FAQ, 7.7

レスポンス時間, 7.1

Oracle RACノード間でパラレル化された問合せ, 7.5.2 問合せのパフォーマンス

FAQ, 7.7

問合せ緩和, 4.1.15 問合せ緩和テンプレート, 4.1.15 クエリー・リライト, 4.1.14 クエリー・リライト・テンプレート, 4.1.14 問合せテンプレート, 4.2.6, 4.3.1

langパラメータ, 4.1.16

問合せテンプレート, 4.1.13 QUERY_LOG_SUMMARY, 12.4 キュー

DML, 12.2

R

Real Application Clusters(RAC)とパラレル問合せ, 7.5

索引の再構築, 3.4.5, 3.4.5

RECREATE_INDEX_ONLINE, 3.4.4.1

DML, 3.4.4.1

オンラインでのローカル・パーティション索引の再作成, 3.4.4.1 索引の再作成, 3.4.4 オンラインでの索引の再作成, 3.4.4.1 問合せ緩和, 4.1.15 REMOVE_SQEプロシージャ, 4.2.7.1 REMOVE_STOPCLASSプロシージャ, 3.3.4.3 REMOVE_STOPTHEMEプロシージャ, 3.3.4.3 REMOVE_STOPWORDプロシージャ, 3.3.4, 3.3.4.3 応答時間

短縮, 7.1

最適化, 4.2.9

結果バッファ・サイズ

増加, 7.6

結果セット・インタフェース, 11 結果セット, 11 失敗した索引の再開, 3.4.3 問合せのリライト, 4.1.14 ロール

付与, 2.2, 12.1.3

システム定義, 12.1

ルールベース分類, 6.3

S

サンプル・アプリケーション, A, B

スコアリング

代替, 4.1.17

SDATA演算子, 8.1.2.6 SDATAセクション, 8.1.2.6 検索

XML, 1.5

セクション

属性, 8.1.2.7

フィールド, 8.1.2.2

グループおよびタイプ, 8.1.2

HTML例, 3.3.3

MDATA, 8.1.2.4

ネストされた, 8.1.2.1.3

オーバーラップ, 8.1.2.1.2

繰返しゾーン, 8.1.2.1.1

SDATA, 8.1.2.6

特殊, 8.1.2.8

停止セクション, 8.1.2.3

タイプおよびグループ, 8.1.2

ゾーン, 8.1.2.1

セクション・グループ

概要, 3.3.1

セクション・タイプ, 8.1.2

管理ツールによる作成, 12.5

セクション検索, 4.2.3

概要, 4.1.12, 8.1

使用可能化, 8.1.1

HTML, 8.2.1

セクショナ

概要, 3.1.3.3

セクション

自動, 8.3.1

パス, 8.3.4

self-tipping couch, A.1 SGAメモリー割当て, 7.8.2 単純な分類, 「ルールベース分類」を参照 単一テーマ

取得, 5.2.1.2.1

索引のサイズ, 表示, 12.4 skipjoin文字, 3.2.6.2 SORT_AREA_SIZE, 7.6, 7.7.10, 7.8.2 特殊文字

索引付け, 3.2.6

特殊セクション, 8.1.2.8 スペル

代替, 3.2.8.3

別の検索, 9.1

SQE演算子, 4.2.7 STEM演算子, 3.2.9, 4.2.5 ステミング

デフォルト, 3.3.5.2

パフォーマンスの向上, 7.7.13

停止セクション, 8.1.2.3 ストップクラス, 3.3.4.2, 3.3.4.2 ストップリスト, 3.3.4

概要, 3.3.1

管理ツールによる作成, 12.5

デフォルト, 3.3.5.2

マルチ言語, 3.2.12.2, 3.3.4.1

PL/SQLプロシージャ, 3.3.4.3

ストップテーマ, 3.3.4.2, 3.3.4.2

概要, 3.2.12

定義, 4.1.6.1

ストップワード, 3.3.4, 3.3.4.2

概要, 3.2.12, 4.1.5

大/小文字区別, 4.1.8.1.1

記憶域

概要, 3.3.1

STORE_SQEプロシージャ, 4.2.7, 4.2.7.1 ストアド・クエリー式, 定義, 4.2.7.1 ストアド・クエリー式, 4.2.7 テキストの格納, 3.2.1

概要, 3.2.1.2

索引の構造, 3.5.3.1 構造化データ

追加, 8.1.2.6

削除, 8.1.2.6

セクション, 8.1.2.6

構造化問合せ

例, 3.3.6

管理型分類, 6.4

意思決定ツリー, 6.4.1

SVM管理型分類, 6.4.2

メモリー要件, 6.4.2

RECREATE_INDEX_ONLINEによるスワップおよび非スワップ, 3.4.4.1 SYN演算子, 10.2.1 sync_indexのロック・パラメータ, 3.5.2.3 sync_indexのmaxtimeパラメータ, 3.5.2.2 SYNC_INDEXプロシージャ, 2.3 索引の同期化, 2.3 索引の同期化, 3.5.2, 12.6

パフォーマンスの向上, 7.9

シノニム

定義, 10.2.1

T

talking pillow, A.1

テンプレートによる問合せ, 4.2.6, 4.3.1

テンプレート, 4.1.13

クエリー・リライト, 4.1.14

テキスト列

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

TEXT形式列の値, 3.2.2.2 テキストのハイライト表示, 5.1.1 テキスト記憶域, 3.2.1 テーマ機能

追加, 10.4.1

テーマのハイライト表示, 5.1.2 テーマ・サマリー

定義, 5.2

テーマ

索引付け, 3.2.8.1

THEMESプロシージャ, 5.2.1 シソーラスを使用した問合せ

概要, 4.1.11

シソーラス

概要, 10.1

ナレッジ・ベースに追加, 10.3.2

大/小文字区別, 10.1.2

デフォルト, 10.1.4

DEFAULT, 10.1.4

用語の定義, 10.2

階層関係, 10.2.2

カスタムのロード, 10.3.1

演算子, 10.1.1.2

提供される, 10.1.5

アプリケーションでの使用, 10.3

シソーラス演算子, 4.2.5 スループット

問合せの向上, 7.2

ティルデ

文字の索引付け, 3.2.8.2

TOKEN_INFO, 12.4 TOKEN_TYPE, 12.4 トレース, 7.4 TRAINプロシージャ, 6.4 問合せのチューニング

レスポンス時間, 7.1

スループット, 7.2

結果バッファ・サイズの増加, 7.6

U

ウムラウト

文字の索引付け, 3.2.8.2

非管理型分類, 6.5 索引更新のパフォーマンス

FAQ, 7.9

アプリケーションのアップデート, 13 URL_DATASTORE

概要, 3.2.1.8

例, 3.3.2.1.3

URL

格納, 3.2.1.4

ユーザー

Oracle Textユーザーの作成, 2.2

システム定義, 12.1

USER_DATASTORE, 3.1.7

概要, 3.2.1.8

USER_FILTER, 3.2.2.3

V

VARCHAR2列, 3.2.1.1

索引および問合せの表示情報, 12.4

索引のサイズの表示, 12.4

ビュー

索引付け, 3.1.7

マテリアライズド

W

ワイルド・カード演算子, 4.2.5

パフォーマンスの向上, 7.7.13

WITHIN演算子, 3.3.3 ウィザード

Oracle Textアドイン, 2.3.1, A, B

ワード問合せ, 4.1.4

大/小文字区別, 4.1.8.1

ワードリスト

概要, 3.3.1

X

XML DB, 1.5

XMLドキュメント

属性検索, 8.3.2

ドキュメント・タイプ別のセクション, 8.3.3

索引付け, 8.1.1.1

セクション検索, 8.3

XMLの検索, 1.5 XML_SECTION_GROUPオブジェクト, 8.1.1.1

Z

ゾーン・セクション

定義, 8.1.2.1

ネストされた, 8.1.2.1.3

オーバーラップ, 8.1.2.1.2

繰返し, 8.1.2.1.1

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2014, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。