次の方法で共有


フルテキスト インデックスの作成時に言語を選択する

フルテキスト インデックスを作成するときは、インデックス付き列の列レベルの言語を指定する必要があります。 指定した言語の ワード ブレーカーとステマー は、列のフルテキスト クエリで使用されます。 フルテキスト インデックスを作成するときに列の言語を選択する場合は、いくつかの点を考慮する必要があります。 これらの考慮事項は、テキストがトークン化され、Full-Text エンジンによってインデックスが作成される方法に関連します。

フルテキスト インデックスの列に対して列レベルの言語を指定するには、列を指定するときに LANGUAGE language_term 句を使用します。 詳細については、「 CREATE FULLTEXT INDEX (Transact-SQL) 」および 「ALTER FULLTEXT INDEX (Transact-SQL)」を参照してください。

Full-Text 検索での言語サポート

このセクションでは、ワード ブレーカーとステマーの概要について説明し、フルテキスト検索で列レベル言語の LCID を使用する方法について説明します。

ワード ブレーカーとステマーの概要

SQL Server 2008 以降のバージョンには、ワード ブレーカーとステマーの完全な新しいファミリが含まれています。このファミリは、以前に SQL Server で利用できるファミリよりも大幅に優れています。

Microsoft 自然言語グループ (MS NLG) は、これらの新しい言語コンポーネントを実装し、サポートしています。

新しいワード ブレーカーには、次の利点があります。

  • 頑健性

    テストでは、新しいワード ブレーカーが高圧クエリ環境で堅牢であることが示されています。

  • 安全

    言語コンポーネントのセキュリティが強化され、SQL Server では新しいワード ブレーカーが既定で有効になります。 SQL Server の全体的なセキュリティと堅牢性を向上させるために、ワード ブレーカーやフィルターなどの外部コンポーネントに署名することを強くお勧めします。 フルテキストを構成して、これらのコンポーネントが次のように署名されていることを確認できます。

    EXEC sp_fulltext_service 'verify_signature';  
    
  • 品質

    ワード ブレーカーが再設計され、テストでは、新しいワード ブレーカーが以前のワード ブレーカーよりも優れたセマンティック品質を提供していることが示されています。 これにより、再現率が向上します。

  • さまざまな言語の一覧を対象に、ワード ブレーカーは SQL Server にすぐに含まれており、既定で有効になっています。

SQL Server にワード ブレーカーとステミング機能が含まれている言語の一覧については、「 sys.fulltext_languages (Transact-SQL)」を参照してください。

Full-Text 検索で Column-Level 言語の名前を使用する方法

フルテキスト インデックスを作成するときは、各列に有効な言語名を指定する必要があります。 言語名が有効であっても 、sys.fulltext_languages (Transact-SQL) カタログ ビューによって返されない場合、フルテキスト検索は、同じ言語ファミリの使用可能な最も近い言語名 (存在する場合) にフォールバックします。 それ以外の場合、フルテキスト検索はニュートラル ワード ブレーカーにフォールバックします。 このフォールバック動作は、再現率に影響する可能性があります。 そのため、フルテキスト インデックスを作成するときは、各列に有効で使用可能な言語名を指定することを強くお勧めします。

LCID は、フルテキスト インデックス作成の対象となるすべてのデータ型 ( charncharなど) に対して使用されます。 charvarchar、またはtext型の列の並べ替え順序が LCID で識別される言語とは異なる言語設定に設定されている場合、LCID は、フルテキスト インデックス作成とそれらの列のクエリ中に使用されます。

単語区切り

ワード ブレーカーは、言語固有の単語境界でインデックスが作成されるテキストをトークン化します。 そのため、単語区切りの動作は言語によって異なります。 1 つの言語 x を使用して複数の言語 {x、y、および z} にインデックスを付ける場合、一部の動作で予期しない結果が発生する可能性があります。 たとえば、ダッシュ (-) やコンマ (,) は、ある言語では破棄されるが、別の言語ではそのまま残る単語区切り要素である可能性があります。 また、特定の単語が異なる言語で異なる語幹を発する可能性があるため、予期しないステミング動作が発生することはほとんどありません。 たとえば、英語では、単語の境界は通常、空白または何らかの形式の句読点です。 ドイツ語などの他の言語では、単語または文字を組み合わせることができます。 そのため、選択する列レベルの言語は、その列の行に格納される言語を表す必要があります。

西洋言語

西洋言語ファミリでは、列に格納される言語が不明な場合や、複数の言語を格納することが予想される場合は、一般的な回避策として、列に格納される可能性がある最も複雑な言語にワード ブレーカーを使用します。 たとえば、英語、スペイン語、ドイツ語のコンテンツを 1 つの列に格納することが想定される場合があります。 これらの3つの西洋言語は非常に似た単語区切りのパターンを持ち、ドイツ語のパターンは最も複雑です。 したがって、この場合は、英語とスペイン語のテキストを正しく処理できるドイツ語のワード ブレーカーを使用することをお勧めします。 これに対し、英語のワード ブレーカーでは、ドイツ語の複合語が原因で、ドイツ語のテキストが完全に処理されない場合があります。

