次の方法で共有


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

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

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

はじめに

日本語では、語句は、それらの単語の間にスペースを含まない 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 の結果と同じであることがわかります。 さらに、 テスト は、 ポリシーテスト または照合の テスト とは異なるトークンです。

    語句をトークン化するには、言語ファミリのワード ブレーカーを使用する必要があります。 作業ブレーカーは、語句を認識するためにスペースやその他の記号を使用します。 そのため、一部の語句はワード ブレーカーでは認識できず、日本語のフルテキスト エンジンを使用して検索することはできません。 ワード ブレーカーの詳細については、「Reference」セクションの「Word Breakers and Stemmers トピック」を参照してください。

    日本語でフルテキスト検索エンジンを使用するベスト プラクティスは、語句をテストして、その語句が制限の影響を受けるかどうかを確認することです。 語句がスペースのない単語で構成されている場合、フルテキスト機能を使用して語句を検索することはできません。 代わりに、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 テスト4
    8 テストテストの
    9 RE: テスト テスト メール
    10 テスト テスト メール
    11 テスト
    12 フィルタリングテスト

Note

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

SELECT * FROM sys.dm_fts_index_keywords(db_id('test'), object_id('test'))
GO

この結果は次のようになります。

キーワード display_term column_id document_count
0x00660077 fw 2 1
0x0069006E0066006F0072006D006100740069006F006E情報 2 2
0x006B006B kk 2
0x006C00690073007430C630B930C8リストのテスト 2 1
0x00770068006900740065 ホワイト 2 1
0x30BF30A430C830EB30D530A330EB30BF30C630B930C80032タイトルのテスト 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 行だけです。フルテキスト検索エンジンは、単語 "テスト" を "テストメール" という単語とは異なるトークンとして扱います。 SQL Server フルテキスト検索エンジンの詳細については、次の Microsoft Web サイトを参照してください。