この章の内容は次のとおりです。
この章では、Oracle Text開発者ユーザー・アカウントの作成方法、および単純なテキスト問合せアプリケーションとカタログ・アプリケーションの作成方法の基本情報を提供します。また、各アプリケーション・タイプで表のロード、索引付けおよび問合せに使用する基本的なSQL文の情報も提供します。
詳細なアプリケーションの例は、「付録」に記載されています。ドキュメント分類アプリケーションの作成方法の詳細は、第6章「Oracle Textでのドキュメントの分類」を参照してください。
注意: この章では、読みやすさと、テキストの切取りおよび貼付けの便宜のために、SQL> プロンプトを省略しています。 |
Oracle Text索引を作成して、Oracle Text PL/SQLパッケージを使用する前に、CTXAPP
ロールを持つユーザーを作成する必要があります。このロールを使用すると、次の操作を実行できます。
Oracle Textの索引プリファレンスの作成および削除
Oracle TextのPL/SQLパッケージの使用
Oracle Textアプリケーション開発者ユーザーを作成するには、システム管理者ユーザーとして次の手順を実行します。
次のSQL文で、パスワードmyuser_password
を持つ、MYUSER
というユーザーを作成します。
CREATE USER myuser IDENTIFIED BY myuser_password;
次のSQL文で、必要なロールRESOURCE
、CONNECT
およびCTXAPP
をMYUSER
に付与します。
GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;
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;
基本的なテキスト問合せアプリケーションでは、ユーザーが問合せワードまたは句を入力すると、アプリケーションは、問合せに最も一致するドキュメントのリストを戻します。このようなアプリケーションでは、CONTEXT
索引が作成され、CONTAINS
を使用してこの索引の問合せが行われます。
この例では、テキスト表のロード、ドキュメントの索引付けおよび索引の問合せを行う、基本的なSQL文を示します。
通常は、問合せアプリケーションにはユーザー・インタフェースが必要です。CONTEXT
索引タイプを使用してこのような問合せアプリケーションを作成する方法の例は、付録Aにあります。
表を作成する前に、ユーザーのIDが作成されていることを前提とします。
CONNECT myuser;
次の例では、CREATE
TABLE
文を使用して、id
列およびtext
列を持つdocs
という表を作成します。この例では、id
列を主キーとしています。text
列は、VARCHAR2
です。
CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));
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を使用して、表をまとめてロードすることもできます。
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タグ内を検索して、フォント情報などの不要なマークアップを索引から削除できます。
まず、読みやすいように、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>
実際のアプリケーションでは、問合せの語句がハイライト表示された状態で、選択したドキュメントをユーザーに表示することがあります。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.
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>
Oracle Textでは、Oracle JDeveloper用のOracle Text Wizardのアドオンを使用して、単純なテキストおよびカタログWebアプリケーションを作成できます。ウィザードは、Oracle用に構成されたApache Webサーバーで使用できるJava Server PagesまたはPL/SQLサーバー・スクリプトを自動的に生成します。
JDeveloperおよびText Wizardは、OTN(Oracle Technology Network)から無料でダウンロードできます。
最新のJDeveloperソフトウェアは、次のURLにあります。
http://www.oracle.com/technology/software/products/jdev
例については、「JSP Webアプリケーションの作成」を参照してください。
Text Wizard、Catalog WizardおよびClassification Wizardのアドインは、次のURLにあります。
Oracle Text Wizardの使用、およびWebサーバー環境で実行するためのJSPファイルの設定の説明は、次のURLを参照してください。
http://www.oracle.com/technology/software/products/text
「Text Search Wizard for JDeveloper」リンクを参照してください。
この例は、カメラやCDプレーヤなどの電子機器を販売するオークション・サイトのカタログ索引を作成します。毎日新しい在庫が追加され、品目の説明、入札日および価格をまとめて格納する必要があります。
アプリケーションは、複合問合せに対して適切な時間で応答する必要があります。適切なCTXCAT
索引を作成するために、ユーザーが頻繁に検索する列を判断することが重要です。このタイプの索引の問合せは、CATSEARCH
演算子を使用して入力されます。
CTXAPP
ロールを持つmyuser
ユーザーとして接続します。
CONNECT myuser;
在庫を格納するAuction表を設定します。
CREATE TABLE auction( item_id NUMBER, title VARCHAR2(100), category_id NUMBER, price NUMBER, bid_close DATE);
図2-1に、この表を示します。
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を使用して、表をまとめてロードすることもできます。
検索される可能性のある基準を判断します。この例では、すべての問合せが品目の説明のタイトル列を検索し、ほとんどの問合せが価格順になっているかどうかを判断します。後でCATSEARCH
演算子を使用するときに、テキスト列の語句および構造化句の基準を指定します。
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に、サブ索引と列の関係を示します。
結合されたカタログ索引は、CREATE
INDEX
を使用して、次のようにAUCTION
表に作成します。
CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset');
図2-1に、CTXCAT
索引およびサブ索引と列の関係を示します。
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
新しい行を追加することで、カタログ表を更新します。カタログ表を更新すると、変更を反映するために、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.
追加された行が、問合せにただちに表示されます。
分類アプリケーションでは、ドキュメントの内容に基づいてアクションが実行されます。アクションには、ドキュメントへのカテゴリIDの割当てや、ユーザーへのドキュメントの送信などがあります。その結果、ドキュメントが分類されます。
ドキュメントは、事前に定義されたルールに従って分類されます。これらのルールは、カテゴリに対して選択されます。たとえば、'presidential elections'という問合せルールは、政治に関するカテゴリに対してドキュメントを選択します。
Oracle Textでは、複数のタイプの分類を提供しています。ここで説明する単純な分類、つまりルールベースの分類では、ドキュメント・カテゴリおよびドキュメントを分類するためのルールを作成します。管理型分類では、提供されたトレーニング・ドキュメントのセットからルールが導出されます。クラスタ化では、Oracle Textによりルールおよびカテゴリが導出され、すべての処理が自動的に実行されます。(分類の詳細は、「ドキュメント分類の概要」を参照してください。)
Oracle Textを使用してドキュメントの内容を簡単に分類するには、ルールを作成します。ルールとは基本的に、ドキュメントの内容をカテゴリ化する問合せの表です。CTXRULE
索引でこれらのルールを索引付けします。テキストの着信ストリームを分類するには、SELECT
文のWHERE
句でMATCHES
演算子を使用します。分類アプリケーションの一般的なフローは、図2-2を参照してください。
次の例では、CTXAPP
ロールを持つmyuser
ユーザーによる簡単なカテゴリの定義、CTXRULE
索引の作成、およびMATCHES
の使用について説明します。
CTXAPP
ロールを持つmyuser
ユーザーとして接続します。
CONNECT myuser;
ルール表を作成して、問合せルールを移入する必要があります。この例では、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');
次のように、CTXRULE
索引を作成します。
CREATE INDEX queryx ON queries(query_string) INDEXTYPE IS CTXSYS.CTXRULE;
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と一致します。この分類では、特定の表へのドキュメントの書込みや、ユーザーへの電子メール送信などのアクションを実行できます。