|
DB2 Net Search Extender(以下NSE)の4回目では、ストアードプロシージャーやSQL表値関数を利用して、複数テキスト索引に対しての検索を行い、3つのインターフェースのそれぞれの特徴についてまとめていきます。
今回使うデータも第3回と同様にXML文書を使用します。
ストアードプローシージャーによる検索方法
ストアードプロシージャーによる検索方法の最大の特徴はテキスト索引作成時にキャッシュテーブルを定義し、結果表をあらかじめメモリー上に展開しておき、高速に検索結果を決まった件数づつ返すことでしょう。
その為、他の検索方法と違って以下の手順が追加されています。
- キャッシュオプション付きテキスト索引の作成
- キャッシュの活動化
- キャッシュの非活動化
この検索方法では少数の結果を特定の順序で返す必要がある時に使用できます。
たとえば、検索結果を最初の20行を戻し、残りの結果も20行づつ戻したいような場合です。
ただし結果列の指定変更および順序指定(スコア除く)はできません。ストアードプロシージャーの結果はキャッシュテーブルに定義した列がHITした順に返されます。
代わりにテキスト索引を指定することが出来るので、条件が違う複数のテキスト索引を作成した場合に使い分けをすることが出来ます。つまり、結果に対してなんらかの条件を指定したい場合は、テキスト索引作成時に指定して検索対象索引を切り替えるか、結果をアプリケーションで後処理をして使用します。
SQL表値関数を使う検索方法
表値関数を使った検索方法は、SQLスカラー関数を使った柔軟な検索方法とストアードプロシージャーを使った高速で少量結果づつ戻すというインターフェースを兼ね備えています。
キャッシュテーブルの活動化を必要としませんので、全ての結果を返す必要がない場合、またはストアードプロシージャーを使用する場合に必要な実メモリーを十分備えていないような場合にもご利用になれます。
検索結果と他のユーザー表と結合して結果を表示することも可能です。
つまり、検索対象のデータはリアル更新してもテキスト検索には反映できませんが、在庫やコメントなどリアル更新している表と結合することにより最新情報を追加で表示することが可能です。
ただし、この表値関数は検索対象の基本表の単一列での主キーのみがサポートされることが制約です。単一列で主キーにならないような基本表は別途プライマリーキーが単一列になるようなビューを作成し、そのビューに対してテキスト索引を作成してください。
検索結果の並び順について
テキスト索引を作る前に検索結果の並び順について考えてみましょう。
検索した結果の並び順はテキスト索引でのHit順に表示されます。
テキスト索引の更新方法には全件の再作成(新規作成のことですね)と差分更新の方法があります。
キャッシュテーブルオプション付きテキスト索引作成時には並び順を指定することができますが、この並び順の保証は新規作成時のみで差分更新時には後ろに追加されます。色々な情報で並び順を変更したい場合はテキスト索引をそれ毎に複数作成することにより可能です。
キャッシュテーブルオプション付きテキスト索引はストアードプローシージャー用ですが、キャッシュテーブルで並び順を指定するとテキスト索引内のデータもその並び順で生成されますので、キャッシュテーブルを活動化させなくてもSQL表値関数ではそのテキスト索引名を指定することにより指定の並び順に結果を表示させることができます。
検索結果の並び順を保証したい場合の方法はI/Fによって出来ることが異なります。
それはSQL文での指定が可能かテキスト索引名を指定できるかといった違いからきます。
- ストアードプロシージャーの場合
- 並び順指定でのテキスト索引の再作成
- プログラムによる検索結果後のソート実施
- SQLスカラー関数の場合
- order byによるSQLでのソート
- プログラムによる検索結果後のソート実施
- SQL表値関数の場合
- 並び順指定でのテキスト索引の再作成
- order byによるSQLでのソート
- プログラムによる検索結果後のソート実施
1.XML文書を用意します
それでは、さっそく準備をはじめましょう。今回も3回目の時と同じ表、XML文書を使って検索を行いますが、並び順の結果が判るように少し件数を増やします。
皆さんはこのファイルをそれぞれダウンロードして使用してください。
(ブラウザ表示でご覧になりたい方はクリックしてください。
ご自分のPCにダウンロードしたい方は右クリックで「対象をファイルに保存」でダウンロードしてください。)
00000001.xml( ダウンロード)
00000002.xml( ダウンロード)
00000003.xml( ダウンロード)
00000004.xml( ダウンロード)
00000005.xml( ダウンロード)
00000006.xml( ダウンロード)
00000007.xml( ダウンロード)
00000008.xml( ダウンロード)
2.文書モデルの定義を準備する
第3回の文書モデルファイルを使います。
3.表を作成する
第3回で作成済みのサンプル表を使用します。
前回のままの方は中身をきれいする為にテキスト索引の削除、テーブルの再作成をしておきましょう。
| |
db2text “drop index text.ix_xml for text connect to sample“ ← テキスト索引の削除
db2 “drop table text.clob_books” ← テーブルの削除
db2 “CREATE TABLE text.clob_books (
id CHARACTER (8) NOT NULL PRIMARY KEY ,
title VARCHAR (30) ,
author VARCHAR (30) ,
story VARCHAR (1000) ,
year INTEGER,
clob CLOB(1M)
) ”
|
4.テキスト索引を作成する
今回は著者順と発行年の最新順のテキスト索引を作成しましょう。 以下のようにします。
著者順(cre_ix_auth.bat)

