|
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を利用した構成例

Data Links Managerを利用した場合、検索対象としたテキスト文書はDBサーバー内に 格納する必要はありません。別のファイルサーバー内にある文書に対してリンク先を
DBに登録して、テキスト索引を作成することにより、テキスト検索をすることができます。 テキスト索引作成時にリンク先の文書から索引を作りますので、検索時はDBサーバー
内のテキスト索引を検索する為、検索のパフォーマンスがDBサーバー内のデータと 変わりません。実際にその文書を結果表示する際にファイルに対してアクセスされます。
DB2 Net Search Extenderの使用手順
NSEを使用するには図のような手順に従います。
NSEの操作はコントロールセンターからも行えます。
コマンドで行う場合は
- Windowsの場合、「スタート」→「プログラム」→「IBM DB2」→「コマンド・ウィンドウ」から、以下の例を実行してください。
- Unixの場合、ターミナルのコマンド行から以下の例を実行してください。
それでは、さっそく実際に使用してみましょう。
前提の環境は以下の通りです。
- DB2 UDB V8.1と NSE V8.1が導入されている
- SAMPLE DBが作成されている
- DBが開始されている
1.NSEインスタンス・サービスの開始
まずはじめにNSEのインスタンス・サービスを開始します。
コントロール・センターで該当のインスタンスを選択し、右クリックして、 「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です。
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です。
注:MAXIMUM CACHE SIZEの上限はプラットフォーム毎に異なります。
Windows: 1024MB
AIX : 1536MB
Solaris : 2048MB
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”
(キャッシュオプション付きテキスト索引の場合)
|
正常終了した場合は以下のメッセージが出力されます。
失敗した場合は以下のメッセージが出力されます。
| |
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
|
テキスト索引のスキーマ名と索引名は大文字で記述してください。
ストアードプロシージャーの場合、結果表示列は指定していません。
表示されるのはテキスト索引を作成した時に指定したキャッシュテーブル の列が表示されます。
- 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ファイルを使った検索をおこなっていきます。
|