日本語用の SQL Server フルテキスト検索エンジンを使用する場合の考慮事項

適用対象: SQL Server 2008 StandardSQL Server 2008 DeveloperSQL Server 2008 Enterprise 詳細

はじめに


この資料では、日本語用の SQL Server フルテキスト検索エンジンを使用する場合に適用される考慮事項について説明します。

詳細


日本語では、語句は、単語の間にスベースのない 2 つ以上の単語から構成されている場合があります。Microsoft SQL Server では、SQL Server フルテキスト検索エンジンを使用して日本語の語句のプレフィックス検索を実行する場合、フルテキスト検索エンジンでは語句はプレフィックス用語であるとは見なされません。代わりに、フルテキスト検索エンジンでは、語句は単語用語であると見なされます。これは、単語が、スベースや区切り文字のない、文字からなる文字列として定義されているためです。また、検索エンジンはプレフィックス一致モードのみで動作します。検索エンジンはサフィックス一致モードでは動作しません。

たとえば、SQL Server で以下のステートメントを実行して、テーブルを作成し、複数の日本語の語句を挿入します。
CREATE TABLE test(c1 int PRIMARY KEY,c2 nvarchar(255))

INSERT test VALUES(1,N'添付テスト')
INSERT test VALUES(2,N'Fw: テスト')
INSERT test VALUES(3,N'KK-Information:テスト')
INSERT test VALUES(4,N'[Q] ポリシーテスト')
INSERT test VALUES(5,N'KK-Information:タイトルフィルタテスト2')
INSERT test VALUES(6,N'テスト')
INSERT test VALUES(7,N'フィルタテスト3')
INSERT test VALUES(8,N'テストフィルタ1')
INSERT test VALUES(9,N'RE: テストメール')
INSERT test VALUES(10,N'テストメール')
INSERT test VALUES(11,N'White Listテスト')
INSERT test VALUES(12,N'フィルタリングテスト')

CREATE FULLTEXT CATALOG test AS DEFAULT;
GO

CREATE FULLTEXT INDEX ON test(c2) KEY INDEX PK__<IndexName>;
GO


続いて、以下の 3 つのクエリを実行します。
クエリ 1
SELECT * FROM test WHERE CONTAINS(c2, N'テスト')
クエリ 1 の結果は次のようになります。
c1c2
--- ----------------------------------------------
2Fw: テスト
3KK-Information:テスト
6テスト
クエリ 2
SELECT * FROM test WHERE CONTAINS(c2, '"テスト*"')
クエリ 2 の結果は次のようになります。
c1c2
--- ----------------------------------------------
2 Fw: テスト
3 KK-Information:テスト
6 テスト
8 テストフィルタ1
9 RE: テストメール
10 テストメール
クエリ 3
SELECT * FROM test WHERE CONTAINS(c2, '"*テスト*"')
クエリ 3 の結果は次のようになります。
c1c2
--- ----------------------------------------------
2 Fw: テスト
3 KK-Information:テスト
6 テスト
8 テストフィルタ1
9 RE: テストメール
10 テストメール


クエリの結果から、クエリ 2 の結果はクエリ 3 の結果と同じであることがわかります。これは、フルテキスト クエリがサフィックス一致モードで動作していないためです。また、"テスト" は、一致ににある "ポリシーテスト" または "White List テスト" とは異なるトークンです。

語句をトークン化するには、言語ファミリ用のワード ブレーカーを使用する必要があります。ワード ブレーカーはスペースなどの記号を使用して語句を認識します。そのため、一部の語句はワード ブレーカーにより認識することができず、日本語でフルテキスト エンジンを使用して検索することができません。ワード ブレーカーの詳細については、「関連情報」の「ワード ブレーカーとステミング機能」を参照してください。

日本語でフルテキスト検索エンジンを使用する場合のベスト プラクティスとしては、語句をテストして、語句が制限により影響を受けるかどうかを確認します。語句がスペースのない単語から構成されている場合は、フルテキスト機能を使用して語句を検索することはできません。代わりに、LIKE キーワードとワイルドカード文字を組み合わせて使用する方法があります。ただし、LIKE 処理のパフォーマンスは、フルテキスト検索のパフォーマンスよりも低くなります。アプリケーションに対するパフォーマンスの影響を考慮する必要があります。

語句を検索するための LIKE キーワードのサンプル クエリを以下に示します。

クエリ 4
SELECT * FROM test WHERE c2 like 'テスト%'
結果は次のようになります。
c1c2
--- ----------------------------------------------
6 テスト
8 テストフィルタ1
10 テストメール
クエリ 5
SELECT * FROM test WHERE c2 like '%テスト%'
結果は次のようになります。
c1c2
--- ----------------------------------------------
1 添付テスト
2 Fw: テスト
3 KK-Information:テスト
4 [Q] ポリシーテスト
5 KK-Information:タイトルフィルタテスト2
6 テスト
7 フィルタテスト3
8 テストフィルタ1
9 RE: テストメール
10 テストメール
11 White Listテスト
12 フィルタリングテスト






 
: SQL Server 2008 以降のバージョンでフルテキスト検索エンジンを使用する場合、次のクエリを使用すると、フルテキスト インデックスの内容に関する詳細情報を確認することができます。
SELECT * FROM sys.dm_fts_index_keywords(db_id('test'), object_id('test'))
GO
結果は次のようになります。
keyword                                               display_term             column_id   document_count
----------------------------------------------------- ------------------------ ----------- --------------------

0x00660077 fw 2 1
0x0069006E0066006F0072006D006100740069006F006E information 2 2
0x006B006B kk 2 2
0x006C00690073007430C630B930C8 listテスト 2 1
0x00770068006900740065 white 2 1
0x30BF30A430C830EB30D530A330EB30BF30C630B930C80032 タイトルフィルタテスト2 2 1
0x30C630B930C8 テスト 2 3
0x30C630B930C830D530A330EB30BF0031 テストフィルタ1 2 1
0x30C630B930C830E130FC30EB テストメール 2 2
0x30D530A330EB30BF30C630B930C80033 フィルタテスト3 2 1
0x30D530A330EB30BF30EA30F330B030C630B930C8 フィルタリングテスト 2 1
0x30DD30EA30B730FC30C630B930C8 ポリシーテスト 2 1
0x6DFB4ED830C630B930C8 添付テスト 2 1
0xFF END OF FILE 2 12

(14 件処理されました)
サンプル結果では、3 行にのみ単語 "テスト" が含まれています。フルテキスト検索エンジンでは、単語 "テスト" を、単語 "テストメール" とは異なるトークンとして扱います。