都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

SQL Server の同義語について気になってしまったので、同義語の動作について少し調べてみた

 今週、SQL Server の類義語について気になったので、検証してみます。折角、Windows Azure の日本データセンターが稼働したので、日本のリージョン(日本(東))で検証してみましょう。

f:id:koogucc11:20140301180828p:plain

 日本 DC は、ネットワークレイテンシが他の DC に比べて三倍良いそうですね。仮想サーバを全部日本国内に移動しようかな。

f:id:koogucc11:20140301181227p:plain

 仮想サーバの作成も、他の 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 列にフルテキストインデックスを定義しています。

f:id:koogucc11:20140302135126p:plain

f:id:koogucc11:20140302135206p:plain

 各々の文章の違いは、太文字に下線が引っ張ってある、『悪性腫瘍』『悪性新生物』です。これらの単語は同義語です。SQL Server全文検索で同義語と認識させるには、tsjpn.xml ファイルに設定する必要があります。格納場所は下記の通りです。

f:id:koogucc11:20140301221202p:plain

 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レコード返されています。類義語設定がきちんと反映されているようです。

f:id:koogucc11:20140302142417p:plain

 同義語の数ってどのくらいいけるんでしょうか?tempdb に展開されるということは、類義語検索を行った場合、tempdb 側にも負荷がかかるんですよね。FORMSOF句も付加するのではなく、必要時のみ付加するなど、実際のシステムに組み込む場合は、少し考えないといけないですね。

 

----------

※参考までに、同義語・類義語に関するテーブルを以下のクエリで抽出することが可能です。

SELECT * FROM tempdb.sys.objects WHERE type = 'IT' AND name like ('FullText%')

f:id:koogucc11:20140302144449p:plain

----------

※洋書だと、フルテキスト本もあるんですね。いいなぁ。 

Pro Full-Text Search in SQL Server 2008

Pro Full-Text Search in SQL Server 2008

 
Pro Full-Text Search in SQL Server 2008 (Expert's Voice in SQL Server)

Pro Full-Text Search in SQL Server 2008 (Expert's Voice in SQL Server)