日本語の検索エンジンを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':::no-loc text="添付テスト":::')
INSERT test VALUES(2,N':::no-loc text="Fw: テスト":::')
INSERT test VALUES(3,N':::no-loc text="KK-Information:テスト":::')
INSERT test VALUES(4,N':::no-loc text="[Q] ポリシーテスト":::')
INSERT test VALUES(5,N':::no-loc text="KK-Information:タイトルフィルタテスト2":::')
INSERT test VALUES(6,N':::no-loc text="テスト":::')
INSERT test VALUES(7,N':::no-loc text="フィルタテスト3":::')
INSERT test VALUES(8,N':::no-loc text="テストフィルタ1":::')
INSERT test VALUES(9,N':::no-loc text="RE: テストメール":::')
INSERT test VALUES(10,N':::no-loc text="テストメール":::')
INSERT test VALUES(11,N':::no-loc text="White Listテスト":::')
INSERT test VALUES(12,N':::no-loc text="フィルタリングテスト":::')

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':::no-loc text="テスト":::')
    

    クエリ 1 の結果は次のようになります。

    c1c2

    2Fw: テスト
    3KK-Information:テスト
    6テスト

  • クエリ 2

    SELECT * FROM test WHERE CONTAINS(c2, '":::no-loc text="テスト*":::"')
    

    クエリ 2 の結果は次のようになります。

    c1c2
    2 Fw: テスト
    3 KK-Information:テスト
    6 テスト
    8 テストフィルタ1
    9 RE: テストメール
    10 テストメール

  • クエリ 3

    SELECT * FROM test WHERE CONTAINS(c2, '"*:::no-loc text="テスト":::*"')
    

    クエリ 3 の結果は次のようになります。

    c1c2
    2 Fw: テスト
    3 KK-Information:テスト
    6 テスト
    8 テストフィルタ1
    9 RE: テストメール
    10 テストメール

    クエリの結果から見て、クエリ 2 の結果がクエリ 3 の結果と同じになるのは、Full-Text クエリがサフィックス一致モードで機能しないのでです。 さらに、 テスト 一致とは異なるトークン ポリシーテスト テスト です。

    語句をトークン化するには、言語ファミリのワード ブレーカーを使用する必要があります。 ワーク ブレーカーは、語句を認識するためにスペースや他の記号を使用します。 したがって、一部の語句はワード ブレーカーで認識できないので、日本語の Full-Text エンジンを使用して検索することはできません。 ワード ブレーカーの詳細については、「リファレンス」の「 ワード ブレーカーとステマー」を 参照 してください。

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

    語句を検索するキーワードのサンプル クエリを次 like に示します。

  • クエリ 4

    SELECT * FROM test WHERE c2 like ':::no-loc text="テスト":::%'
    

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

    c1c2
    6 テスト
    8 テストフィルタ1
    10 テストメール

  • クエリ 5

    SELECT * FROM test WHERE c2 like '%:::no-loc text="テスト":::%'
    

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

    c1c2
    1 添付テスト
    2 Fw: テスト
    3 KK-Information:テスト
    4 [Q] ポリシーテスト
    5 KK-Information:タイトルフィルタテスト2
    6 テスト
    7 テスト つのサイト
    8 テスト テストの条件 1
    9 RE: テスト メールをテストする
    10 テスト 件のメール
    11 テスト
    12 フィルタリングテスト

注意

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

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 information 2 2
0x006B006B kk 2
0x006C00690073007430C630B930C8 リスト 2 1
0x00770068006900740065 white 2 1
0x30BF30A430C830EB30D530A330EB30BF30C630B930C80032 一時テスト 2 1
0x30C630B930C8 テスト 2 3
0x30C630B930C830D530A330EB30BF0031 テストの条件 1 2 1
0x30C630B930C830E130FC30EB のメール 2 2
0x30D530A330EB30BF30C630B930C8003300 3 1
0x30D530A330EB30BF30EA30F330B030C630B930C8 もの 2 1
0x30DD30EA30B730FC30C630B930C8 2 1
0x6DFB4ED830C630B930C8 2 1
0xFF END OF FILE 2 12
(影響を受ける 14 行)

サンプルの結果では、単語を含む行は 3 行のみです テスト 。The Full-Text search engine treats the word テスト " as a テストメール different token from the word ". 検索エンジンの詳細については、SQL Server Full-Text Microsoft の Web サイトを参照してください。