このコマンドで、列clobに著者順のテキスト索引が作成されます。
テキスト索引の名前はtext.ix_authorです。
発行年の最新順(cre_ix_year.bat)
| |
db2text “CREATE INDEX text.ix_year FOR TEXT ON text.clob_books(clob)
ATTRIBUTES(DOUBLE(year) as new_year)
CCSID 943 LANGUAGE JA_JP format XML documentmodel IN
C:\nse\data\book.mdl
CACHE TABLE(title,author,year) MAXIMUM CACHE SIZE 1
INITIAL SEARCH RESULT ORDER (year desc)
CONNECT TO sample”
|
このコマンドで、列clobに発行年が最新順のテキスト索引が作成されます。
テキスト索引の名前はtext.ix_yearです。
5.初期データをロードする
それでは初期データをIMPORTします。
以下のファイルbooks.csvを用意しましょう。
books.csv
| |
00000001,趣味の園芸,田中 耕一郎,ガーデニングの初心者 でもわかりやすく基礎から説明します,1999,00000001.xml
00000002,洋ランの育て方,佐藤 愛子,誰でも簡単に洋ラン の育てることができます。ガーデニングでも洋ランをどうぞ,2000,00000002.xml
00000003,魔法辞典,中井 珠子,イギリスの魔女伝説から 魔術用語の説明まで,2001,00000003.xml
00000004,イングリッシュガーデン,鈴木 太郎,イギリス式 ガーデンの作り方,2002,00000004.xml
00000005,趣味の園芸2,田中 耕一郎,手軽な植木鉢の育て方。 少し気をつけるだけで植物は生き生きしてきます,2001,00000005.xml
00000006,趣味の園芸3,田中 耕一郎,ガーデニングの定番。 趣味の園芸第3弾,2002,00000006.xml
00000007,パンジーの育て方,佐藤 愛子,初心者でも簡単。 ガーデニングに,2002,00000007.xml
00000008,趣味の園芸4,田中 耕一郎,ガーデニングの定番。 趣味の園芸第4弾, 2003,00000008.xml
|
XMLファイルをローカルの適当なディレクトリー(ここではC:\NSE\DATA) に保管しましょう。
そのディレクトリー名をImportコマンドに指定します。
| |
IMPORT from c:\nse\data\books.csv of del
lobs from c:\nse\data
modified by lobsinfile
messages msg_test.txt
insert into text.clob_books;
|
6.テキスト索引を更新する
books表に追加されたデータで二つのテキスト索引を更新します。
| |
db2text “UPDATE INDEX text.ix_author FOR TEXT CONNECT TO sample”
db2text “UPDATE INDEX text.ix_year FOR TEXT CONNECT TO sample”
|
7.キャッシュを活動化する
ストアードプロシージャー検索の場合には、キャッシュを活動化する必要があります。 二つのキャッシュを活動化します。
| |
db2text “ACTIVATE CACHE FOR INDEX text.ix_author FOR TEXT CONNECT TO sample”
db2text “ACTIVATE CACHE FOR INDEX text.ix_year FOR TEXT CONNECT TO sample”
|
8.テキスト索引で検索します(ストアードプロシージャー編)
著者順フリーテキスト検索の例
| |
call db2ext.textsearch('"ガーデニング"','TEXT','IX_AUTHOR',0,10,0,0,?,?)
|
db2ext.textsearchプロシージャーの引数説明
| 入力 |
query, |
:検索キーワード |
| 入力 |
indexSchema, |
:テキスト索引スキーマ名 |
| 入力 |
indexName, |
:テキスト索引名 |
| 入力 |
resultFirstRow, |
:結果セットに戻される最初の行番号 |
| 入力 |
resultNumberRows, |
:検索の結果セットに戻される行数 |
| 入力 |
rankingFlag, |
:スコア検索をする場合に指定
0はスコアがない意味
1はスコアがあることを意味 |
| 入力 |
searchTermCountsFlag, |
:0は検索キーワード出力数をカウントしない |
| 出力 |
searchTermCounts, |
:検索キーワード出力件数 |
| 出力 |
totalNumberOfResults |
:検索結果の総件数 |
注:大量な結果セット(行数)を受け取りたい場合は一時ユーザー表スペースを作成してください。
著者順フリーテキスト検索(XML文書の全文検索)の出力例

