日本語の検索エンジン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 Breakers and Stemmers」参照 してください。

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

    次に、語句を検索するキーワード 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 テスト の設定
    8 テスト テストの設定 1
    9 RE: テスト テストのメール
    10 テスト テストのメール
    11 テスト
    12 フィルタリングテスト

注意

次のクエリで Full-Text 検索エンジンを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 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 行に単語が含まれます テスト 。このFull-Text検索エンジンは、"" という単語を テスト " という単語とは異なるトークン テストメール として扱います。 検索エンジンの詳細SQL Server Full-Text、次の Microsoft Web サイトを参照してください。