日本語のSQL Server Full-Text検索エンジンを使用する場合の考慮事項

この記事では、日本語のSQL Server Full-Text検索エンジンを使用する場合に適用される考慮事項について説明します。

適用対象: SQL Server
元の KB 番号: 2252955

概要

日本語では、語句は 2 つ以上の単語で構成され、それらの単語の間にスペースがない場合があります。 Microsoft SQL Server では、SQL Server Full-Text検索エンジンを使用して日本語語句のプレフィックス検索を実行する場合、Full-Text 検索エンジンは語句をプレフィックス用語とは見なしません。 代わりに、Full-Text 検索エンジンは語句を単語用語と見なします。 これは、単語がスペースや句読点のない文字の文字列として定義されているためです。 さらに、検索エンジンはプレフィックス一致モードでのみ機能します。 検索エンジンはサフィックス一致モードでは機能しません。

詳細

たとえば、次のステートメントを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 の結果と同じであることがわかります。これは、Full-Text クエリがサフィックス一致モードでは機能しないためです。 さらに、 は、テスト一致するトークンとはテスト異なるポリシーテストトークンです。

    語句をトークン化するには、言語ファミリのワード ブレーカーを使用する必要があります。 作業ブレーカーは、スペースやその他の記号を使用してフレーズを認識します。 そのため、単語ブレーカーで認識できない語句や、日本語のエンジンを使用して検索できない Full-Text 語句もあります。 ワード ブレーカーの詳細については、「リファレンス」セクションの「Word ブレーカーとステマー」トピックを参照してください。

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

    フレーズを検索するキーワード (keyword)の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 テストテストの一時
    9 RE: テストテスト メール
    10 テストテスト メール
    11 テスト
    12 フィルタリングテスト

注:

SQL Serverで Full-Text 検索エンジンを使用する場合は、次のクエリを使用して、フルテキスト インデックスのコンテンツに関する詳細情報を確認できます。

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情報 2 2
0x006B006B kk 2
0x006C00690073007430C630B930C8一覧 2 1
0x00770068006900740065 ホワイト 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 ファイルの終わり 2 12
(影響を受ける 14 行)

サンプルの結果では、 という単語テストが含まれる行は 3 行だけです。Full-Text 検索エンジンは、"" という単語を"テストという単語テストメールとは異なるトークンとして扱います。 SQL Server Full-Text検索エンジンの詳細については、次の Microsoft Web サイトを参照してください。