...

DB2 UDB テキスト情報エクステンダー JAVA サンプル・プログラム

by user

on
Category: Documents
11

views

Report

Comments

Transcript

DB2 UDB テキスト情報エクステンダー JAVA サンプル・プログラム
DB2 UDB
テキスト情報エクステンダー
JAVA サンプル・プログラム
z
日本アイ・ビー・エム株式会社
大和ソフトウェア開発研究所 (YSL)
情報マネジメント技術
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
Version 1.0 (2002 年 2 月)
(C)Copyright International Business Machines Corporation 2002 All rights reserved.
本ドキュメントの内容は、日本アイ・ビー・エム株式会社の文書による同意なく、一部または全部の無断転載、
無断複写を禁止いたします。また、内容は予告なく変更することがあります。
本ドキュメントの内に記述されたサンプル・プログラム、及び別途提供されたサンプル・プログラムに関しては、
稼動検証は行っておりますが’AS IS’の形で提供されるものですので、稼動や内容を保証するものではありま
せん。
次のものは、IBM Corporation の商標です。
DB2
WebSphere
ThinkPad
PowerPC
pSeries
IntelliStation
NetVista
"Pentium" "Celeron" "Xeon" は Intel Corporation の米国およびその他の国における商標です。
"Windows" は Microsoft Corporation の米国およびその他の国における商標です。
Java およびすべての Java 関連の商標およびロゴは Sun Microsystems, Inc. の米国およびその他の国における商標ま
たは登録商標です。
他の会社名、製品名およびサービス名等は、それぞれ各社の商標または登録商標です。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
3
目次
目次 __________________________________________________________________________________ 4
はじめに_______________________________________________________________________________ 6
本書について_________________________________________________________________________ 6
本書の構成 __________________________________________________________________________ 6
本書の使用方法 ______________________________________________________________________ 6
本書の読み方 ________________________________________________________________________ 7
第1章
概要 ________________________________________________________________________ 8
DB2 テキスト情報エクステンダー ________________________________________________________ 8
索引 ________________________________________________________________________________ 9
コード・ページ________________________________________________________________________ 10
第2章
実行環境のセットアップ ________________________________________________________ 11
実行環境 ___________________________________________________________________________ 11
サンプル・プログラム実行時の注意点 ____________________________________________________ 11
DB2 UDB の JDBC2.0 対応__________________________________________________________ 11
サンプル・プログラムの保存先について __________________________________________________ 11
コマンド実行ディレクトリについて _______________________________________________________ 11
サンプル・プログラム実行権限 _________________________________________________________ 11
セキュリティに関して _________________________________________________________________ 11
セットアップ _________________________________________________________________________ 12
データベースの作成__________________________________________________________________ 12
環境変数の設定_____________________________________________________________________ 12
データベースを検索に使用可能にする___________________________________________________ 13
DB2 テキスト情報エクステンダーの開始 ________________________________________________ 13
第3章
DB2 テキスト情報エクステンダーの使用方法 ______________________________________ 14
テキスト・データの検索 ________________________________________________________________ 14
準備 ______________________________________________________________________________ 14
シナリオ 1. 指定した単語を含む文書の検索 ____________________________________________ 16
シナリオ 2. 検索語の大文字小文字を区別する検索 ______________________________________ 25
シナリオ 3. ブール演算子‘ & (AND)’,‘ | (OR)’,‘NOT’を利用する検索 ______________________ 27
4
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 4. ファジー検索 _____________________________________________________________ 33
シナリオ 5. 用語の一部の検索________________________________________________________ 36
シナリオ 6. 関連用語の検索(シソーラス検索) ____________________________________________ 40
構造化文書の検索 ___________________________________________________________________ 44
準備 ______________________________________________________________________________ 44
シナリオ 7. HTML文書のセクション検索________________________________________________ 47
シナリオ 8. XML 文書のセクション検索 ________________________________________________ 49
第4章
Web アプリケーションによる利用 ________________________________________________ 50
準備 実行環境のセットアップ___________________________________________________________ 51
DB2 テキスト情報エクステンダー Web 検索エンジン _______________________________________ 53
シナリオ
Web アプリケーションによる利用例 ____________________________________________ 53
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
5
はじめに
本書について
本書では、テキスト・データを検索するために、DB2(R)データベースを準備および保守するにあたって、DB2
テキスト情報エクステンダーを利用する方法を示します。さらに、DB2 テキスト情報エクステンダーに備わって
いる SQL 関数を利用する JAVA プログラムを用いて、検索方法や利用方法を示します。本書を理解するため
には、DB2 UDB、DB2 テキスト情報エクステンダーの基礎知識が必要です。また、必要に応じて、DB2 UDB、
DB2 テキスト情報エクステンダー本体と同時にインストールされるユーザーズガイド(ファイル名:
cteu0mst.pdf)を参照してください。
なお、本書で「DB2」に言及している場合、DB2 UDB を指しています。
本書の構成
本書は以下のように構成されています。
第1章
概要
DB2 テキスト情報エクステンダーに関する簡単な説明を示します。
また、セットアップ方法の説明を示します。
第2章
実行環境のセットアップ
サンプル・プログラム実行時の注意や、実行前に行う必要があるコマンドなどの説明を示します。
第3章
DB2 テキスト情報エクステンダーの使用方法
DB2 テキスト情報エクステンダーの検索方法・使用方法について、JAVA プログラムを使用して説
明を示します。
第4章
Web アプリケーションによる利用
Web ブラウザーを使用して DB2 テキスト情報エクステンダーを操作するサンプル・プログラムにつ
いて説明を示します。
本書の使用方法
3 章、4 章においては、想定されるシナリオと、それを解決するためのコマンドの実行方法、JAVA プログラム、
およびプログラムの解説が掲載されています。それぞれのシナリオ解決のためのコマンドやプログラムのサン
プルが必要な場合はそれに応じた項目を参照してください。
6
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
本書の読み方
DB2 コマンド・ウィンドウ上で実行する処理はテキスト・ボックス内に記述されています。コマンド・プロンプトは
記号 > で表示しています。コマンド・プロンプト > で始まる行はコマンド・プロンプトへの入力を表します。フォ
ルダ tiesmpl のサブフォルダでの実行が必要な場合はコマンド・プロンプトを サブフォルダ名> と表記してい
ます。
例)
cmd> setup.cmd
この場合は > cd cmd で本書に付随しているフォルダ “tiesmpl”のサブフォルダ “cmd” に移動してから
上記コマンドを実行してください。
テキスト・ボックスの大きさの都合上、実行するコマンドが複数の行にわたっている場合がありますが、コマン
ドを実行する際には改行する必要はありません。また、コマンドの終了を明確にするため、結果の出力がある
場合は改行しています。また、特に指定がない場合は、コマンドの実行は配布されたフォルダのパス上で実
行してください。(C:\tiesmpl\ での実行を想定しています。)
JAVA プログラム・ソースを出力する場合は水平線で区切られています。掲載されている JAVA サンプル・プロ
グラムの内容は本書に付随してあるサンプル・プログラムと同じです。必要に応じて参照してください。
tiesmpl フォルダとサブフォルダの構成は以下のようになっています。
tiesmpl - + - cmd
主にセットアップで使用する cmd ファイルなどがあります。
+ - data
サンプルで使用したデータがあります。適宜参照してください。
+ - source
第 3 章で使用する Java プログラムのソースファイルがあります。
+ - web
第 4 章で使用する ear ファイルとそれを構成したファイルがあります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
7
第1章 概要
DB2 テキスト情報エクステンダー
DB2 テキスト情報エクステンダーは、DB2 に保存されている構造化されていない文書に検索専用のテキスト
索引を作成し、利用することで短時間にデータベース内の文書の検索を実行することができます。
DB2 エクステンダーには、同様の機能を持つものとして DB2 テキスト・エクステンダーがあります。DB2 テキ
スト・エクステンダーにおけるいくつかの各国語特有の機能や検索機能を省き、設定を簡略化して使用を容易
にしたものが DB2 テキスト情報エクステンダーです。日本語に関しては、テキスト情報エクステンダーはテキ
スト・エクステンダーと同等の機能を提供します。具体的には’発音の似た語の検索’や’境界検索’などの機
能が削除されました。DB2 テキスト情報エクステンダーは多様な方法で検索することができます。代表的な機
能を以下に述べます。
・
特定のテキストが含まれている文書の検索、あるいは近接する検索用語が含まれている文書の検索
SQL の like ステートメントを利用する場合よりも、より柔軟にテキスト・データの検索を実行することができ
ます。Like ステートメントを使用した検索を行った場合、大文字、小文字を区別する検索しかできない、検
索対象となるデータすべてを検索してしまう、DBCS と SBCS が混在している場合に文字の区切りが判別
できないなどの問題があります。テキスト情報エクステンダーではこれらの問題を解決した検索の実行が
可能です。さらに検索のためにいくつかの機能が追加されています。詳細については、索引についての
説明および第 3 章を参照してください。
・
HTML・XML 形式の文書の検索
構造化文書に対して文書モデルを指定することで、指定したタグにある単語に限定した検索語の検出を
行うことが可能です。詳細については 第 3 章 構造化文書の検索 を参照してください。
・
検索語と似たつづりの語のファジー検索
検索語と完全に一致しない文字列をあいまいに検索する場合に使用します。正確度を指定することで、
検索する文字の確からしさを変更することができます。この検索は、綴りを間違った単語の検索などに使
用することができます。第 3 章 ファジー検索 を参照してください。
・
意味的に似た用語の検索(シソーラス検索)
検索語を直接指定しなくとも、ある単語に似た意味の単語を検索することができます。この検索を行うた
めには、文字ごとの関係を記述した定義ファイルが必要です。詳細は第 3 章 シソーラス検索 を参照して
ください。
・
指定したタグ内同一セクションにある用語の検索(セクション検索)
セクションに対しての検索をかけることが可能です。この機能を利用することで、テキスト・データに対して
より条件を絞った検索を実行することができます。
・
検索語の出現頻度などによる結果順序の入れ替え
検索語の出現頻度、出現数によって結果の出力順序を整えることができます。第 3 章 ブール演算子を
利用した検索 を参照してください。
8
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
索引
文書を高速に検索するために作成します。DB2 に保存した各テキスト・データに対して索引付けをすることで、
DB2 の LIKE ステートメントなどを使用した文書全体の順次検索を実行するよりも効率の良い検索を可能にし
ます。
以下に本書のサンプル・データを用いて LIKE ステートメントを使用した場合と、DB2 テキスト情報エクステンダ
ーによる索引を使用した場合のコストの違いについて VisualExplain※を用いて示します。実際にこのコマンド
を実行する場合は、第 2 章および第 3 章のセットアップを実行している必要があります。
検索を実行した表は texttbl です。この表の詳細、およびコマンドの説明は第 3 章を参照してください。
次ページ左図は SQL 文:
select ID,NAME from texttbl where description like '%ThinkPad%' を実行した結果です。
次ページ右図は SQL 文:
select ID,NAME from texttbl where contains (description,'("thinkpad")')=1 を実行した結果です。
LIKE ステートメントを用いた検索では、テキスト・データのどの位置にあってもヒットさせるために両端に‘%’を
追加しています。また、LIKE ステートメントを用いた検索では大文字小文字の区別を行うため、’ThinkPad’
の T および P も大文字である必要があります。これに対して DB2 テキスト情報エクステンダーで検索を行う
場合、特に指定しない場合は大文字、小文字の区別をすることなく検索を実行するので、上記の SQL 文を実
行します。
図に表示されているように、合計コストは LIKE ステートメントを使用したもので 167.13、DB2 テキスト情報エク
ステンダーを使用したもので、11.00 となっています。
このように、DB2 テキスト情報エクステンダーを利用することで、容易にかつ高速に検索を実行することが可
能になります。
※ VisualExplain
SQL を実行することで、アクセスプラングラフを表示し、さらにその検索を実行するのにかかるコストを表
示します。実行するには以下のようにします。
「コントロールセンター」 → SQL を実行する「データベース」を右クリック → 「SQL の Explain…」
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
9
LIKE ステートメントによる検索
索引を利用した検索
<参考>
英語・数字と日本語では索引の作成方法が違います。文書中に英単語または数字が出てきた場合はそれだ
けで独立して単語の区切り単位で索引が作成されますが、日本語の場合は文書に単語ごとの区切りがない
ため、文字の連鎖に注意して索引が作成されます。
索引に関する説明は‘第 3 章シナリオ 5 用語の一部の検索’を参照してください。
コード・ページ
文書の索引を作成できるのは、そのコード・ページがサポートされている場合に限ります。
また、文書データを保管する場合、DB2 は各文書のコード・ページが実行中のアプリケーション環境と同じで
あるとみなし、文書のコード・ページをデータベースのコード・ページに変換します。
詳細についてはテキスト情報エクステンダー付属のユーザーズガイド(cteu0mst.pdf)を参照してください。
10
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
第2章 実行環境のセットアップ
実行環境
本書は以下の環境でプログラムの実行、確認を行っています。
OS : Microsoft Windows2000 Professional SP2
DB2 : DB2 Universal Database V7.2 (以下 DB2 UDB)
DB2 テキスト情報エクステンダー
: DB2 テキスト情報エクステンダー V7.2
Web アプリケーション・サーバー :
WebSphere Application Server V4.0 アドバンスド版 (以下 WAS)
Web サーバー : IBM HTTP Server 1.3.19
Web ブラウザー : Internet Explorer6.0 (以下 IE)
(※WAS, IBM HTTP Server、IE は’第 4 章 Web アプリケーションによる利用’の実行時にのみ必要です)
サンプル・プログラム実行時の注意点
DB2 UDB の JDBC2.0 対応
本書では JDBC2.0 を利用しています。DB2 UDB が JDBC2.0 に対応している必要があります。次の bat ファイ
ルを実行してください。 DB2_install_root¥sqllib\java12\usejdbc2.bat
サンプル・プログラムの保存先について
サンプル・プログラムは C:\tiesmpl に保存されることを前提としています。テキスト・ボックス中のコマンドは、
サンプル・プログラムのディレクトリに移動して実行してください。
コマンド実行ディレクトリについて
テキスト・ボックス中の記号 ‘>’ はコマンド・プロンプトを意味し、実際の表示は環境により異なります。コマン
ド・プロンプトが ‘>’ と表記されている場合は実行時のフォルダに特に制限はありません。 ‘folder_name>’
と表記されている場合は tiesmpl フォルダのサブフォルダ folder_name に移動して実行してください。
サンプル・プログラム実行権限
第 3 章 DB2 テキスト情報エクステンダーの使用方法においては、ユーザー名 DB2ADMIN での実行を想定し
ています。
セキュリティに関して
サンプル・プログラムでは、全ての作業を一つのユーザーID DB2ADMIN で行っています。セキュリティの管理
が求められる環境では、文書登録用、更新用、検索用などの用途ごとにユーザー権限を設定して、各種ユー
ザー権限で実行する必要があります。また、第 4 章については、DataSource として登録するユーザー権限の
設定を行うと同時に、Web アクセス制御を行ってセキュリティを高める必要があります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
11
セットアップ
DB2 テキスト情報エクステンダーを使用するためには、DB2 UDB にデータベースが存在し、環境変数にデフ
ォルト値が設定されていて、データベースが検索可能であり、DB2 テキスト情報エクステンダーが開始してい
る必要があります。これらの作成方法・設定方法は以下のとおりです。
以下の操作は、サンプル・プログラムに付属のコマンド・ファイル‘setup.cmd’を実行することで以下のセット
アップ動作を省略することが可能です。
cmd> setup.cmd
<実行ログの出力(省略)>
[注意]
事前に一度表や索引を作成している場合はそれらを削除する必要があります。cleanTie.cmd を実行するか以
下のコマンドを実行してください。結果の表示は省略します。
cmd> cleanTie.cmd
cleanTie.cmd を使用しない場合は以下のコマンドを順次実行してください。
>
>
>
>
>
>
>
>
>
>
db2 connect to TIESAMP
db2text start
db2text drop index texdex for text
db2text drop index htmdex for text
db2text disable database for text
db2text stop
db2 drop table htmltbl
db2 drop table texttbl
db2 terminate
db2 drop database TIESAMP
データベースの作成
サンプルの稼動のためにデータベースを作成します。次のコマンドを DB2 UDB コマンド・ウィンドウ上で実行し
ます。
> db2 create database TIESAMP
DB20000I
CREATE DATABASE コマンドが正常に終了しました。
環境変数の設定
環境変数として DB2 テキスト情報エクステンダーのデフォルト値を設定します。
デフォルト値の設定をしていない場合や、DB2 において複数のデータベースを使用していて環境変数を変更
できない場合などは、コマンドを実行する時にデータベース名を明示的に指定する必要が生じます。
本書では環境変数を以下のように設定した場合のコマンドを掲載しています。
12
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
本書では環境変数を以下のように設定している場合のコマンド実行例を示します。
ここで、DB2INSTANCE の値は DB2 UDB をインストール時にシステムの環境変数に設定されています。特に
変更していない場合は設定をする必要はありません。
> set DB2DBDFT=TIESAMP
> set DB2INSTANCE=DB2
または、「コントロールパネル」 → 「システム」 → 「詳細」 → 「環境変数」 に登録することで、毎回実行す
る必要がなくなります。
DB2DBDFT
TIESAMP
DB2INSTANCE
DB2
[注意]
テキスト情報エクステンダーは OS の環境変数 DB2DBDFT を参照しているので db2set コマンドではなく set コ
マンドで環境変数を設定する必要があります。環境変数 DB2DBDFT の設定をしていない場合、db2text コマン
ド発行時に “CTE0139 環境変数 "DB2DBDFT" が設定されていません。”というエラーメッセージが表示さ
れることがあります。(db2text enable … / db2text update index… などのコマンド実行時)
この場合はコマンド・パラメーターとして“CONNECT TO <DB_name>”を適宜追加してください。
(例)
> db2text enable database for text CONNECT TO TIESAMP
データベースを検索に使用可能にする
> db2text enable database for text
CTE0001 操作が正常に完了しました。
DB2 テキスト情報エクステンダーの開始
以下のコマンドで、DB2 テキスト情報エクステンダーを開始します。
DB2 テキスト情報エクステンダーを開始することで、テキスト索引を利用した検索を実行可能にします。
DB2 テキスト情報エクステンダーを開始するには、DB2 インスタンス所有者のユーザーID でログオンし、以下
のコマンドを実行します
> db2text start
CTE0001 操作が正常に完了しました。
[注意]
DB2 テキスト情報エクステンダーを使用する場合は必ず開始されている必要があります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
13
第3章 DB2 テキスト情報エクステンダーの使用方法
本章では JAVA サンプル・プログラムを使用して、DB2 テキスト情報エクステンダーの機能や使用方法などの
説明を行います。サンプルの JAVA プログラムは実行した SQL 文を出力するので、それぞれの検索方法別の
SQL 文についても理解することができます。ここでは以下のシナリオを考えます。
テキスト・データの検索
準備
サンプル・プログラムを実行するために表と索引を作成します。
シナリオ 1
指定した単語を含む文書の検索
シナリオ 2
検索語の大文字小文字を区別する検索
シナリオ 3
ブール演算子‘& (AND)’‘ | (OR)’‘NOT’を使用する検索
シナリオ 4
ファジー検索
シナリオ 5
用語の一部(文字マスキングを利用)の検索
シナリオ 6
関連用語の検索(シソーラス検索)
構造化文書の検索
準備
サンプル・プログラムを実行するために表と索引を作成します。
シナリオ 7
HTML データの検索
シナリオ 8
XML データの検索
テキスト・データの検索
ここでは DB2 テキスト情報エクステンダーを使用した検索を行う場合の検索オプション、SQL 文の書き方につ
いて、それを実行する JAVA プログラムを使用して説明します。
具体的な内容は以下のとおりです。
DB2 UDB のデータベース TIESAMP にテキスト・データを表 txttbl に保管され、表 textbl は一意性を保証する
主キーとして ID、文書の名前として NAME、テキスト・データの保存される列である DESCRIPTION の 3 つの列
を持ちます。列 description は IBM 製の Note 型 PC、DeskTop 型 PC、WorkStation の製品説明をテキスト・デ
ータとして格納してあります。テキスト・データの内容については tiesmpl フォルダのサブフォルダ data 以下の
テキスト・ファイルを参照してください。
準備
サンプル・プログラムを実行するためにデータベース TIESAMP に対して表 texttbl を作成し、さらにその表の検
索を可能にするために索引を作成します。
以下のコマンドを実行すれば、準備における以降のコマンドを実行する必要はありません。
cmd> setupSec3text.cmd
<ログの出力(省略)>
14
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
表の作成
表 texttbl を作成するために以下のコマンドを実行します。
cmd>
db2 –tf createTextTable.sql
表 texttbl : 作成開始
DB20000I SQL コマンドが正常に終了しました。
表 texttbl : データ挿入開始
DB20000I SQL コマンドが正常に終了しました。
表の内容を確認する場合、または表が作成されたことを確認するためには以下のコマンドを発行します。
スペースの都合上結果の出力については省略します。
> db2 select * from texttbl
索引の作成
次にこの表の索引を作成します。列 description の索引として texdex という名前で作成します。
> db2text create index texdex on texttbl(description) for text
CTE0001 操作が正常に完了しました。
この段階ではまだ空の索引が作成されただけなので、db2text の update コマンドを利用して索引の中身を作
成します。
>
db2text update index texdex for text
CTE0001 操作が正常に完了しました。
索引を作成した段階で列内の文書の追加や変更がなされるたびにログに情報を追加するためのトリガーが
作成されます。この情報により索引の同期を取ることが可能になります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
15
シナリオ 1. 指定した単語を含む文書の検索
PC の購入を考えているため、商品説明の掲載されているテキスト・データを獲得したいと思います。
まず、表 texttbl の持つデータの中で、“高性能”という単語を含むテキスト・データの検索を行います。この結
果を見て ThinkPad に対して興味を持ったので、“ThinkPad”という記述のあるテキスト・データはすべて検索に
ヒットさせるために、検索語に“ThinkPad”を追加しました。この検索を行うことで“高性能”か“ThinkPad”とい
う単語を含むテキスト・データの ID と NAME を検出します。
実行例
以下のコマンドでサンプル・プログラムをコンパイルした後にプログラムを実行します。
検索語となる引数は大文字小文字の区別をしません。
[注意]
サンプルファイルとは異なった名前でデータベースを作成している場合は、次のようにして実行して下さい。
> java –DdbName=‘データベースの名前’ ClassName TableName
(データベース名は直接入力してください。シングルクォートは必要ありません。)
source> javac SimpleQuery.java
source> java SimpleQuery texttbl
検索語を入力してください
: 高性能
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("高性能")')=1
ID
---------A0002
A0006
B0002
C0002
NAME
---------------------------------------ThinkPad R30
ThinkPad T23
NetVista M41
PowerPC-based WorkStation
4 レコードが選択されました
source> java SimpleQuery texttbl
検索語を入力してください
: 高性能 thinkpad
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("高性能", "thinkpad" )')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
B0002
C0002
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T23
NetVista M41
PowerPC-based WorkStation
<参考>
8 レコードが選択されました
16
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
<参考1>
テキスト情報エクステンダーの検索では、関数 contains を利用して、テキスト索引が作成されたテキスト・デー
タの検索を実行します。そのデータ中に検索語が含まれている場合、または検索引数に指定した関係が含ま
れている場合、INTEGER 値 1 を戻します。関数 contains はパラメーターとして列名と検索語を取ります。パラメ
ーターとして指定する列には索引が作成されていることが必要です。また、検索語を’,’(カンマ)で区切った場
合はそれらのうちのどれか一つを含んでいた場合にヒットします。
<参考 2>
表 texttbl は description 列にテキスト・データを格納しています。本シナリオではこの列に対して 2 つの検索を
実行しました。では具体的にテキスト・データの内容を確認して、正しく検索が行われていることを確認しましょ
う。
先ほどの検索の結果から、ID A0001 のテキスト・データは単語‘ThinkPad’は含んでいるものの、‘高性能’と
いう単語は含んでいないと考えられます。次に ID A0002 のテキスト・データを表示します。こちらのテキスト・
データは少なくとも‘高性能’という単語を含んでいるはずです。確認するには以下のコマンドを実行します。
> db2 select description from texttbl where id='A0001'
(結果 一部省略)
ThinkPad s30 その小さなボディ-・サイズからは想像もできないほどの、抜群のパワーとスタミナ
を秘めているリアル・モバイル、ThinkPad s30。超低電圧版モバイル PentiumIII 600MHz SpeedStep
テクノロジ対応に、20GB のハードディスク・ドライブ、内蔵ワイヤレス LAN または LAN 接続対応の
10/100Base-T ポートを標準装備、10.4 型 XGA TFT 液晶を搭載 話題の最新 OS、Windows XP Home Edition
をプリインストール。コンパクトな B5 サイズながらフルサイズ・キーボードを装備し、外装には、ピ
アノの光沢を思わせる『ミラージュ・ブラック』
(RAJ/R3J)
、または、ThinkPad の“伝統”を受け継
ぐ『ThinkPad ブラック』
(RRJ/R5J)を採用。ワイヤレス LAN モジュール内蔵モデル(RAJ/RRJ)
、イー
サネット・ポート装備モデル(R3J/R5J)ともに、通常使用時で約 6.7 時間、オプションの Full Day バ
ッテリーを使用すれば 10 時間のバッテリー駆動が可能という、理想的モバイル能力も実現しました。
(以下の出力中に検索語は出てこないので省略)
> db2 select description from texttbl where id='A0002'
ThinkPad R30 お求めやすいプライスも重要な“性能”。そんな高性能も備えたノート PC 、
ThinkPad R30。モバイル CeleronTM800MHz またはモバイル Pentium III 1GHz、15GB または 30GB ハー
ドディスク・ドライブ、内蔵ワイヤレス LAN または LAN 接続対応の 10/100Base-T ポートを標準装備、
14.1 型 XGA TFT 液晶を搭載 A4 サイズのボディーに、14.1 型 XGA TFT 液晶ディスプレイ、128MB メモリ
ー、56kbps モデム、イーサネットなど、ビジネス・ワークを支える多彩な機能を満載した ThinkPad
の新スタンダード、ThinkPad R30 。デスクトップ機にも代替し得る優れた基本性能に、新たな“使い
やすさ”を提案する『ウルトラベイ・プラス対応ウルトラベイ 2000』を装備。さらに、豊富なラインア
ップを揃え、お求めやすい価格でお届けします。 ThinkPad R30 は優れたエネルギー消費効率(現行
省エネ法の目標達成)国際エネルギースタープログラムの基準を満たしている省エネルギーを実現。プ
ラスチックに材料名の表示を行うなど、リサイクルを考慮した設計をしています。
(以下略)
上記の結果から、テキスト情報エクステンダーは列 description のテキスト・データを正しく検索していることが
確認できました。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
17
サンプル・プログラム
以下に本シナリオで実行した SimpleQuery.java を出力します。
SimpleQuery.java
import
import
import
import
java.util.*;
java.sql.*;
java.io.*;
java.lang.*;
class SimpleQuery {
public static void main(String argv[]) {
String usage = "Usage: java SimpleQuery tblname ";
Connection con = null;
try {
if (argv.length != 1) {
System.out.println(usage);
System.exit(1);
}
//JDBC ドライバーのロード
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
} catch (Exception e) {
System.err.println("\n Error loading DB2 Driver...\n" + e);
System.exit(1);
}
A
1
//環境設定
String tblname = argv[0];
2
String dbname = System.getProperty("dbName", "TIESAMP");
String url = "jdbc:db2:" + dbname;
con = DriverManager.getConnection(url);
//標準入力からの入力を得る
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String searchwords = "";
3
while (searchwords.length() == 0) {
System.out.print("検索語を入力してください
searchwords = br.readLine();
}
: ");
(続く)
18
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
(SimpleQuery.java 続き)
//入力されたパラメーターを整形
String words = "";
StringTokenizer st = new StringTokenizer(searchwords, "
boolean check = true;
while (st.hasMoreTokens()) {
if (!check)
words += "," + " \"" + st.nextToken() + "\" ";
else {
words = "\"" + st.nextToken() + "\"";
check = false;
}
}
");
//実行する SQL 文の作成
String sql =
"select id,name from "
+ tblname
+ " where contains (description,'("
+ words
+ ")')=1";
System.out.println("この検索を行うために以下の SQL 文が作成されました。\n" + sql);
B
//SQL の実行・結果の表示
ResultSet rs = null;
Statement stmt = null;
try {
int numOfHit = 0;
stmt =
con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
C
ResultSetMetaData rsmd = rs.getMetaData();
int ccnt = rsmd.getColumnCount();
int rbi[] = new int[ccnt];
for (int i = 0; i < ccnt; i++)
rbi[i] =
Math.max(rsmd.getColumnDisplaySize(i + 1), rsmd.getColumnName(i + 1).length());
//検索結果数のカウント
rs.last();
numOfHit = rs.getRow();
rs.beforeFirst();
//検索結果の出力
if (numOfHit != 0) {
//列の名前の出力
System.out.println(
"\n"
+ arrange(rsmd.getColumnName(1), rbi[0])
+ " "
+ arrange(rsmd.getColumnName(2), rbi[1]));
//列名と結果の区切り線 '-' の出力
System.out.println(arrange("", rbi[0], '-') + " " + arrange("", rbi[1], '-'));
(続く)
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
19
(SimpleQuery.java 続き)
while (rs.next()) {
String id = arrange(rs.getString(1), rbi[0]);
String name = arrange(rs.getString(2), rbi[1]);
System.out.println(id + " " + name);
}
System.out.println("\n
" + numOfHit + "レコードが選択されました");
} else
if (numOfHit == 0) {
System.out.println("\n 検索条件に合致するものがありませんでした。");
}
System.out.println("\n
" + numOfHit + "レコードが選択されました");
} catch (SQLException e) {
System.out.println("SQLError..." + e.getMessage());
}
D
finally {
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 文字列の長さを与えられた int の長さに揃える。
* 文字列はスペースで埋められる。
*/
private static String arrange(String target, int size) {
StringBuffer sb = new StringBuffer(target);
int tmp = size - sb.length();
if (tmp > 0)
for (int i = 0; i < tmp; i++)
sb.append(" ");
return sb.toString();
}
/**
* 第 3 引数の char で指定された文字で文字列の長さを揃える。
*/
private static String arrange(String target, int size, char ch) {
StringBuffer sb = new StringBuffer(target);
int tmp = size - sb.length();
if (tmp > 0)
for (int i = 0; i < tmp; i++)
sb.append(ch);
return sb.toString();
}
}
SimpleQuery.java
20
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
プログラムの解説
このプログラムに限らず、本章に掲載されている検索プログラムは大きく以下の処理に分割できます。
下記のA・B・C・Dは掲載したソースコードの網掛け部分に対応しています。
A) 実行する SQL 文の作成
1 検索を実行する表名を取得
実行時のコマンド・パラメーターから表明を取得します。ここでは’texttbl’を取得します。
2 データベースに接続
接続ストリングを作成して’TIESAMP’に接続します。プログラム実行時にオプション –D を使用してデー
タベース名を指定している場合はそのデータベースに接続します。
3 対話処理を実行して検索パラメーターを取得・整形
標準入力からパラメーターを取得します。複数語が入力されたときはクラス StringTokenizer を利用して各
単語を分割しています。
B) SQL 文の実行
Statement クラスを利用して検索を実行します。静的な SQL Select 文を実行する場合はメソッド
executeQuery を使用します。結果を ResultSet クラスで受け取ります。
C) 結果の表示
ResultSet オブジェクトの持つカーソルを利用して検索結果を順番に標準出力に出力しています。ここで結
果の文字列長を、メソッド arrange を用いて、列ごと長さを揃えることで見栄えをよくしています。
D) データベースへの接続の切断
Connection・Statement・ResultSet クラスのメソッド close を利用して使用したリソースを開放します。
<参考 1>
サンプル・プログラムを実行したときに表示される SQL 文をコマンド・ウィンドウ上で実行した場合でも、同じ
処理結果を得ることができます。これは他のすべてのサンプル・プログラムであっても同様です。
ただしコマンド・ウィンドウで実行する場合は、ダブルクォートの前にエスケープシーケンス \ をいれる必要
があります。
<参考 2>
これ以降のシナリオにおいても、プログラム内において同様の形式で SQL を実行しますが、ドライバーの読
み込みや実行・結果の出力、SQL 文の作成の補助を行う関数など、以降のシナリオでも同様に行われる処
理は別にクラスを作成し、そのクラスに実装させたメソッドを利用します。具体的には CuiBase クラスおよび
TieUtil クラスという 2 つのクラスを作成します。TieUtill クラスはテキスト情報エクステンダーの Java プログラ
ムをする際に利用するメソッドを保持しています。CuiBase クラスは特に CUI ベースでのプログラムをする際
に利用するメソッドを保持しています。この 2 つのクラスのメソッドを簡単に紹介します。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
21
TieUtil クラスのメソッド
createSQL
public static java.lang.String createSQL(java.lang.String tablename,
java.lang.String searchwords)
パラメーターを結合して実行可能な SQL 文を返す。
createSQL
public static java.lang.String createSQL(java.lang.String tblname,
java.lang.String searchwords,
java.lang.String prep)
prep(Score,numberofdisplay)により sql を作成
extFormStr
public static java.lang.String extFormStr(java.lang.String prefix,
java.lang.String str,
java.lang.String suffix,
java.lang.String ope)
formStr の拡張メソッド 入力されたストリングを delim で分割し、各ストリングに対して Prefix・Suffix
を追加する。 作成された各 String は ope によって結び付ける。 Prefix・Suffix にダブルクォートを指
定すると formStr と同様の処理を実行する。
formStr
public static java.lang.String formStr(java.lang.String str,
java.lang.String ope)
入力されたストリングを delim で分割し、各ストリング間に ope で指定されたオペレータを入力する。
作成された String はダブルクォートで囲まれる。
22
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
CuiBase クラスのメソッド
con
java.sql.Connection con
CuiBase
public CuiBase()
コンストラクタ。データベースに接続する。
arrange
private static java.lang.String arrange(java.lang.String target,
int size)
文字列の長さを与えられた int の長さに揃える。
arrange
private static java.lang.String arrange(java.lang.String target,
int size,
char ch)
第 3 引数の char で指定された文字で文字列の長さを揃える。
closeConnection
public void closeConnection()
コネクションを切断する。
getConnection
public void getConnection()
JDBC Driver のロード/データベースへの接続を行う。
getValue
public static java.lang.String getValue(java.lang.String str)
標準出力に str を表示する。 標準入力から 1 行読み取り値を返す。
printResult
public void printResult(java.lang.String sql)
sql を実行して結果を表示する。
printSQL
public static void printSQL(java.lang.String sql)
実行した SQL 文を標準出力に出力する。
returnSQL
public abstract java.lang.String returnSQL(java.lang.String str[])
対話処理を行い検索パラメーターを取得した後に実行可能な SQL 文を作成して返す
各 Query において実装している。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
23
TuiUtil クラス・CuiBase クラスを利用して SimpleQuery.java と同様の動作をする
SimpleQueryDash.java を以下に出力します。
SimpleQueryDash.java
class SimpleQueryDash extends CuiBase{
public static void main(String argv[]) {
A
// 各 Query をインスタンス化する
// 第 3 部のサンプルプログラムの main メソッドで異なるのはこの部分のみ
SimpleQueryDash query = new SimpleQueryDash();
String sql = query.returnSQL(argv);
printSQL(sql);
query.printResult(sql);
query.closeConnection();
}
/**
* 実行可能な SQL 文を作成する。
*/
public String returnSQL(String[] str) {
//引数のチェック
String usage = "Usage: java SimpleQueryDash Table_Name";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
String msg1 = "検索語を入力してください。
: ";
String words = "";
while (words.length() == 0)
words=CuiBase.getValue(msg1);
String sql = TieUtil.createSQL(tblname, TieUtil.formStr(words, " | "));
return sql;
}
}
SimpelQueryDash.java
プログラム解説
A) main メソッドはインスタンス化するクラスの名前以外はすべてのプログラムで共通です。これ以降紹介さ
れる各プログラムの違いは、それぞれの検索実行するための SQL 文のパラメーターを作成する
returnSQL メソッドだけです。このため、これ以降のプログラムの紹介では returnSQL メソッドのみを出力
します。
24
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 2. 検索語の大文字小文字を区別する検索
シナリオ 1 においては大文字、小文字の区別を行いませんでしたが、実際の検索場面では区別する必要が生
じることもあります。本シナリオでは区別する場合の検索方法について解説します。
<参考>
文書中に“thinkpad”を含んでいるテキスト・データの検索を行い、その ID と NAME を表示します。テキスト・デ
ータ中では“ThinkPad”という文字列でしか入っていなかったため検索結果には何も表示されません。次に文
字列‘ThinkPad’を含んでいるテキスト・データを表示します。
実行例
source> javac DistinguishQuery.java
source> java DistinguishQuery texttbl
大文字小文字の区別をする検索を行います。
複数語を入力する場合はスペースで区切ってください。この場合はいずれかの検索語を含むデータを検
索します。
検索語を入力してください。
: thinkpad
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'PRECISE FORM OF "thinkpad"')=1
検索条件に合致するものがありませんでした。
0 レコードが選択されました。
source> java DistinguishQuery texttbl
大文字小文字の区別をする検索を行います。
複数語を入力する場合はスペースで区切ってください。この場合はいずれかの検索語を含むデータを検
索します。
検索語を入力してください。
: ThinkPad
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'PRECISE FORM OF "ThinkPad"')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T23
6 レコードが選択されました。
検索語である‘ThinkPad’は T および P が大文字でデータベースに保存されているので、すべて小文字であ
る‘thinkpad’は検出されませんでした。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
25
サンプル・プログラム
以下に DistinguishQuery.java のメソッド returnSQL()を出力します。
DistinguishQuery.java
public String returnSQL(String[] str) {
String usage = "Usage: java DistinguishQuery tablename ";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
String sql = "";
try {
String[] msg = {
"大文字小文字の区別をする検索を行います。\n 複数語を入力する場合はスペースで区切ってくださ
い。この場合はいずれかの検索語を含むデータを検索します。","検索語を入力してください。
: "};
System.out.println(msg[0]);
String words = "";
while (words.length() == 0)
words = getValue(msg[1]);
A
sql =
TieUtil.createSQL(
tblname,
TieUtil.extFormStr("PRECISE FORM OF \"", words, "\"", " | "));
} catch (Exception e) {
e.printStackTrace();
} finally {
return sql;
}
}
DistinguishQuery.java
プログラムの解説
A) 大文字と小文字を区別するための検索引数は“PRECISE FORM OF”です。
SQL 文を作成するために TieUtil クラスのメソッド extFormStr を使用しています。
26
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 3. ブール演算子‘ & (AND)’,‘ | (OR)’,‘NOT’を利用する検索
ThinkPad に関する文書であり、‘30GB’のハードディスクを持つ機種のテキスト・データの ID,NAME を獲得しま
す。次に、ThinkPad か NetVista で CPU が‘Celeron’である機種のテキスト・データの ID、NAME を獲得します。
<参考>
シナリオ 1 では複数の検索語が指定された場合はいずれかの単語を含むものを検索しましたが、実際には複
数の単語をすべて含むものを検索することが考えられます。例えば、’ThinkPad’と’30GB’という 2 つの単語
を必ず含む文書を見つけたい場合はあります。このような場合はブール演算子’ & (AND)’を用います。また、
ある検索後を含めたくない場合はブール演算子‘NOT’を使用します。
[注意]
以下の実行例では、必要としていない検索語の入力ターンで何も入力せずエンターを押しています。
また、サンプルの実行例ではブール演算子‘NOT’を使用していませんが他の検索語と同様に‘NOT’に値を
入力して検索を実行することも可能です。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
27
実行例
source> javac OperateQuery.java
source> java OperateQuery texttbl
表示順序を数字で入力してください。[1]score または [2]numberofmatches
: 1
ブール演算子を使った検索を行います。使用する演算子は'&(AND)''|(OR)''NOT'です。
この順番で検索語を入力します。
検索条件が複数ある場合はスペースで区切ってください。
また、条件が必要ない場合は何も入力せずに ENTER を押してください。
必ず含まれる検索語を入力してください。 : thinkpad 30GB
いずれかが含まれる検索語を入力してください。
:
含んではいけない検索語を入力してください
:
この検索を行うために以下の SQL 文が作成されました。
with tmp(ID,NAME,prep) as (select ID,NAME,score(description,'("thinkpad" &
texttbl) select id, name from tmp where prep > 0 order by prep desc
ID
---------A0002
A0003
"30GB" )') from
NAME
---------------------------------------ThinkPad R30
ThinkPad X22
2 レコードが選択されました。
source> java OperateQuery texttbl
表示順序を数字で入力してください。[1]score または [2]numberofmatches
: 2
ブール演算子を使った検索を行います。使用する演算子は'&(AND)''|(OR)''NOT'です。
この順番で検索語を入力します。
検索条件が複数ある場合はスペースで区切ってください。
また、条件が必要ない場合は何も入力せずに ENTER を押してください。
必ず含まれる検索語を入力してください。
: Celeron
いずれかが含まれる検索語を入力してください。
: thinkpad netvista
含んではいけない検索語を入力してください
:
この検索を行うために以下の SQL 文が作成されました。
with tmp(ID,NAME,prep) as (select ID,NAME,numberofmatches(description,'("Celeron") & ("thinkpad"
| "netvista" )') from texttbl) select id, name from tmp where prep > 0 order by prep desc
ID
---------A0005
B0001
NAME
---------------------------------------ThinkPad i Series 1800
NetVista A21
2 レコードが選択されました。
28
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
<参考 1>
このシナリオではブール演算子を使用した検索方法について記述しました。シナリオ 1 で行った検索を‘or’の
パラメーターに与えてシナリオ 2 を実行するとシナリオ 1 と同様の結果が得られます。
<参考 2>
本サンプルでは結果の表示順序に関数 SCORE および関数 NUMBEROFMATCHES を利用しました。
関数 SCORE は文書中に検索語が検出される割合を表します。関数 SCORE は値として、0-1 までの Double
値を戻します。
関数 NUMBEROFMATCHES は検索語がテキスト・データ中に出現する回数を Integer で返します。
本サンプルではこれらの関数を使って、降順で結果の並べ替えを行っています。
<参考 3>
今回行ったようにブール演算子や’,’を使用することで、関数 contains を一度利用するだけで複数語の検索
を行うことができます。
複数の語を検索する場合は関数 contains を複数回利用して次のように書くことも可能です。
select ID , NAME
from texttbl
where contains (description,'"thinkpad"')=1 and contains(description,'"30GB"')=1
しかしこの場合、パフォーマンスの悪化を招きます。次ページに VisualExplain によって出力されるアクセスプラ
ンのグラフとそのコストを示します。‘contains’を 2 度利用する検索では、1 度しか利用しない検索に比べて
CPU コストで約 2 倍の差があることがわかります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
29
関数 contains を一度しか使用しない場合
実行した SQL 文
select id
from texttbl
where contains(description,’(“thinkpad” &
“30GB”)’)=1
CPU コスト
1,141,295
関数 contains を二度使用する場合
実行した SQL 文
select id,name
from texttbl
where contains
(description,'"thinkpad"')=1 and
contains(description,'"30GB"')=1
CPU コスト
2,187,298.25
30
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
サンプル・プログラム
以下にここで使用した JAVA プログラム(OperateQuery.java)のメソッド returnSQL を出力します。
returnSQL
public String returnSQL(String[] str) {
String usage = "Usage: java OperateQuery tablename";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
A
String sql = "";
try {
String[] msg =
{
"表示順序を数字で入力してください。[1]score または [2]numberofmatches : ",
"\n ブール演算子を使った検索を行います。使用する演算子は'&(AND)''|(OR)''NOT'です。\n"
+ "この順番で検索語を入力します。\n 検索条件が複数ある場合はスペースで区切ってください。\n"
+ "また、条件が必要ない場合は何も入力せずに ENTER を押してください。\n",
"表示順序は指定されませんでした。\n",
"\n 検索語を入力してください。\n"};
String[] ques =
{
"必ず含まれる検索語を入力してください。
: ",
"いずれかが含まれる検索語を入力してください。
: ",
"含んではいけない検索語を入力してください
: " };
String odr = "";
String words = "";
Hashtable ht = new Hashtable(2);
ht.put("1", "score");
ht.put("2", "numberofmatches");
String tmpstr = CuiBase.getValue(msg[0]);
if (tmpstr.equals("1") || tmpstr.equals("2"))
odr = (String) ht.get(tmpstr);
else
System.out.println(msg[2]);
String searchwords = "";
System.out.println(msg[1]);
String[] ope = { " & ", " | ", " , " };
while (searchwords.length() == 0) {
for (int i = 0; i < 3; i++) {
tmpstr = CuiBase.getValue(ques[i]);
if (tmpstr.length() != 0) {
words = "(" + TieUtil.formStr(tmpstr, ope[i]) + ")";
if (searchwords.length() != 0)
searchwords += " & ";
if (i == 2)
searchwords += "NOT";
searchwords += words;
}
}
if (searchwords.length() == 0)
System.out.println(msg[3]);
}
(続く)
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
31
(OperateQuery.java 続き)
B
//検索引数関数による SQL 文の作成の振り分け
if (odr.length() != 0)
sql = TieUtil.createSQL(tblname, searchwords, odr);
else
sql = TieUtil.createSQL(tblname, searchwords);
} catch (Exception e) {
e.printStackTrace();
} finally {
return sql;
}
}
プログラムの解説
A)
検索関数 Score と NunberOfMatches を表示順序の指定に利用しています。
ここでは検索関数の場合分けに Hashtable クラスを利用しています。このクラスはハッシュテーブルを実
装するクラスで、キーを値にマップします。
B) SQL 文の作成に TieUtil クラスのメソッド createSQL を利用しています。これらの検索関数を用いた検索
を実行する場合は、一時視点を作成した後に、検索関数の結果で並び替えを行います。
32
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 4. ファジー検索
IBM 製品の中で Series の名のつく製品の検索を実行したのですが、‘p Series’に関する記述があるため本来
なら検索にヒットするはずのテキスト・データ ’PowerPC-based WorkStation’ がヒットしませんでした。単語を
間違えている可能性があるので、ファジー検索を行います。
<参考>
ファジー検索では検索項目と類似したつづりの語が検索されます。
この検索は OCR で文書を読み取った時など、データベースに保存されているテキスト・データに入力されてい
る単語のつづりを間違えている場合などに有効です。
ファジー検索は検索パラメーターとして 1-100 の範囲の正確度を指定します。正確度が 100 の場合は完全一
致するキーワードを持つテキスト・データの検索となります。
このとき、指定するパラメーター 1-100 はそのまま検索語の正確度をあらわす割合(%)になります。
なお、DB2 テキスト・エクステンダーでは、正確度は 1-5 の数字で表されていて、1 数字あたり 20%の正確度を
持っています。正確度が 4 の場合は 80%以上の正確度であるということになります。
実行例
source> java SimpleQuery texttbl
検索語を入力してください
: series
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("series")')=1
ID
---------A0005
B0001
NAME
---------------------------------------ThinkPad i Series 1800
NetVista A21
2 レコードが選択されました
source> javac FuzzyQuery.java
source> java FuzzyQuery texttbl
一致レベル(正確度)を入力してください(1-100) :
60
一致レベル 60 でファジー検索を行います。検索語を入力してください。
: series
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'fuzzy form of 60 "series"')=1
ID
---------A0005
B0001
C0002
NAME
---------------------------------------ThinkPad i Series 1800
NetVista A21
PowerPC-based WorkStation
3 レコードが選択されました。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
33
<参考>
ファジー検索の結果 DOCUMENT ID が C0002 のテキスト・データで使用されている単語が間違っていたらし
く、正確度 60 の検索でヒットしました。さて、DOCMENT ID = C0002 のテキスト・データが実際はどのように保
存されているか確認してみましょう。以下のコマンドを実行します。
> db2 connect to TIESAMP
> db2 select description from texttbl where id='C0002'
DESCRIPTION
PwerPC-based …………
---省略--3 次元グラフィックス・アダプターを搭載可能で、シュミレーション結果の表示も高速です。
IBM p Seriis 640 モデル B80( ラック対応 64bit 4CPU ) モデル 270 ベースに開発された
モデル B80 は、IBM p Seriis のエントリー・モデルとして抜群の性能と信頼性を発揮しま
す。 モデル 270 の性能・拡張性を、より省スペースで複数台ご利用になりたいお客様に最適
です。
この結果から、列 C0002 に保存されている文書中の単語 Series が Seriis と書かれていることがわかります(上
記テキスト・ボックス太字部分)。
通常のテキスト索引に対する検索は完全一致なので通常の検索(SimpleQuery)ではヒットすることはできませ
んでしたが、正確度 60 でファジー検索を実行することで誤った文字で入力されたテキスト・データをヒットする
ことができました。
34
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
サンプル・プログラム
以下にここで使用した JAVA プログラム(FuzzyQuery.java)のメソッド returnSQL を出力します。
public String returnSQL(String[] str) {
String usage = "Usage: java FuzzyQuery tablename ";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
String sql = "";
String[] msg =
{ "一致レベル(正確度)を入力してください(1-100) :
があります。", };
A
", "入力値は 1-100 までの整数値である必要
try {
String level = new String();
Integer integer = new Integer(0);
int check = 0;
while (!(0 < check && check <= 100)) {
try {
level = getValue(msg[0]);
check = integer.parseInt(level);
} catch (NumberFormatException e) {
System.out.println(msg[1]);
}
}
String words = new String();
while (words.length() == 0) {
words = getValue("一致レベル" + level + "でファジー検索を行います。検索語を入力してください。
}
sql =
TieUtil.createSQL(
tblname,
TieUtil.extFormStr("fuzzy form of " + check + " \"", words, "\"", " | "));
} catch (Exception e) {
e.printStackTrace();
} finally {
return sql;
}
: ");
}
プログラムの解説
A) 入力された一致レベルは Integer クラスの parseInt メソッドで入力値の正当性を検査しています。入力値が
整数でない場合は例外として NumberFormatException を投げます。ここで得られた値をファジー検索文
の一致レベル(正確度)として使用します。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
35
シナリオ 5. 用語の一部の検索
10GB の倍数単位のハードディスクを持つ機種に関するテキスト・データの検索を行います。ハードディスクに
関する記述は、例えば‘10GB ハードディスク’のように書かれていることがわかっているため、数字部分にマ
スク文字を使用して検索を実行します。このように、検索語の一部をさまざまな文字で代用したいときなどに
はマスク文字を使用した検索を実行します。
<参考 1>
索引と文字コードに関して
テキスト情報エクステンダーでは、SBCS と DBCS では索引付けの方法が異なります。
DBCS に関する索引は第 1 章 の索引説明で述べたように、文字の連鎖に注目した索引付けを行っています。
このためマスク文字を使用しなくとも文字の一部で検索することが可能です。
例として以下のようなテキスト・データの検索を実行する場合を考えます。
首位打者は巨人松井
この文の場合、 ‘首位’ ‘位打者’ ‘打者’ などのいずれの語で検索してもヒットします。
サンプル・データでこれを確認するには以下のコマンドを実行してください。
source> java SimpleQuery texttbl
検索語を入力してください
: 費効
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("費効")')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T23
6 レコードが選択されました
これは文字列’消費効率’の真中の 2 文字を抜き出したものです。
36
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
これに対して、SBCS に関しては一つの単語単位でのまとまりで索引が作成されます。
これを確認するには以下のコマンドを実行してください。
source> java SimpleQuery texttbl
検索語を入力してください
: think
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("think")')=1
検索条件に合致するものがありませんでした。
source> java SimpleQuery texttbl
検索語を入力してください
: thinkpad
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("thinkpad")')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T23
6 レコードが選択されました
この結果からわかるように、マスク文字を使った検索は、
・ SBCS の文字列の検索を行う場合
・ SBCS と DBCS からなる文字列の検索を行う場合(SBCS にマスク文字を使用)
に有効な検索方法であることがわかります。
<参考 2>
マスク文字について
マスク文字は 2 種類あります。一つは % (パーセント)であり、もう一つは _ (アンダースコア)です。
% は任意の個数からなる任意の文字を表します。
_ は任意の一文字をあらわします。
マスク文字は文字列の先頭、途中、末尾につけることが可能です。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
37
実行例
source> javac MaskQuery.java
source> java MaskQuery texttbl
マスクサーチを行います。 検索語の前に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字が
ある場合は'%'を入力,特に指定しない場合はそのままエンターを押してください. : _
必ず含まれる文字列(検索語)を入力してください(入力は必須です)
: 0GB ハードディスク
検索語の後に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字がある場合は'%'を入力,特に
指定しない場合はそのままエンターを押してください.
:
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'"_0GB ハードディスク"')=1
ID
---------A0001
A0002
A0003
B0001
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
NetVista A21
4 レコードが選択されました。
今回の例では検索語の先頭にマスク文字’_’をつけて検索しています。
マスク文字は以下のように直接指定しても実行することが可能です。
source> java SimpleQuery texttbl
検索語を入力してください
: _0GB のハードディスク
[結果は省略します]
<参考 3>
<参考1>の SBCS の検索においてマスク文字を利用する場合の実行例は以下のとおりです。
source> java MaskQuery texttbl
マスクサーチを行います。 検索語の前に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字が
ある場合は'%'を入力,特に指定しない場合はそのままエンターを押してください. :
必ず含まれる文字列(検索語)を入力してください(入力は必須です)
: think
検索語の後に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字がある場合は'%'を入力,特に
指定しない場合はそのままエンターを押してください.
: %
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'"think%"')=1
[結果は省略します]
38
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
サンプル・プログラム
以下にここで使用した MaskQuery.java の returnSQL メソッドを出力します。
public String returnSQL(String[] str) {
String usage = "Usage: java MaskQuery tablename ";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
String sql = "";
String[] msg =
{
"検索語の前に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字がある場合は'%'を入力,特
に指定しない場合はそのままエンターを押してください.
: ",
"必ず含まれる文字列(検索語)を入力してください(入力は必須です)
:",
"検索語の後に任意の 1 文字が必要な場合は'_'を入力,複数の任意の文字がある場合は'%'を入力,特
に指定しない場合はそのままエンターを押してください.
: " };
try {
A
System.out.print("マスクサーチを行います。 ");
String search = "";
String tstr = getValue(msg[0]);
while (search.length() == 0)
search = getValue(msg[1]);
tstr += search+getValue(msg[2]);
sql = TieUtil.createSQL(tblname, "\"" + tstr + "\"");
} catch (Exception e) {
e.printStackTrace();
} finally {
return (sql);
}
}
プログラム解説
A) プログラムの全体的な流れは SimpleQueryDash.java と変わりません。
検索語にマスク文字を入れる必要があるため、複数回の対話処理を通して検索語を作成しています。
入力された語を append して検索語を作成します。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
39
シナリオ 6. 関連用語の検索(シソーラス検索)
サンプル・データ中には製品名“ThinkPad”という単語はテキスト・データ中にありますが、“ノートパソコン”と
いう単語はありません。しかし実際に検索を行う場合には“ノートパソコン”で検索を実行したときに
“ThinkPad”を含むテキスト・データが検出されると便利です。そのような場合にはシソーラス検索を実行しま
す。
<参考 1>
シソーラスとして指定できる関係は結合と同義の 2 種類があります。
結合とは概念が異なっていても相互に関連している用語の双方向関係です。RELATED_TO で定義します。
同義とは同じまたは類似した意味を持ち、お互いに代替可能な関係です。SYSNONYM_OF で定義します。
シソーラス検索では、ここで指定された定義ファイルに従い、mythes で発見される関連用語をすべて追加して
検索を実行します。この例では指定した検索条件としてノートパソコンに加えて、“ThinkPad”が追加されます。
実行例
まずシソーラスを定義します。サンプルファイルとして mythes.txt が定義してあります。シソーラスを定義するフ
ァイルは以下のような書式になります。
cmd> type mythes.txt
:WORDS
ThinkPad
.SYNONYM_OF ノートパソコン
.SYNONYM_OF モバイル
.RELATED_TO IBM
cmd>
db2extth -f mythes.txt -ccsid 943
DB2EXTTH - シソーラス・コンパイラー
db2extth コマンドを使用して作成した定義ファイルをコンパイルして、検索時に DB2 テキスト情報エクステンダ
ーで使用可能にしました。
40
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
以下のように実行します。
source> java SimpleQuery texttbl
検索語を入力してください
: ノートパソコン
この検索を行うために以下の SQL 文が作成されました。
select id,name from texttbl where contains (description,'("ノートパソコン")')=1
検索条件に合致するものがありませんでした。
source> javac ThesQuery.java
source> java ThesQuery texttbl
シソーラス検索で使用する関係を指定するために、1 (結合関係) または 2 (同義関係) を入力してく
ださい。 : 2
定義ファイルがコンパイルされたディレクトリを指定してください。
(ex c:\tiesmpl\mythes)
: c:\tiesmpl\cmd\mythes
検索語を入力してください
: ノートパソコン
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from texttbl where contains (description,'thesaurus "c:\tiesmpl\mythes" expand
"synonym_of" term of "ノートパソコン"')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T23
6 レコードが選択されました。
<参考 2>
上記の検索を実行した場合、モバイルは検索語には含まれません。検索語に“ノートパソコン”を用いた検索
を実行して、モバイルという語も検索させるためには、別に定義をする必要があります。以下の例を参考にし
てください。
:WORDS
ThinkPad
.SYNONYM_OF ノートパソコン
.SYNONYM_OF モバイル
.RELATED_TO IBM
:WORDS
ノートパソコン
.SYNONYM_OF モバイル
このように定義したシソーラスファイルを使用してシソーラス検索を実行すれば検索語“ノートパソコン”で“モ
バイル”・“ThinkPad”という文字列を含んだテキスト・データをヒットすることができます。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
41
サンプル・プログラム
以下にここで実行した JAVA プログラム(ThesQuery.java)の returnSQL メソッドを出力します。
ThesQuery.java (returnSQL メソッド)
public String returnSQL(String[] str) {
String usage = "Usage: java SimpleQueryDash Table_Name";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String sql = "";
String[] msg =
{
"シソーラス検索で使用する関係を指定するために、1 (結合関係) または 2 (同義関係) を入力してく
ださい。 : ",
"定義ファイルがコンパイルされたディレクトリを指定してください。\n
(ex c:\\tiesmpl\\cmd\\mythes)
:
"検索語を入力してください
: " };
String tblname = str[0];
try {
A
Hashtable ht = new Hashtable();
ht.put("1", "related_to");
ht.put("2", "synonym_of");
String operate = "";
while (!(operate.equals("1") || operate.equals("2")))
operate = CuiBase.getValue(msg[0]);
B
String filepath = "";
boolean check = false;
while (!check) {
filepath = CuiBase.getValue(msg[1]);
File file = new File(filepath);
check = (file.isDirectory());
}
String searchwords =
"thesaurus \""
+ filepath
+ "\" expand \""
+ (String) ht.get(operate)
+ "\" term of ";
String tmpstr = "";
while (tmpstr.length() == 0)
tmpstr = CuiBase.getValue(msg[2]);
searchwords += TieUtil.formStr(tmpstr, ",");
sql = TieUtil.createSQL(tblname, searchwords);
} catch (Exception e) {
e.printStackTrace();
} finally {
return sql;
}
}
42
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
プログラム解説
A) 定義ファイルに指定された 2 つの関係の指定に Hashtable を利用しています。
If 文を利用してもかまいません。
put メソッドを利用してキーと値をマッピングします。
get メソッドを利用してキーにマップされている値を獲得します。
B) 定義ファイルのフォルダパスを調べるために File クラスの isDirectory メソッドを使っています。
IsDirectory メソッドは File クラスの示す抽象パス名が示すファイルがディレクトリであるかどうかを判定
します。戻り値は、抽象パス名が示すファイルが存在し、かつそれがディレクトリである場合に true、そ
うでない場合は false となります。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
43
構造化文書の検索
ここでは構造化文書の検索方法に関して、JAVA プログラムを利用して解説を行います。
構造化された文書に対して索引付けを行う場合は、その索引付けするフォーマットを決定するための文書モ
デルが必要となります。
文書モデルを指定した索引付けを行うことで、文書モデルで指定したタグに関する索引が別途作られます。こ
のため、意味付けされたタグがある場合は、全体データの索引を行わずに指定したタグの検索を行うことでよ
り高速に検索を行うことが可能になります。
また、一般に’テキスト・データの検索’において行った検索はすべて構造化文書でも実行することが可能です。
そのため、ここでは構造化文書の索引付けを行うことで行うことが可能な検索についてのサンプルを示します。
DB2 テキスト情報エクステンダーでサポートされている構造化文書は以下の 3 つです。
・
HTML 形式
・
XML 形式
・
GPP 形式
ここでは以下のシナリオにそって検索を行います。
準備
以下のシナリオを実行するためのセットアップ
シナリオ 7
HTML 文書の索引付け、セクション検索
シナリオ 8
XML 文書の索引付け、セクション検索
準備
HTML 文書データの入った表 htmltbl とその索引を作成します。
‘setupSec3gpp.cmd’を実行することで以下の操作を省略することが可能です。
cmd> setupSec3gpp.cmd
逐次実行する表・索引の作成方法は以下のとおりです。
HTML データが挿入された表を作成し、索引を作成します。この表は texttbl と同様に列主キーとして ID,文書
の名前として NAME、文書の内容である DESCRIPTION を持ちます。
cmd> db2 -tf createHtmlTable.sql
表 htmltbl : 作成開始
DB20000I SQL コマンドが正常に終了しました。
表 htmltbl : データ挿入開始
DB20000I SQL コマンドが正常に終了しました。
44
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
ここで作成した表に対して索引を作成します。
HTML 文書の索引付け
索引を作成するための文書モデル定義ファイルは以下のようになっています。
<?xml version="1.0"?>
<HTMLModel>
<HTMLFieldDefinition name="title" tag="title"/>
<HTMLFieldDefinition name="modelName" tag="h1"/>
<HTMLFieldDefinition name="charge" tag="meta" meta-qualifier="Author"/>
</HTMLModel>
htmltblgpp.xml
タグ<title>、タグ<H1>、タグ<meta>のアトリビュート Author にそれぞれ索引付けをしています。
それぞれ“title”“modelName””charge”というセクション名で索引付けされました。
この文書モデル定義ファイルを利用して索引を作成します。
> db2text create index htmdex on htmltbl(description) for text format html documentmodel xml
in file c:\tiesmpl\cmd\htmltblgpp.xml
CTE0001 操作が正常に完了しました。
作成された索引をアップデートして検索を実行可能にします。
> db2text update index htmdex for text
CTE0001 操作が正常に完了しました。
XML 文書の索引付け
今回作成された表 xmltbl もこれまでの表と同様に ID,NAME,DESCRIPTION の 3 つの列を持ちます。
ID A0001 のxml データの内容を以下に出力します。
<?xml version="1.0"?>
<Root_Element>
<machine name="ThinkPad A30">
<os>Windows 98 SE</os>
<parts>
<cpu>Mobile Pentium3 933MHz</cpu>
<memory>128MB</memory>
<hdd>20GB</>
<cdrom>24</cdrom>
<network>10/100Base-T</network>
</parts>
<battery>3.2hour</battery>
</machine>
</RootElement>
xmlsamp1.xml
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
45
それぞれの XML 文書は ThinkPad 機種別のと詳細についてのデータです。
索引を作成する上で、HTML 文書と XML 文書における違いはほとんどありません。HTML 文書ではセクション
名の割り当てにタグを直接指定していましたが、XML でのセクションの特定はロケーションパスを使用します。
XML 文書に対する索引付けを行います。
索引を作成するための文書モデル定義ファイルは以下のようになっています。
<?xml version="1.0"?>
<XMLModel>
<XMLFieldDefinition
<XMLFieldDefinition
<XMLFieldDefinition
<XMLFieldDefinition
</XMLModel>
name="machine" locator="machine/@name"/>
name="cpu" locator="//cpu"/>
name="os" locator="machine/os"/>
name="NIC" locator="machine/parts/network"/>
xmltblgpp.xml
この文書モデルを利用して索引を作成します。
cmd> db2 -tf createXMLTable.sql
cmd> db2text create index xmldex on xmltbl(description) for text format xml documentmodel xml
in file C:\tiesmpl\cmd\xmltblgpp.xml
cmd> db2text update index xmldex for text
これで表 xmltbl に対してセクションによる索引が作成されました。
<参考>
セットアップの際に description 列に挿入されたデータはフォルダ tiesmpl のサブフォルダ InstalledData にあり
ます。データの内容については、それぞれの HTML ファイルおよび XML ファイルを参照してください。
46
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 7. HTML文書のセクション検索
データベースに保存されている IBM 製品の機種に関するテキスト・データの検索を実行します。
このテキスト・データは HTML 文書のソースファイルです。
セクション<modelName>には、その HTML 文書で紹介している機種の名称があることがわかっているので、セ
クション<modelName>に対して機種名での検索を実行します。
<参考>
指定したタグに限定した検索を行うことで、詳細な条件を付加した検索を行うことが可能です。これをセクショ
ン検索と呼びます。
実行例
source> javac SectionQuery.java
source> java SectionQuery tiesamp htmltbl
セクションサーチを実行します。
検索対象とするセクション名を入力してください
検索語を入力してください。 : thinkpad
: modelName
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from htmltbl where contains (description,'(sections
("modelName")("thinkpad"))')=1
ID
---------A0001
A0002
A0003
A0004
A0005
A0006
NAME
---------------------------------------ThinkPad s30
ThinkPad R30
ThinkPad X22
ThinkPad A30p
ThinkPad i Series 1800
ThinkPad T30
6 レコードが選択されました。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
47
サンプル・プログラム
以下にここで使用する JAVA プログラム(SectionQuery.java)の returnSQL メソッドを出力します。
public String returnSQL(String[] str) {
String usage = "Usage: java SectionQuery tablename ";
if (str.length != 1) {
System.out.println(usage);
System.exit(1);
}
String tblname = str[0];
String sql = "";
String[] msg = {"セクションサーチを実行します。",
"検索対象とするセクション名を入力してください
"検索語を入力してください。 : ",
"最低一つの検索語を入力してください"};
A
: ",
try {
System.out.println(msg[0]);
String secname = "";
while (secname.length() == 0)
secname = CuiBase.getValue(msg[1]);
String searchwords = "(sections (" + TieUtil.formStr(secname, ",") + ")";
String words = "";
do {
words = CuiBase.getValue(msg[2]);
if (words.length() != 0) {
searchwords += "(" + TieUtil.formStr(words, ",") + "))";
}
if (words.length() == 0)
System.out.println(msg[3]);
} while (words.length() == 0);
sql = TieUtil.createSQL(tblname, searchwords);
} catch (Exception e) {
e.printStackTrace();
} finally {
return sql;
}
}
プログラムの解説
A) 関数 contains の中で検索引数として sections を使用するため TieUtil クラスのメソッド formStr を 2 度使用
しています。それ以外は SimpleQueryDash.java と同様です。
48
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
シナリオ 8. XML 文書のセクション検索
ThinkPad の搭載 OS が Windows 2000 または Windows XP の機種に関するデータを検索します。すでに XML
文書にはそれぞれの機種ごとの詳細なデータが載っていることはわかっており、条件となっている OS にはセ
クション名がつけられているのでセクション検索を実行します。
実行例
source> java SectionQuery xmltbl
セクションサーチを実行します。
検索対象とするセクション名を入力してください
検索語を入力してください。 : 2000 XP
: os
この検索を行うために以下の SQL 文が作成されました。
select ID,NAME from xmltbl where contains (description,'(sections ("os")("2000", "XP" ))')=1
ID
---------0002
0003
0004
NAME
---------------------------------------ThinkPad T23
ThinkPad X22
ThinkPad s30
3 レコードが選択されました。
サンプル・プログラム
シナリオ 7 と同じプログラムです。シナリオ 7 を参照してください。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
49
第4章 Web アプリケーションによる利用
第 3 章では DB2 テキスト情報エクステンダーの基本的な使用方法について説明をしてきました。本章ではこ
れまでのプログラムをもとにして、サーブレットおよび JSP による Web クライアントからの検索要求を受け付け
る JAVA サンプルについて説明します。そのため、DB2 テキスト情報エクステンダーに関する基本的な知識を
持っていることを前提としています。
本章のサンプル・プログラムを実行するための前提環境は以下のとおりです。
・
WebSphere Application Server 4.0 アドバンスド版 (以下 WAS)
・
IBM HTTP Server 1.3.19
・
InternetExplorer 6.0
本章は以下のような構成になっています
準備
実行環境のセットアップ
シナリオ
Web アプリケーションによる利用例
[注意 1]
“第 2 章 実行環境のセットアップ”をまだ行っていない場合は、このプログラムを始める前に、’第 2 章 実行
環境のセットアップ’を参考にして、データベースをテキスト情報エクステンダーに関して使用可能な状態にし
てください。また、使用するサンプル表に合わせて表のセットアップをする必要があります。‘第 3 章 準備’を
参照してください。
[注意 2]
実際の運用化においてセキュリティを考慮する場合は、Web アクセス制御等を行う必要があります。また、
DataSource に登録するユーザーは表に対する変更権限のないユーザーを指定する必要があります。
50
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
準備 実行環境のセットアップ
データベースへの接続にはデータソース TIEDATASOURCE を利用しています。そのため、まず WAS に
DataSource として TIEDATASOURCE を登録する必要があります。DataSource を使用することで、データベー
ス接続プールがサポートされます。
「WAS 管理コンソール」 → 「リソース」 → 「JDBC プロバイダー」を選択します。各パラメーターは以下のよう
に設定してください。
名前に TIEDATASOURCE、JNDI 名に jdbc/TIEDATASOURCE、データベース名に TIESAMP、ユーザー名、パ
スワードをお使いの環境に合わせて設定してください。このユーザーにデータベースへの変更を不可能なユ
ーザーを指定することでセキュリティを高めることができます。以下の図を参考にしてください。
次に ear ファイルを利用して、WebSphere に Web アプリケーションをインストールします。
「WebSphere 管理コンソール」→「エンタープライズ・アプリケーション」を右クリックして、「エンタープライズ・ア
プリケーションのインストール」を選択します。インストールするアプリケーション名は WebSearch.ear です。こ
のファイルは tiesmpl のサブフォルダ web に入っています。このアプリケーションのコンテキストルートは/TIES
です。すでに他のアプリケーションがインストールされている場合はそのアプリケーションを除去するか、アプ
リケーション・アセンブリー・ツールなどを利用してコンテキストルートを変更する必要があります。
表示される項目にそれぞれ入力します。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
51
この例では web アプリケーションが TieApp という名前でインストールされます。
残りの入力画面ではすべて“次へ”をクリックします。
アプリケーションがインストールされたら、次にサーバーを始動します。
アプリケーションのインストールされているサーバー名を右クリック→「始動」 でサーバーを始動します。
52
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
DB2 テキスト情報エクステンダー Web 検索エンジン
シナリオ
Web アプリケーションによる利用例
実際にテキスト情報エクステンダーを使用する場合は、コマンドラインから使用するよりも、Web アプリケーショ
ンに組み込んで使用することのほうが多いでしょう。本シナリオでは Web アプリケーションでのテキスト情報エ
クステンダーの利用例を示します。ここでは、ThinkPad と NetVista に関するテキスト・データを検索します。
実行例
コマンドプロンプトから以下のコマンドを実行します。
> db2text start
InternetExplorer のアドレス入力欄に“http://localhost:9080/TIES/ops.html”と入力します。
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
53
赤線で丸く囲まれている部分に検索のためのパラメーターを入力しました。表示順序は’検索基準の検出数’
を選択しました。‘いずれかの検索語を含む’というテキスト・ボックスに‘ThinkPad’、‘NetVista’を入力しまし
た。入力が終わりましたら‘検索の実行’をクリックします。
検索が終了し、結果表が作成されます。
この表の続きを見る場合は’次の結果表を表示する’をクリックします。
次のページへ進んだ場合、‘一つ前の結果ページを表示’が出現するので、これをクリックすることで一つ前
の結果表表示画面に戻ることができます。検索語フィールドに表示されている実行した検索パラメーターに続
けて検索語を入力することで、さらに条件を付加した検索を実行することが可能です。
<参考>
この検索で使用できるパラメーターはそれぞれ以下のようになっています。
検索設定のパラメーター
表示する結果の数
検索の実行結果を表示する数を示します。本サンプルでは表に含まれているデータの数が少ない
ためデフォルトが 3 にセットされています。
表示順序
’検索語の割合’、‘検索基準の検出数’という 2 つのパラメーターがあります。
‘検索語の割合’は検索結果の SCORE 値を元にして結果を並び替えます。 ‘検索基準の検出数’
は、テキスト文書内を検索しその結果として文書ごとに一致した数を示す INTEGER 値を返す’
NUMBEROFMATCHES’を利用して並び替えを行います。
SCORE、NUMBEROFMATCHES に関する説明は第 3 章 シナリオ 3 を参照してください。
54
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
55
サンプル・プログラム
以下に WebSearch クラスの createResultTable メソッドを出力します。
private String createResultTable(ResultSet rs, int intnumdisp) {
String result = "";
try {
int i = 0;
result =
"<TABLE><TBODY><TR><TD>Row Number</TD><TD>DOC ID</TD><TD>DOC NAME</TD></TR>";
while (i < intnumdisp && rs.next()) {
A
result += "<TR><TD>" + rs.getRow() + "</TD>"
+ "<TD>" + rs.getString(1) + "</TD>"
+ "<TD>" + rs.getString(2) + "</TD></TR>";
i++;
}
result += "</TABLE>";
if (i == 0)
result += ("<BR><H3><P>条件を満たすものが見つかりません。"
+ "<BR>条件を変えて検索を行ってください。</H3></P>");
} catch (SQLException e) {
result = "SQL 実行エラー" + e;
} finally {
return result;
}
}
プログラムの解説
A)
ResultSet クラスの getRow メソッドを利用して列番号を取得しています。
SCORE または NUMBEROFMATCHES で並び替えられているので、その順番を表示します。
ResultSet クラスの getString メソッドは、パラメーターで指定された int 値の列の値を取得します。
例えば、ここで getString メソッドの引数として 3 を指定した場合は、3 つ目の列のデータをそのまま出
力することになります。
56
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
以下に JAVA サンプル・プログラム(WebSearch.java)の処理部分を出力します。
(略)
Connection con=null;
Statement stmt=null;
ResultSet rs = null;
try {
A
B
con = getConnection(DATASOURCE);
stmt =
con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql = returnSQL(tblname, swords, level, order);
rs = stmt.executeQuery(sql);
//検索数の特定
rs.last();
int all = rs.getRow();
rs.beforeFirst();
//結果表示の列の番号
int intcolnum = 0;
if (colnum != null)
intcolnum = Integer.parseInt(request.getParameter("colnum"));
else {
colnum = "0";
}
//デフォルト画面表示数
int intnumdisp = 10;
if (numdisp != null)
intnumdisp = Integer.parseInt(request.getParameter("numdisp"));
//colnum(開始カーソル位置)によって移動
if (intcolnum > 0)
for (int i = 0; i < intcolnum; i++)
rs.next();
//出力用テキストの作成
result =
"<H2>全部で" + all + "個のデータが検索されました</H2>" + createResultTable(rs, intnumdisp);
if (rs.next())
next = "yes";
(以下略)
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
57
プログラムの解説
A) 本サンプルではコネクションプールを利用しています。コネクションプールを利用している場合の
Connection クラスの close メソッドが実行されると、コネクションプールに接続が戻されます。データベース
自体への接続は WebSphere が持ちつづけています。
また接続数が多い場合はプーリング数を十分に大きい値に設定する必要があります。
B) スクロール可能な ResultSet を作成しています。
具体的に用いているタイプは以下のようになっています。
TYPE_SCROLL_INSENSITIVE
順方向および逆方向にカーソルを移動できる ResultSet を表すタイプのこと。
CONCUR_READ_ONLY
更新処理に対応しない、読み出し専用の ResultSet を作成する。
本サンプルではこれらを結果数の表示を行うために利用しました。
58
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
End of Document
DB2 テキスト情報エクステンダー JAVA サンプル・プログラム
59
Fly UP