この章の内容は次のとおりです。
Oracle Textを使用すると、テキスト問合せアプリケーションおよびドキュメント分類アプリケーションを作成できます。Oracle Textには、テキストに対する索引付け機能、ワードとテーマの検索機能および結果表示機能が備わっています。
Oracle Textアプリケーションを設計するには、まず実行する問合せのタイプを決定します。問合せのタイプを決定することで、タスクに最も適した索引を選択できます。
Oracle Textにおける、アプリケーションの次の3つのカテゴリについて考えます。
テキスト問合せアプリケーションを使用すると、ユーザーは、Webサイト、デジタル・ライブラリ、ドキュメント・ウェアハウスなどのドキュメント・コレクションを検索できます。通常、コレクションは静的で、最初に索引付けを実行した後に内容が大幅に変更されることはありません。ドキュメントのサイズは任意であり、HTML、PDF、Microsoft Wordなどの多様な形式を使用できます。これらのドキュメントは、ドキュメント表に格納されます。検索を可能にするには、ドキュメント・コレクションを最初に索引付けします。
通常、問合せはワードまたは句で構成されます。アプリケーション・ユーザーは、OR
やAND
などの演算子を使用して、ワードおよび句の論理的な組合せを指定できます。ステミング、近接検索、ワイルド・カード操作など、その他の問合せ操作を使用すると、検索結果が改善されます。
このタイプのアプリケーションでは、無関係なドキュメントをできるかぎり取り出さないようにしながら、問合せに関連するドキュメントを取り出すことが重要です。最も関連のあるドキュメントが、結果リストの上位にランク付けされる必要があります。
このタイプのアプリケーションの問合せには、ドキュメント表に対するCONTEXT
索引が最も適しています。この索引への問合せでは、アプリケーションは、SQL
SELECT
文のWHERE
句でCONTAINS
演算子を使用します。
ドキュメント・コレクションに対する典型的なテキスト問合せアプリケーションでは、ユーザーが問合せを入力できるようになっています。アプリケーションはCONTAINS
問合せを入力し、その問合せを満たすドキュメントのリスト(ヒットリスト)を戻します。問合せの結果は通常、関連性の度合によってランク付けされています。アプリケーションでは、ヒットリスト内の1つ以上のドキュメントを表示できます。
たとえば、アプリケーションでWorld Wide Web上のURL(HTMLファイル)を索引付けすることにより、索引付けされた一連のURL内での問合せ機能が提供されます。この場合、問合せアプリケーションにより戻されるヒットリストは、ユーザーがアクセスできるURLで構成されます。
図1-2は、単純な問合せアプリケーションとユーザーとの対話方法をフローチャートで示しています。
ユーザーが問合せを入力します。
アプリケーションがCONTAINS
問合せを実行します。
アプリケーションがヒットリストを表示します。
ユーザーがヒットリストからドキュメントを選択します。
アプリケーションがドキュメントを表示します。
カタログ情報は、オンライン書店やオークション・サイトなどの在庫タイプ情報で構成されます。格納される情報は、本のタイトルや関連する構造化情報(価格など)のようなテキスト情報で構成されます。通常は、在庫に関してオンライン・カタログを最新の状態にしておくため、この情報は定期的に更新されます。
問合せは、通常、テキスト・コンポーネントと構造化コンポーネントとの組合せです。ほとんどの場合、問合せの結果は、日付や価格などの構造化コンポーネントでソートされます。このタイプの問合せアプリケーションでは、応答時間を短くすることが常に重要です。
カタログ・アプリケーションには、CTXCAT
索引が最も適しています。SELECT
文のWHERE
句でCATSEARCH
演算子を使用して、この索引を問い合せます。
図1-3に、カタログ表、CTXCAT
索引、およびCATSEARCH
演算子を使用して索引の問合せを行うカタログ・アプリケーションの関係を示します。
カタログ・アプリケーションを使用すると、ユーザーは、カタログ内の特定の品目を検索できます。たとえば、オンライン・ストア・アプリケーションを使用すると、ユーザーは、在庫内の品目を検索して購入できます。通常、ユーザー問合せは、テキスト記述を検索するテキスト・コンポーネントと、その他いくつかの順序付け基準(価格や日付など)で構成されます。
図1-4に、オンライン電子ストアにおける、カタログ問合せアプリケーションのフローチャートを示します。
ユーザーが、テキスト・コンポーネント(cd playerなど)および構造化コンポーネント(order by priceなど)で構成される問合せを入力します。
アプリケーションがCATSEARCH
問合せを実行します。
適宜並べ替えられた結果が表示されます。
ユーザーが結果をブラウズします。
ユーザーが別の問合せを入力するか、品目の購入などのアクションを実行します。
ドキュメント分類アプリケーションでは、着信ストリームまたはドキュメントのセットを、事前定義されたルールのセットと比較します。ドキュメントが1つ以上のルールと一致した場合、アプリケーションはアクションを実行します。
たとえば、ニュース記事の着信ストリームがあるとします。この場合、「金融」のカテゴリを表すルールを定義できます。ルールとは、基本的に、「金融」を主題としたドキュメントを選択する、1つ以上の問合せです。たとえば、ルールは、'stocks or bonds or earnings'などの形式になります。
ウォール・ストリートの収益予測に関するドキュメントが到着し、このカテゴリのルールを満たしている場合、アプリケーションは、ドキュメントに「金融」のタグを付けたり、複数のユーザーに電子メールで送信するなどのアクションを実行します。
ドキュメント分類アプリケーションの作成には、ルールの表を作成してから、CTXRULE
索引を作成します。テキストの着信ストリームを分類するには、SELECT
文のWHERE
句でMATCHES
演算子を使用します。分類アプリケーションの一般的なフローは、図1-5を参照してください。
XML検索アプリケーションは、XMLドキュメントで検索を実行します。通常のドキュメント検索では、ドキュメントのセットを検索して、テキスト述語を満たすドキュメントを戻します。XML検索では、通常はXMLドキュメントの構造を使用して、検索を制限します。通常は、検索を満たすドキュメントの一部のみが戻されます。たとえば、electricというワードを含むすべての購買依頼を検索するのではなく、ユーザーは、コメント・フィールドにelectricを含む購買依頼のみを必要とする場合があります。
Oracle Textを使用すると、次のアプローチによってXML検索を実行できます。
CONTAINS
演算子は構造化検索に最適であり、WITHIN
、HASPATH
およびINPATH
の各演算子を使用して制限検索を実行できます。CONTEXT
索引を使用する場合、Oracle Text検索の次の特性も利用できます。
トークンベースで空白が正規化された検索
関連性の度合によってランク付けされたヒットリスト
大/小文字を区別した検索
セクション検索
ステミング検索やファジー検索などの言語機能
大きいドキュメント・セット向けにパフォーマンスが最適化された問合せ
Oracle XML DBを使用して、XMLType
列にXMLドキュメントをロードします。Oracle XML DBを使用したXML検索は、通常、existsNode()
、extract()
またはextractValue()
問合せ内のXPATH
式で構成されます。このタイプの検索の特徴は、次のとおりです。
日付と数値に等値および範囲を使用した非テキスト検索
すべての文字が同じものとして処理される、文字ベースの文字列検索
このタイプの検索の不都合な点は、次のとおりです。
特別な言語処理を行いません。
完全一致を使用するため、関連性という概念がありません。
次のようなワイルド・カード操作などの検索には、非常に時間がかかる場合があります。
WHERE col1 like '%dog%'
全テキスト検索を実行するアプリケーションのためにOracle Textの機能とOracle XML DBを結合して、「Pentiumというワードを含むすべてのノードを検索」などの問合せを入力することで、XML構造を利用できます。これは、次に示す2つの方法のいずれかで実行できます。
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;
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()
のパフォーマンスが向上します。