言語ファミリで最も複雑な言語のワード ブレーカーを使用しても、ファミリ内のすべての言語の完全なインデックス作成が保証されるわけではないことに注意してください。 最も複雑なワード ブレーカーが別の言語で記述されたテキストを正しく処理できない特別なケースが存在する場合があります。

非西洋言語

英語以外の言語 (中国語、日本語、ヒンディー語など) の場合、上記の回避策は言語上の理由から必ずしも機能するとは限りません。 英語以外の言語の場合は、次のいずれかの回避策を検討してください。

  • 異なる家族の言語の場合

    列にスペイン語や日本語など、大幅に異なる言語が含まれている場合は、異なる言語の内容を別々の列に格納することを検討してください。 これにより、各列に言語固有のワード ブレーカーを使用できます。 このソリューションを選択し、クエリ時にクエリ言語がわからない場合は、両方の列に対してクエリを発行して、クエリが適切な行またはドキュメントを確実に見つけられるようにする必要があります。

  • バイナリ コンテンツ (Microsoft Word 文書など) の場合

    インデックス付きコンテンツが binary の種類の場合、テキスト コンテンツをワード ブレーカーに送信する前に処理するフルテキスト検索フィルターでは、バイナリ ファイル内に存在する特定の言語タグが優先される場合があります。 この場合、インデックス作成時に、フィルターはドキュメントまたはドキュメントのセクションに対して適切な LCID を出力します。 その後、Full-Text エンジンは、その LCID を持つ言語のワード ブレーカーを呼び出します。 ただし、複数言語コンテンツのインデックスを作成した後は、コンテンツのインデックスが正しく作成されたことを確認することをお勧めします。

  • プレーン テキスト コンテンツの場合

    コンテンツがプレーン テキストの場合は、 xml データ型に変換し、各特定のドキュメントまたはドキュメント セクションに対応する言語を示す言語タグを追加できます。 ただし、これを機能させるには、フルテキスト インデックス作成の前に言語を把握しておく必要があります。

語幹検索

列レベルの言語を選択する際に考慮すべき追加の要素は、ステミングです。 フルテキスト クエリでのステミングは、特定の言語で単語のすべての語幹 (変曲) 形式を検索するプロセスです。 汎用ワード ブレーカーを使用して複数の言語を処理する場合、ステミング プロセスは列に指定された言語に対してのみ機能し、列内の他の言語では機能しません。 たとえば、ドイツ語のステマーは、英語やスペイン語 (など) では機能しません。 これは、クエリ時に選択した言語によっては、呼び戻しに影響する可能性があります。

列の種類が Full-Text 検索に及ぼす影響

言語の選択に関するもう 1 つの考慮事項は、データの表現方法に関連しています。 varbinary(max)列に格納されていないデータの場合、特別なフィルター処理は実行されません。 代わりに、テキストは一般的に単語区切りコンポーネント as-isを介して渡されます。

また、ワード ブレーカーは、主に書かれたテキストを処理するように設計されています。 そのため、テキストに任意の種類のマークアップ (HTML など) がある場合、インデックス作成と検索中に言語的な精度が向上しない可能性があります。 その場合、2 つの選択肢があります。推奨される方法は、テキスト データを varbinary(max) 列に格納し、ドキュメントの種類を示してフィルター処理することです。 これがオプションでない場合は、ニュートラル ワード ブレーカーの使用を検討し、可能であれば、マークアップ データ (HTML の "br" など) をノイズ ワード リストに追加することを検討してください。

ニュートラル言語を指定しても、言語ベースのステミングは機能しません。

Full-Text クエリでの既定以外の Column-Level 言語の指定

既定では、SQL Server では、フルテキスト検索では、フルテキスト句に含まれる各列に対して指定された言語を使用してクエリ用語が解析されます。 この動作をオーバーライドするには、クエリ時に既定以外の言語を指定します。 リソースがインストールされているサポートされている言語の場合、CONTAINS、CONTAINSTABLE、FREETEXT、または FREETEXTTABLE クエリの LANGUAGE language_term句を使用して、クエリ用語の単語区切り、ステミング、類義語辞典、およびストップワード処理に使用される言語を指定できます。

こちらもご覧ください

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
データ型 (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
検索用フィルターの構成と管理
sp_fulltext_service (Transact-SQL)
sys.fulltext_languages (Transact-SQL)
検索用のワード ブレーカーとステミング機能の構成と管理