...

簡単シリーズ DB2 Net Search Extender

by user

on
Category: Documents
40

views

Report

Comments

Transcript

簡単シリーズ DB2 Net Search Extender
簡単シリーズ
DB2 Net Search Extender
DB2 Net Search Extender 第2回
DB2 Net Search Extender(以下NSE)の2回目では、
実際にNSEを使ってテキスト索引を作成し、検索していきましょう。
検索対象データタイプ
NSEで検索対象になるテキスト文書として以下のタイプと構成が可能です。
–
–
–
–
–
–
CHAR
VARCHAR
LONG VARCHAR
GRAPHIC
VARGRAPHIC
LONG VARGRAPHIC
テキストデータをDBの列に直接格納
– CLOB
– DBCLOB
– BLOB
テキスト文書ファイルごとDBの列に格納
– DATALINK
テキスト文書ファイルをDBとリンクして
ファイル自体はDBの外部ファイルとして
別に格納
Data Links Managerを利用した構成例
検索サーバー
テキスト索引はリンク
先の文書から作成
DISK
ファイルサーバーA
ID
001
002
タイトル
リンク先
洋らんの育て方
趣味の園芸
テキスト索引
ServerA/...
ServerB/...
洋らんの育て方
趣味の園芸
イングリッシュガーデニング
ベランダの花壇。。
ファイルサーバーB
書籍情報の文書のリン
ク先をDBに格納
Data Links Managerを利用した構成例(説明)
Data Links Managerを利用した場合、検索対象としたテキスト文書はDBサーバー内に
格納する必要はありません。別のファイルサーバー内にある文書に対してリンク先を
DBに登録して、テキスト索引を作成することにより、テキスト検索をすることができます。
テキスト索引作成時にリンク先の文書から索引を作りますので、検索時はDBサーバー
内のテキスト索引を検索する為、検索のパフォーマンスがDBサーバー内のデータと
変わりません。実際にその文書を結果表示する際にファイルに対してアクセスされます。
図:DB2 Net Search Extenderの使用手順
DB2の操作
1.NSEインスタンス・サービスを開始する
NSEの操作
ストアードプロシージャーでの
テキスト検索の場合のみ
2.データベースをテキスト検索可能にする
3.表を作成する
4−1.テキスト索引を作成する
5.初期データをロードする
ストアードプロシージャーでの
テキスト検索の場合のみ
4−2.キャッシュ・オプション指定で
テキスト索引を作成する
2回目以降
データ更新なしの場
合
6.テキスト索引を更新する
10.キャッシュを非活動化する
繰り返し
7.キャッシュを活動化する
8.テキスト索引で検索する
9.データを更新する
DB2 Net Search Extenderの使用手順
NSEを使用するには図のような手順に従います。
NSEの操作はコントロールセンターからも行えます。
コマンドで行う場合は
– Windowsの場合、「スタート」→「プログラム」→「IBM DB2」→「コマンド・
ウィンドウ」から、以下の例を実行してください。
–
Unixの場合、ターミナルのコマンド行から以下の例を実行してください。
それでは、さっそく実際に使用してみましょう。
前提の環境は以下の通りです。
DB2 UDB V8.1と NSE V8.1が導入されている
SAMPLE DBが作成されている
DBが開始されている
1.NSEインスタンス・サービスの開始
まずはじめにNSEのインスタンス・サービスを開始します。
db2text start
コントロール・センターで該当のインスタンスを選択し、右クリックして、
「Net Search Extender」⇒「Net Search Extenderインスタンス・サービスを開始」
コントロールセンターでの例
2.データベースをテキスト検索可能にする
データベースをテキスト検索可能にします。
db2text enable database for text connect to SAMPLE
コントロール・センターで該当のデータベースを選択し、右クリックして、
「Net Search Extender」⇒「テキストに対してデータベースを使用可能にする」
コントロールセンターでの例
3.表を作成する
サンプル表を作成するには以下のようにDB2コマンドを実行します。
db2 “CREATE TABLE text.books (
id
CHARACTER (8) NOT NULL PRIMARY KEY ,
title
VARCHAR (30) ,
author
VARCHAR (30) ,
story
VARCHAR (1000) ,
year
INTEGER
) ;”
このコマンドでAuthorやstoryの列を含むbooks表が作成されます。
4−1.テキスト索引を作成する
テキスト索引を作成するには、以下のようにします。
db2text “CREATE INDEX text.ix_story FOR TEXT ON text.books(story)
CCSID 943 LANGUAGE JA_JP
CONNECT TO sample”
CTE0001 操作が正常に完了しました。
このコマンドで、列storyにテキスト索引が作成されます。
テキスト索引の名前はtext.ix_storyです。
注:MAXIMUM CACHE SIZEの上限はプラットフォーム毎に異なります。
Windows:1024MB
AIX:1536MB
Solaris:2048MB
4−2.キャッシュオプション指定でテキスト索引を作成する
キャッシュオプション指定でテキスト索引を作成するには、以下のようにします。
db2text “CREATE INDEX text.ix_c_story FOR TEXT ON text.books(story)
CCSID 943 LANGUAGE JA_JP
CACHE TABLE(title,author) MAXIMUM CACHE SIZE 1
CONNECT TO sample”
CTE0001 操作が正常に完了しました。
このコマンドで、列storyにテキスト索引が作成され,
列titleおよびauthorのキャッシュ表が指定されています。
テキスト索引の名前はtext.ix_c_storyです。
5.初期データをロードする
ここでは初期データを以下のコマンドInsertします。
db2 “INSERT INTO text.books VALUES ('00000001','田中 耕一郎','趣味の園芸',
'ガーデニングの初心者でもわかりやすく基礎から説明します',1999)”
db2 “INSERT INTO text.books VALUES ('00000002','佐藤 愛子','洋ランの育て方',
'誰でも簡単に洋ランの育てることができます。ガーデニングでも洋ランをどうぞ',2000)”
db2 “INSERT INTO text.books VALUES ('00000003','中井 珠子',
'魔法辞典','イギリスの魔女伝説から魔術用語の説明まで',2001)”
6.テキスト索引を更新する
テキスト索引を作成しただけでは、DBの通常の索引と違って、
データが更新された際に自動的にテキスト索引に反映はされません。
別途、テキスト索引を更新する必要があります。
books表に追加されたデータでテキスト索引を更新するには以下のようにします。
db2text “UPDATE INDEX text.ix_story FOR TEXT CONNECT TO sample”
db2text “UPDATE INDEX text.ix_c_story FOR TEXT CONNECT TO sample”
(キャッシュオプション付きテキスト索引の場合)
正常終了した場合は以下のメッセージが出力されます。
CTE0001 操作が正常に完了しました。
失敗した場合は以下のメッセージが出力されます。
CTE0192 索引の更新操作でエラーが発生しました。詳しくはイベント表
db2ext.teventxxxxxxとdb2diag.logを確認してください。
イベント表名のxxxxxxxは内部的なテキスト索引名で各テキスト索引毎に異なります
ので、メッセージに表示された表を参照してください。l
内部的なテキスト索引名はコントロール表db2ext.textindexesを参照すると
イベント表名もわかります。
7.キャッシュを活動化します。
キャッシュを使用したストアードプロシージャー検索の場合は、
キャッシュを活動化する必要があります。
キャッシュを活動化するには以下のようにします。
db2text “ACTIVATE CACHE FOR INDEX text.ix_c_story FOR TEXT
CONNECT TO sample”
テキスト索引を更新し、キャッシュテーブルにも結果を反映させる場合は
再作成オプションを指定して活動化します。
db2text “ACTIVATE CACHE FOR INDEX text.ix_c_story FOR TEXT
RECREATE CONNECT TO sample”
8.テキスト索引で検索します
•
SQLスカラー検索関数の場合
db2 “SELECT title,author FROM text.books
WHERE CONTAINS(story,’¥”ガーデニング¥”’)=1 AND year >= 2000”
TITLE
AUTHOR
------------------------------ -----------------------------佐藤 愛子
洋ランの育て方
1 レコードが選択されました。
注:使用OS(シェル)によっては、テキスト検索語句を囲む2重引用符の前に、
別のエスケープ文字が必要な場合があります。Windowsでは¥マークを記述。
•
ストアードプロシージャー検索の場合
db2 “call db2ext.textsearch(’¥”ガーデニング¥”’,’TEXT’,’IX_C_STORY’,0,3,0,0,?,?)”
出力パラメーターの値
-------------------------パラメーター名 : SEARCHTERMCOUNTS
パラメーター値 : パラメーター名 : TOTALNUMBEROFRESULTS
パラメーター値 : 2
結果セット 1
-------------TITLE
AUTHOR
------------------------------ -----------------------------田中 耕一郎
趣味の園芸
佐藤 愛子
洋ランの育て方
2 レコードが選択されました。
リターン状況 = 0
8.テキスト索引で検索します
テキスト索引のスキーマ名と索引名は大文字で記述してください。
ストアードプロシージャーの場合、結果表示列は指定していません。
表示されるのはテキスト索引を作成した時に指定したキャッシュテーブル
の列が表示されます。
•
SQL表値関数検索の場合
db2 “SELECT title,author FROM books b,
TABLE(db2ext.textsearch(’¥”ガーデニング¥”’,’text’,’ix_c_story’,0,3,CAST(NULL as
char))) T WHERE T.primKey = B.id”
TITLE
AUTHOR
------------------------------ -----------------------------田中 耕一郎
趣味の園芸
佐藤 愛子
洋ランの育て方
2 レコードが選択されました。
検索サンプルとしては、sqllib¥samples¥db2ext以下にあるsearchファイルを
参考にしてください。
9.データを更新します。
books表に追加データを更新します。
db2 “INSERT INTO text.books VALUES (‘00000004’,’鈴木 太郎’,
’イングリッシュガーデン’,’イギリス式ガーデニングを楽しみましょう’,2003)
もう一度8の検索方法で検索してみましょう。
db2 “SELECT title,author FROM text.books
WHERE CONTAINS(story,’¥”ガーデニング¥”’)=1 AND year >= 2000”
TITLE
AUTHOR
------------------------------ -----------------------------佐藤 愛子
洋ランの育て方
1 レコードが選択されました。
まだ検索結果には今追加した本はありませんね。データを更新しても
テキスト索引はまだ更新されていないからです。
それでは、テキスト索引に追加したデータを反映させましょう。
手順は6のテキスト索引を更新すると同じです。
更新終了後に検索してみましょう。
SQLスカラー関数およびSQL表値関数では反映されていますね。
db2 “SELECT title,author FROM text.books
WHERE CONTAINS(story,’¥”ガーデニング¥”’)=1 AND year >= 2000”
TITLE
AUTHOR
------------------------------ -----------------------------佐藤 愛子
洋ランの育て方
鈴木 太郎
イングリッシュガーデン
2 レコードが選択されました。
ところが、ストアードプロシージャーではまだ反映されていません。
これはキャッシュが活動化されている為、テキスト索引と同期がとられていない為で
す。
10のキャッシュの非活動化を行い、7の再作成オプション付きのキャッシュの活動
化を行ったあとにもう一度ストアードプロシージャーで検索してみましょう。
10.キャッシュを非活動化します。
活動化したキャッシュを開放するためには非活動化します。
キャッシュを非活動化するには以下のようにします。
db2text “DEACTIVATE CACHE FOR INDEX text.ix_c_story FOR TEXT
CONNECT TO sample”
その後、7のキャッシュの活動化を再作成オプション付きで行ったあとにもう一度
ストアードプロシージャーで検索してみましょう。
db2 “call db2ext.textsearch(’¥”ガーデニング¥”’,’TEXT’,’IX_C_STORY’,0,3,0,0,?,?)”
出力パラメーターの値
-------------------------パラメーター名 : SEARCHTERMCOUNTS
パラメーター値 : パラメーター名 : TOTALNUMBEROFRESULTS
パラメーター値 : 3
結果セット 1
-------------TITLE
AUTHOR
------------------------------ -----------------------------田中 耕一郎
趣味の園芸
佐藤 愛子
洋ランの育て方
鈴木 太郎
イングリッシュガーデン
3 レコードが選択されました。
リターン状況 = 0
追加したデータが反映されました。
このようにデータを更新してもテキスト索引には動的更新はされません。
キャッシュを活動化している場合、テキスト索引を更新してもキャッシュは更新さ
れませんので、注意が必要です。
テキスト索引の更新を反映させる為にはキャッシュの非活動化後、再度キャッ
シュを活動化しましょう。
データ更新しないでキャッシュを非活動化した場合、テキスト索引作成時に永続
キャッシュ指定をしておくとキャッシュテーブルのイメージがDISK上に保管されま
すので、次回のキャッシュの活動化が高速になります。
最後に
DB2 Net Search Extenderについての2回目となる今回は、DB2 Net
Search Extenderを使用してテキスト索引を作成し、3つのI/Fを使って単純
な検索をしてみました。次回は、SQLスカラー関数を使ってもっといろいろな
検索やXMLファイルを使った検索をおこなっていきます。
Fly UP