SQL Server でのフルテキストインデックスを利用した フリーテキスト検索 - SQL Server

SQL Serverでフリーテキスト検索をする手順を紹介します。

フルテキストインデックスの作成

フルテキスト検索をする場合は、フルテキスト検索用のインデックス「フルテキストインデックス」を作成する必要があります。
フルテキストインデックスの作成手順については「SQL Server のフルテキストインデックスを作成する (SQL Server Management Studio を利用) (SQL Server Tips)」を参照してください。また、SQLでフルテキストインデックスを作成することもできます。SQLでのフルテキスト作成手順は「フルテキストインデックスをSQLで作成する (SQL Server Tips)」を参照してください、。

フルテキスト検索

SQL Serverでフルテキスト検索をするには、Contains または Freetext を使用します。Contains と Freetextの違いは以下の通りです。

Contains

CONTAINS (または CONTAINSTABLE) は、単語または語句との完全一致検索やあいまい一致検索、特定の範囲内での近接検索、または重み付き検索に使用します。 CONTAINS を使用する場合は、検索するテキストを指定する検索条件を少なくとも 1 つ指定し、一致を判断する条件を指定する必要があります。

Freetext

FREETEXT (または FREETEXTTABLE) は、指定した単語、語句、または文章 (freetext 文字列) の正確な文字列の並びではなく意味を照合する場合に使用します。 指定した列のフルテキスト インデックスに、用語または一定の形式の用語が見つかった場合は、一致すると判断されます。

書式

書式は以下の通りになります。

Contains

select (列名) from (テーブル名) where contains(検索列名(複数ある場合は()でくくる), 検索キーワード)

Freetext

select (列名) from (テーブル名) where freetext(検索列名(複数ある場合は()でくくる), 検索キーワード)

SQL例

Containsの例

 select * from info where contains((title,document),'キーワード')

空白を含むワード

空白を含む場合や、完全一致の場合は、キーワードをダブルクォーテーションで囲みます。
 select * from info where contains((title,document),'"キーワード 発見"')

ORの利用

どちらかのワードを含む場合は、キーワードをorで区切ります。
 select * from info where contains((title,document),'キーワード or 発見')

ANDの利用

両方のワードを含む場合は、キーワードをandで区切ります。
 select * from info where contains((title,document),'キーワード and 発見')

ワイルドカードの利用

ワイルドカードを利用する場合は、ワードをダブルクォーテーションで囲みワイルドカードを「*」で表現します。
 select * from info where contains((title,document),'"ワード*"')

FreeTextの例

 select * from info where freetext((title,document),'キーワード')

空白を含むワード

空白を含む場合や、完全一致の場合は、キーワードをダブルクォーテーションで囲みます。
 select * from info where freetext((title,document),'"キーワード 発見"')

ORの利用

どちらかのワードを含む場合は、キーワードをorで区切ります。
 select * from info where freetext((title,document),'キーワード or 発見')

ORの利用

両方のワードを含む場合は、キーワードをandで区切ります。
 select * from info where freetext((title,document),'キーワード and 発見')

ワイルドカードの利用

ワイルドカードを利用する場合は、ワードをダブルクォーテーションで囲みワイルドカードを「*」で表現します。
 select * from info where freetext((title,document),'"ワード*"')

以下のデータのテーブルを準備します。
idnamevaluecategorymemo
1Penguin300B南国にすむペンギンです
2Whale420M北極海のクジラです
3Duck120Bそこらへんのアヒルです
4Camel220M砂漠にすむラクダです
5Owl90B関東のフクロウです

下記のSQLを実行します。
select * from Working where contains((name,memo),'ペンギン')


SQLの実行結果が表示されます。id=1の「南国にすむペンギンです」の"ペンギン"にヒットして検索結果が表示されました。


CONTAINSTABLE, FREETEXTTABLE

結果を行ではなく、テーブルで返す場合は、CONTAINSTABLE, FREETEXTTABLEを利用できます。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2024-01-07
作成日: 2009-05-28
iPentec all rights reserverd.