SQL Serverでフリーテキスト検索をする手順を紹介します。
フルテキスト検索をする場合は、フルテキスト検索用のインデックス「フルテキストインデックス」を作成する必要があります。
フルテキストインデックスの作成手順については「SQL Server のフルテキストインデックスを作成する (SQL Server Management Studio を利用)」を参照してください。また、SQLでフルテキストインデックスを作成することもできます。SQLでのフルテキスト作成手順は「フルテキストインデックスをSQLで作成する」を参照してください、。
SQL Serverでフルテキスト検索をするには、Contains または Freetext を使用します。Contains と Freetextの違いは以下の通りです。
CONTAINS (または CONTAINSTABLE) は、単語または語句との完全一致検索やあいまい一致検索、特定の範囲内での近接検索、または重み付き検索に使用します。 CONTAINS を使用する場合は、検索するテキストを指定する検索条件を少なくとも 1 つ指定し、一致を判断する条件を指定する必要があります。
FREETEXT (または FREETEXTTABLE) は、指定した単語、語句、または文章 (freetext 文字列) の正確な文字列の並びではなく意味を照合する場合に使用します。 指定した列のフルテキスト インデックスに、用語または一定の形式の用語が見つかった場合は、一致すると判断されます。
書式は以下の通りになります。
select (列名) from (テーブル名) where contains(検索列名(複数ある場合は()でくくる), 検索キーワード)
select (列名) from (テーブル名) where freetext(検索列名(複数ある場合は()でくくる), 検索キーワード)
select * from info where contains((title,document),'キーワード')
空白を含む場合や、完全一致の場合は、キーワードをダブルクォーテーションで囲みます。
select * from info where contains((title,document),'"キーワード 発見"')
どちらかのワードを含む場合は、キーワードをorで区切ります。
select * from info where contains((title,document),'キーワード or 発見')
両方のワードを含む場合は、キーワードをandで区切ります。
select * from info where contains((title,document),'キーワード and 発見')
ワイルドカードを利用する場合は、ワードをダブルクォーテーションで囲みワイルドカードを「*」で表現します。
select * from info where contains((title,document),'"ワード*"')
select * from info where freetext((title,document),'キーワード')
空白を含む場合や、完全一致の場合は、キーワードをダブルクォーテーションで囲みます。
select * from info where freetext((title,document),'"キーワード 発見"')
どちらかのワードを含む場合は、キーワードをorで区切ります。
select * from info where freetext((title,document),'キーワード or 発見')
両方のワードを含む場合は、キーワードをandで区切ります。
select * from info where freetext((title,document),'キーワード and 発見')
ワイルドカードを利用する場合は、ワードをダブルクォーテーションで囲みワイルドカードを「*」で表現します。
select * from info where freetext((title,document),'"ワード*"')
以下のデータのテーブルを準備します。
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=1の「南国にすむペンギンです」の"ペンギン"にヒットして検索結果が表示されました。
結果を行ではなく、テーブルで返す場合は、CONTAINSTABLE, FREETEXTTABLEを利用できます。