|
DB2 Net Search Extender(以下NSE)の3回目では、SQLスカラー関数でNSEが提供する いくつかの検索方法を使ってみましょう。
今回使うデータはXML文書とし、構造化文書を使用したテキスト索引の作り方、 およびタグに対する検索も行います。
XML文書を格納するデータタイプはVarcharでも、CLOBでも構いません。
XML文書での検索方法
XML文書を全文検索とする為の手順は以下の通りです。
前提は、
1.NSEインスタンスサービスが開始されていること
2. データベースがテキスト検索可能なこと
準備として
1. XML文書を用意します。
2. 文書モデルの定義を準備します。
以下の手順としては、テキスト文書の検索と表を作成するところから同一です。
3.表を作成する。
4.テキスト索引を作成する。
(今回はSQKスカラー関数での検索ですのでキャッシュオプション指定なしです。)
5.初期データをロードする。
6.テキスト索引を更新する。
7.テキスト索引で検索する
それでは、準備をはじめる前に構造化文書を使うメリットと考慮点について考えてみましょう。
構造化文書を使うメリット
DB内の列とテキスト検索の複合条件を指定したいような場合は、DB内のデータからタグを用いた構造化文書を生成し、テキスト索引を作成することにより、テキスト検索時にタグ指定検索をすることにより複合条件の検索が可能です。
(書名、著者、発行年月などとキーワードの複合検索)
今回は、構造化文書として、XML文書を用います。
NSEでは構造化文書の使用に際して、“文書モデル”を定義することにより、構造化文書の構造をNSEに知らせます。
XML文書を使う場合の考慮点
XML文書からテキスト索引を作成時、XMLParserによりXML文書が解釈されます。 いくつかの文字データについてはXML文書として特殊な意味を持つため、XML文書作成時に以下の変換が必要です。
& → &
< → <
> → >
これらの記号は、一般の文書内でも用いられることも多いので留意が必要です。
1.XML文書を用意します
XML文書の例
DBの列に入っていたデータをそれぞれ列名をタグ名として、 1行のデータが1文書になるように作ります。皆さんはファイルをそれぞれダウンロードして使用してください。
00000001.xml ( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
| |
<?xml version=“1.0” encoding="Shift_JIS"?>
<book>
<id>00000001</id>
<title>趣味の園芸</title> <author>田中 耕一郎</author>
<story>ガーデニングの初心者でもわかりやすく基礎から説明します</story>
<year>1999</year>
</book>
|
00000002.xml( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
| |
<?xml version=“1.0” encoding="Shift_JIS"?>
<book>
<id>00000002</id>
<title>洋ランの育て方</title> <author>佐藤 愛子</author>
<story>誰でも簡単に洋ランの育てることができます。 ガーデニングでも洋ランをどうぞ</story>
<year>2000</year>
</book>
|
00000003.xml( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
00000004.xml( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
00000005.xml( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
2.文書モデルの定義を準備する
それぞれのタグ名とタグとの関係を指定します。 今回の文書では1冊の本のデータをタグでくくり、その中にtitleやAuthorのような 本の属性タグを定義しています。
book.mdl( ダウンロード)
(右クリックで「対象をファイルに保存」でダウンロードしてください)
| |
<?xml version=“1.0” encoding="Shift_JIS"?>
<XMLModel>
<XMLFieldDefinition
name=‘id’
locator=“/book/id” />
<XMLFieldDefinition
name=‘author’
locator=“/book/author” />
<XMLFieldDefinition
name=‘title’
locator=“/book/title” />
<XMLFieldDefinition
name=‘story’
locator=“/book/story” />
<XMLFieldDefinition
name=‘year’
locator=“/book/year” />
</XMLModel>
|
注:このファイルの保管場所をテキスト索引作成時に指定します。
3.表を作成する
サンプル表を作成するには以下のようにDB2コマンドを実行します。
| |
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)
) ;”
|
このコマンドでAuthorやStory列にXML文書を格納するCLOB列を含む clob_books表が作成されます。
4.テキスト索引を作成する
テキスト索引を作成するには、以下のようにします。

このコマンドで、列clobにテキスト索引が作成されます。 テキスト索引の名前はtext.ix_xmlです。
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
|
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_xml FOR TEXT CONNECT TO sample”
|
7.テキスト索引で検索します
それではさっそくSQLスカラー検索関数の場合で検索をしてみましょう。
- フリーテキスト検索(XML文書の全文検索)
| |
select title,author,year from text.clob_books where contains (clob,'"育て方"')=1
TITLE AUTHOR YEAR
-------------------- -------------------------- -----------
洋ランの育て方 佐藤 愛子 2000
趣味の園芸2 田中 耕一郎 2001
2 レコードが選択されました。
|
上記の例ではCLOB列に入っているXML文書全文のテキスト検索をしていますので 書名に”育て方“ というキーワードが入っていなくでもタグ内に”育て方“が入っている
ので「趣味の園芸2」がHITしました。
- タグ指定検索(XML文書のタグ検索)
| |
select title,author,year from text.clob_books where contains (clob,'section("title") "育て方"')=1
TITLE AUTHOR YEAR
--------------------- ------------------------- -----------
洋ランの育て方 佐藤 愛子 2000
1 レコードが選択されました。
|
sectionでタグ名を指定することにより、上記の例では<title>タグに囲まれたデータにだけ”育て方“ というキーワードが入っている書名だけがHITしました。
- Attribute検索(XML文書の数値属性検索)
| |
select title,author,year from text.clob_books where contains (clob,'"ガーデニング" & attribute "NEW_YEAR" > 1999 ')=1
TITLE AUTHOR YEAR
--------------------- ------------------------ -----------
洋ランの育て方 佐藤 愛子 2000
1 レコードが選択されました。
|
2000年以降に発行された“ガーデニング”に関する書名検索をしてみましょう。
attribute検索として、テキスト索引作成時にあらかじめ数値属性に変更した時の別名 NEW_YEAR列に対して条件検索ができます。
参考
| |
select title,author,year from text.clob_books where contains (clob,'"ガーデニング"')=1
TITLE AUTHOR YEAR
---------------------- -------------------- -----------
趣味の園芸 田中 耕一郎 1999
洋ランの育て方 佐藤 愛子 2000
2 レコードが選択されました。
|
attribute検索を指定しないと1999年に発行された趣味の園芸がHITしますので、 数値条件が有効になっていることがわかりますね。
- あいまい検索
次にあいまい検索をしてみましょう。
はじめに「イギリス式」というキーワード検索をします。
| |
select title,author,story from text.clob_books where contains (clob,'"イギリス式"')=1
TITLE AUTHOR STORY
------------------------- -------------- -----------
イングリッシュガーデン 鈴木 太郎 イギリス式ガーデンの作り方
1 レコードが選択されました。
|
STORYタグの中にヒットしてイングリッシュガーデンという本が1冊HITしましたね。
次にあいまい検索をしてみます。
| |
select title,author,story from text.clob_books where contains (clob,'fuzzy form of 80 "イギリス式"')=1
TITLE AUTHOR STORY
-------------------- ------------- -----------
魔法辞典 中井 珠子 イギリスの魔女伝説から魔術用語の説明まで
イングリッシュガーデン 鈴木 太郎 イギリス式ガーデンの作り方
2 レコードが選択されました。
|
あいまい検索はfuzzy form of 80を追加するだけです。80はあいまい度を示し、数値が高い程 元のキーワードに似ているものがHITします。上記の例では1文字違いの「イギリス」というキーワードが
HITしましたね。
次に「ガーデン」であいまい検索をしてみましょう。
| |
select title,author,story from text.clob_books where contains (clob 'fuzzy form of 80 "ガーデン"')= 1
TITLE AUTHOR STORY
------------------------------ -------------- -----------
イングリッシュガーデン 鈴木 太郎 イギリス式ガーデンの作り方
1 レコードが選択されました。
|
80のあいまい度ではイングリッシュガーデンの1冊しかHITしませんでした。
もう少しあいまい度を下げてみましょう。
| |
select title,author,story from text.clob_books where contains (clob,'fuzzy form of 60 "ガーデン"')=1
TITLE AUTHOR STORY
--------------------- ------------- -----------------------------
趣味の園芸 田中 耕一郎 ガーデニングの初心者でもわかり やすく基礎から説明します
洋ランの育て方 佐藤 愛子 誰でも簡単に洋ランの育てること ができます。ガーデニングでも洋ランをどうぞ
イングリッシュガーデン 鈴木 太郎 イギリス式ガーデンの作り方
3 レコードが選択されました。
|
あいまい度を60に下げたところガーデニングもHIT対象になり、結果は3件HITしましたね。
このようにあいまい度を変えることにより検索結果が変わってきます。
- ブール演算検索
ブール演算検索とはAND,OR,NOTなどの複合条件検索のことです。
本の内容が「ガーデニング」でかつ「初心者」向けの本を探してみましょう。 本の内容は<STORY>タグですので、Section指定では(“story”)指定をして、キーワードを二つ
‘&’で結びましょう。
| |
select title,author,story from text.clob_books where contains (clob,'section("story") "ガーデニング" & "初心者"')=1
TITLE AUTHOR STORY
-------------------------- --------------- -----------
趣味の園芸 田中 耕一郎 ガーデニングの初心者 でもわかりやすく基礎から説明します
1 レコードが選択されました。
|
「趣味の園芸」がHITしましたね。
次にキーワードの複合条件検索だけでなく、キーワードとAttribute検索との複合検索を行い、 本の内容が「ガーデニング」に関することで発行年が2000年以降の本を探してみましょう。
| |
select title,author,year from text.clob_books where contains (clob,'section("story") "ガーデニング" & attribute "NEW_YEAR" > 1999 ')=1
TITLE AUTHOR YEAR
----------------- ---------------- -----------
洋ランの育て方 佐藤 愛子 2000
1 レコードが選択されました。
|
著者が田中さんで発行年が2001年以降のという検索をしてみましょう。
著者は<Author>タグですので、section指定では(“author”) “田中” と指定します。
| |
select title,author,year from text.clob_books where contains (clob,'section("author") "田中" & attribute "NEW_YEAR" > 2000 ')=1
TITLE AUTHOR YEAR
----------------- ------------------ -----------
趣味の園芸2 田中 耕一郎 2001
1 レコードが選択されました。
|
これで田中さんの作品の新しい本が検索できました。
8.まとめ
SQLスカラー関数を使用してXML文書による構造化文書のテキスト検索をみてきました。 構造化文書によるテキスト検索をすることによりフリー検索をするだけでなく、
書籍名や著者などタグ指定による絞り込みや発行年によるAttribute検索が出来るように なりました。clob_books表にはYEAR列を持っていますので、
以下のようにテキスト検索とSQL検索を併せて使用することもできます。
| |
select title,author,year from text.clob_books where contains (clob,‘section(“author”) “田中” ‘)=1 AND YEAR > 2000
|
しかしパフォーマンスはどうでしょうか?条件によっては2001年以降に発行された 書籍の数が多く、田中さんの書籍も多い場合、絞り込むタイミングは結果を返す
直前ですの膨大なデータ量から絞り込んだら数件だったということになりかねません。
XML文書のタグとして複合条件検索を行えばテキスト索引での検索時に絞り込めますので 効率が良く、パフォーマンスも良いことが期待されます。
このように構造化文書をテキスト索引にして検索する意味は大きく、便利なものです。
NSEでは他にもシソーラス検索などいろいろな検索方法もありますので、必要に応じて是非お試しください。
最後に
DB2 Net Search Extenderについての2回目となる今回は、SQLスカラー関数を利用してXML文書によるテキスト索引に対する検索をおこないました。
最終回となる次回は、ストアードプロシージャーや表値関数を利用して、複数テキスト索引に対しての検索を行い、3つのインターフェースのそれぞれの特徴についてまとめていきます。
|