今週、SQL Server の類義語について気になったので、検証してみます。折角、Windows Azure の日本データセンターが稼働したので、日本のリージョン(日本(東))で検証してみましょう。
日本 DC は、ネットワークレイテンシが他の DC に比べて三倍良いそうですね。仮想サーバを全部日本国内に移動しようかな。
仮想サーバの作成も、他の DC に比べ高速な気がします。それでは早速類義語の検証をしてみましょう。あら、間違えて Windows Server 2008R2、SQL Server 2012 をデプロイしてしまいました....
類義語検証のデータとテーブルレイアウトは下記の通りとしました。まず、データです。※文章は、ここを参考にしています。
■文章1
#a.急性咳嗽(6) 特に基礎疾患のない50代女性の鼻・喉・咳症状。全身状態良好で胸部異常所見を伴わない。 Definite:急性上気道炎→特に矛盾はしない。 Less likely:異型肺炎は否定できないが経過をみて判断する。 Unlikely:肺癌のリスクあるが,経過・検診結果から可能性低い。 #b.肺癌への不安(7) 不安定な家計に身内の不幸が加わり不安が強まったようだ。病的な不安神経症・うつ病の印象はなく,理解力も良さそう。 #1.喫煙(8) 肺癌に限らず悪性腫瘍や心血管疾患のリスクがあり,現時点で最も健康への影響が大きい。幸い#a/bから禁煙への関心が高まっている。
■文章2
#a.急性咳嗽(6) 特に基礎疾患のない50代女性の鼻・喉・咳症状。全身状態良好で胸部異常所見を伴わない。 Definite:急性上気道炎→特に矛盾はしない。 Less likely:異型肺炎は否定できないが経過をみて判断する。 Unlikely:肺癌のリスクあるが,経過・検診結果から可能性低い。 #b.肺癌への不安(7) 不安定な家計に身内の不幸が加わり不安が強まったようだ。病的な不安神経症・うつ病の印象はなく,理解力も良さそう。 #1.喫煙(8) 肺癌に限らず悪性新生物や心血管疾患のリスクがあり,現時点で最も健康への影響が大きい。幸い#a/bから禁煙への関心が高まっている。
上記の文章1,2 を下記のテーブルに格納します。chartdocument 列にフルテキストインデックスを定義しています。
各々の文章の違いは、太文字に下線が引っ張ってある、『悪性腫瘍』『悪性新生物』です。これらの単語は同義語です。SQL Server の全文検索で同義語と認識させるには、tsjpn.xml ファイルに設定する必要があります。格納場所は下記の通りです。
tsjpn.xml の内容は下記の通りです。
<XML ID="Microsoft Search Thesaurus"> <!-- Commented out (SQL Server 2008) <thesaurus xmlns="x-schema:tsSchema.xml"> <diacritics_sensitive>0</diacritics_sensitive> <expansion> <sub>Internet Explorer</sub> <sub>IE</sub> <sub>IE5</sub> </expansion> <replacement> <pat>NT5</pat> <pat>W2K</pat> <sub>Windows 2000</sub> </replacement> <expansion> <sub>run</sub> <sub>jog</sub> </expansion> </thesaurus> --> </XML>
tsjpn.xml を下記のように変更し、保存します。
<XML ID="Microsoft Search Thesaurus"> <thesaurus xmlns="x-schema:tsSchema.xml"> <diacritics_sensitive>0</diacritics_sensitive> <expansion> <sub>悪性腫瘍</sub> <sub>悪性新生物</sub> </expansion> </thesaurus> </XML>
tsjpn.xml 保存後、SQL Server Management Studio で下記のコマンドを実行します。このコマンドを実行することで、tempdb 上に情報がロードされます。ということは、再起動を行った場合は、毎回下記のコマンドを実行する必要があるんですね。
USE database_name ; EXEC sys.sp_fulltext_load_thesaurus_file 1041; GO
※LCID の一覧をここを参照してください。
以上で準備は終わりです。早速クエリを投げてみましょう。クエリは下記の通りです。
Select * from TestDB.dbo.chart where CONTAINS(chartdocument, ' FORMSOF (THESAURUS , 悪性新生物) '); Select * from TestDB.dbo.chart where CONTAINS(chartdocument, ' FORMSOF (THESAURUS , 悪性腫瘍) ');
実行結果は下記の通りです。それぞれのクエリの結果として、2レコード返されています。類義語設定がきちんと反映されているようです。
同義語の数ってどのくらいいけるんでしょうか?tempdb に展開されるということは、類義語検索を行った場合、tempdb 側にも負荷がかかるんですよね。FORMSOF句も付加するのではなく、必要時のみ付加するなど、実際のシステムに組み込む場合は、少し考えないといけないですね。
----------
※参考までに、同義語・類義語に関するテーブルを以下のクエリで抽出することが可能です。
SELECT * FROM tempdb.sys.objects WHERE type = 'IT' AND name like ('FullText%')
----------
※洋書だと、フルテキスト本もあるんですね。いいなぁ。
Pro Full-Text Search in SQL Server 2008
- 作者: Michael Coles,Hilary Cotter
- 出版社/メーカー: Apress
- 発売日: 2008/12/10
- メディア: ペーパーバック
- クリック: 4回
- この商品を含むブログを見る
Pro Full-Text Search in SQL Server 2008 (Expert's Voice in SQL Server)
- 作者: Hilary Cotter,Michael Coles
- 出版社/メーカー: Apress
- 発売日: 2008/12/02
- メディア: Kindle版
- この商品を含むブログを見る