発行年順フリーテキスト検索(XML文書の全文検索)の出力例

分割出力の例

9.テキスト索引で検索する(SQL表値関数編)
次にSQL表値関数の場合で検索方法をみてみましょう。
表値関数は検索結果をプライマリーキーの値として返しますので、他の列の値を表示させる時は以下のようにユーザー表と結合して表示させます。
著者順フリーテキスト検索の例
| |
SELECT title,author FROM text.clob_books b,TABLE(db2ext.textsearch('"ガーデニン
グ"','TEXT','IX_AUTHOR',0,10, CAST(NULL as char))) T WHERE T.primKey = B.id
|
db2ext.textsearch関数の引数説明
| 入力 |
query, |
:検索キーワード |
| 入力 |
indexSchema, |
:テキスト索引スキーマ名 |
| 入力 |
indexName, |
:テキスト索引名 |
| 入力 |
resultFirstRow, |
:結果セットに戻される最初の行番号 |
| 入力 |
resultNumberRows, |
:検索の結果セットに戻される行数 |
| 入力 |
PrimKeyBinding, |
:プライマリーキーのタイプを指定
NULL (“CAST
(NULL as <type1)”を指定する←Type1とは基本表の主キー
とテキスト検索の範囲は全て のタイプを示しています |
| 出力 |
primkey |
:検索された文書の主キー |
| 出力 |
numberofmatches, |
:各文書で一致した個数 |
| 出力 |
score |
:文書で検索後の頻度が増せばSCOREも増加 |
| 出力 |
totalNumberOfResults |
:検索結果の総件数 |
著者順フリーテキスト検索(XML文書の全文検索)の出力例
| |
SELECT title,author FROM text.clob_books b,TABLE(db2ext.textsearch('"ガーデニン
グ"','TEXT','IX_AUTHOR',0,10,CAST(NULL as char))) T WHERE T.primKey = B.id
TITLE AUTHOR
------------------------------ ------------------------------
洋ランの育て方 佐藤 愛子
パンジーの育て方 佐藤 愛子
趣味の園芸 田中 耕一郎
趣味の園芸3 田中 耕一郎
趣味の園芸4 田中 耕一郎
5 レコードが選択されました。
|
表値関数はキャッシュテーブルを使っていませんので、検索結果で表示できる列は多様です。 著者順のテキスト索引を検索していますので、結果はストアードプロシージャーの例と同じですが、
表示列は自由です。
発行年順フリーテキスト検索(XML文書の全文検索)の出力例
| |
SELECT title,author,year FROM text.clob_books b,TABLE(db2ext.textsearch('"ガーデ
ニング"','TEXT','IX_YEAR',0,10,CAST(NULL as char))) T WHERE T.primKey = B.id
TITLE AUTHOR YEAR
------------------------------ ------------------------------ -----------
趣味の園芸4 田中 耕一郎 2003
趣味の園芸3 田中 耕一郎 2002
パンジーの育て方 佐藤 愛子 2002
洋ランの育て方 佐藤 愛子 2000
趣味の園芸 田中 耕一郎 1999
5 レコードが選択されました。
|
発行年の最新順のソートされたテキスト索引を利用して検索した結果です。2002年発行の2冊はデータ登録順に表示されています。
著者順テキスト索引を利用して発行年順に並び替え検索の出力例
| |
SELECT title,author,year FROM text.clob_books b,TABLE(db2ext.textsearch('"ガーデ
ニング"','TEXT','IX_AUTHOR',0,10,CAST(NULL as char))) T WHERE T.primKey = B.id order by year desc
TITLE AUTHOR YEAR
------------------------------ --------------- -----------
趣味の園芸4 田中 耕一郎 2003
パンジーの育て方 佐藤 愛子 2002
趣味の園芸3 田中 耕一郎 2002
洋ランの育て方 佐藤 愛子 2000
趣味の園芸 田中 耕一郎 1999
5 レコードが選択されました。
|
著者順のソートされたテキスト索引を利用して検索した結果を発行年の最新順にSQLでソートした例です。2002年発行の2冊が著者順になっていることがわかりますね。
発行年順テキスト索引を利用して著者順、発行年順に並び替え検索の出力例
| |
SELECT title,author,year FROM text.clob_books b,TABLE(db2ext.textsearch('"ガーデ
ニング"','TEXT','IX_YEAR',0,10,CAST(NULL as char))) T WHERE T.primKey = B.id order by author,year desc
TITLE AUTHOR YEAR
---------------------------- ----------------- -----------
パンジーの育て方 佐藤 愛子 2002
洋ランの育て方 佐藤 愛子 2000
趣味の園芸4 田中 耕一郎 2003
趣味の園芸3 田中 耕一郎 2002
趣味の園芸 田中 耕一郎 1999
5 レコードが選択されました。
|
発行年順にソートされたテキスト索引を利用して検索した結果を著者順、発行年の最新順にSQLでソートした例です。
このようにテキスト索引は設定できますが、結果件数が少ないのであればSQLによる並び替えを行うことも柔軟にできます。
スコア順検索の出力例
| |
SELECT title,author,year,score FROM text.clob_books b,TABLE(db2ext.textsearch('
趣味"','TEXT','IX_AUTHOR',0,10,CAST(NULL as char))) T WHERE T.primKey = B.id order by score desc
TITLE AUTHOR YEAR SCORE
--------------- -------------- ----------- -----------------------
趣味の園芸3 田中 耕一郎 2002 +7.42664039134979E-001
趣味の園芸4 田中 耕一郎 2003 +7.42664039134979E-001
趣味の園芸 田中 耕一郎 1999 +7.12756335735321E-001
趣味の園芸2 田中 耕一郎 2001 +7.12756335735321E-001
4 レコードが選択されました。
|
検索語の頻度が高い文書が先に表示されるようにSCORE順にSQLでソートしました。
このようにあらかじめ決まった列の値の並び順だけでなく検索語の頻度による並び順表示も可能です。表示されているSCORE値は絶対値です。
10.まとめ
今まで3つのインタフェースによる検索方法をみてきましたが、いかがでしたか? 最後にそれぞれの特徴をまとめましょう。
| |
ストアード・プロシージャー
|
SQL表値関数
|
SQLスカラー関数
|
| データ取得方法 |
Stored Procedure db2text.textsearchをCALL |
SQL内でdb2ext.textsearch表値関数を使用 |
SQL内でスカラー検索関数(CONTAINS/
NOOFMATCHES/SCORE)
を使用 |
| 結果表の取得 |
・テキスト索引作成時に、表またはVIEWのどの列をユーザーに戻すかを指定
・このデータはキャッシュに保管される |
表値関数から戻された主キーより、結果表示に必要な列をSQLステートメントを発行して取得
|
CONTAINS SQL検索述部を含んだSQLステートメントを発行して必要な列を取得
|
| キャッシュの活動化 |
要 (ACTIVATE CACHEが必要) |
不要 |
不要 |
| 不定のSQL照会への対応 |
不可
(定義済みのキャッシュ表に対する照会) |
可
(任意のSQLステートメントに表値関数を使用できる) |
可
(任意のSQLステートメントにスカラー検索関数を使用できる) |
| VIEW上に作成されたテキスト索引の使用 |
可 |
可 |
不可 |
| 事前ソートされた複数のテキスト索引の利用 |
可 |
可 |
不可 |
| 注 |
キャッシュ・テーブルのためにメモリー容量が必要 |
基本表上に単一列の主キーが必要 |
テキスト索引名の指定ができないため、複数のテキスト索引の利用はできない |
|
NSE V8.1から新しいインタフェースとして登場したSQL表値関数は、 今までのインタフェースのそれぞれの良さを兼ね備え、高速で柔軟性のある検索方法となっています。パフォーマンス測定した結果もストアードプロシージャーと遜色のない高速な検索結果となっていますし、場合によっては一番早いケースもあります。さらに並び順への対応やリアルタイム更新している表との結合など柔軟で適用範囲の広いインタフェースと言えます。
唯一の欠点である単一列での主キーという制約事項をビュー作成により回避が可能であれば、 今後是非利用していきたい技術です。
最後に
以上、4回にわたりDB2 Net Search Extenderについて見てきました。
特にV8.1になり今まで別製品であったテキスト情報エキステンダーとの統合により3つのインタフェースが存在し、それぞれに使用方法・手順、制約事項が異なる為、それらの特徴を中心にまとめるように心がけました。製品統合により、V7.2までをお使いのお客様には同じインタフェースを提供しておりますので、そのままアプリケーションの移行も可能ですが、新しく使えるようになった他のインタフェースも特徴により使い分けをしていただくことも簡単になりました。
今回はマニュアルの例である本情報を元に日本語環境でかつXML文書を利用したサンプルを作成し機能を見てきましたが、これらのサンプルを参考に皆様の環境に合わせてカスタマイズしDB2
Net Search Extenderの機能を使っていくことが可能です。今回のご紹介が皆様への一助となれば、幸いです。
|