SQL Serverでフルテキスト検索で検索結果にヒットしない現象への対象法を紹介します。
現象の確認
以下のデータのテーブルを準備します。
Working テーブル
id | name | value | category | memo |
1 | Penguin | 300 | B | 南国にすむペンギンです |
2 | Whale | 420 | M | 北極海のクジラです |
3 | Duck | 120 | B | そこらへんのアヒルです |
4 | Camel | 220 | M | 砂漠にすむラクダです |
5 | Owl | 90 | B | 関東のフクロウです |
次のSQLを実行します。
select * from Working where contains((name,memo),'北')
上記のSQLを実行した結果が下図となります。
検索結果にヒットするレコードがないことが確認できます。ID=2のレコードのmemoフィールドに"北極海のクジラです"に"北"の文字が存在するため、検索結果にヒットしてもよさそうですが、ヒットしません。これは、フルテキストインデックス作成の際に言語分析を実行して単語単位で区切りを入れているため、「北極海」と「北」が同一のものではないと判定されてしまうためです。
ワードブレイクを考慮しない検索を実行する場合
ワードブレイクを考慮せず、単語が含まれるかどうかの検索を実行する場合は、"*"を利用して、プレフィックス検索を実行します。
下記のSQLを実行します。
select * from Working where contains((name,memo),'"*北*"')
テキストとアスタリスクを二重引用符で囲まなかった場合、フルテキスト検索ではアスタリスクはワイルドカードとして認識しないので注意が必要です。
SQLの実行結果は下図となります。ID=2のレコードが検索結果でヒットしています。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2015-09-17
作成日: 2015-09-16