適用対象:SQL Server
Azure SQL データベース
フルテキスト インデックスを作成する際には、列レベルの言語をインデックス列に対して指定する必要があります。 指定した言語の ワード ブレーカーとステマー は、列のフルテキスト クエリで使用されます。 フルテキスト インデックスの作成時に列の言語を選択する際には、注意点が 2 つあります。 これらの考慮事項は、テキストがトークン化され、Full-Text エンジンによってインデックスが作成される方法に関連します。
Note
フルテキスト インデックスの列に対して列レベルの言語を指定するには、列を指定するときに LANGUAGE <language_term> 句を使用します。 詳細については、「 CREATE FULLTEXT INDEX 」および 「ALTER FULLTEXT INDEX」を参照してください。
Full-Text Search での言語サポート
このセクションでは、ワード ブレーカーとステミング機能の概要について説明し、Full-Text Search で列レベル言語の言語コード識別子 (LCID) を使用する方法について説明します。
ワード ブレーカーとステマーの概要
SQL Server には、ワード ブレーカーとステマーの完全なファミリが含まれています。 Microsoft 自然言語グループ (NLG) は、これらの言語コンポーネントを実装し、サポートしています。
ワード ブレーカーには、次の利点があります。
保全性
テストでは、ワード ブレーカーが高圧クエリ環境で堅牢であることを示しています。
セキュリティ
ワード ブレーカーは、SQL Server では既定で有効になっています。 SQL Server の全体的なセキュリティと堅牢性を強化するためには、ワード ブレーカーやフィルターなどの外部コンポーネントに署名することを強くお勧めします。 次のようにフルテキストを構成すると、これらのコンポーネントが署名されていることを確認できます。
EXECUTE sp_fulltext_service 'verify_signature';品質
内部テストでは、ワード ブレーカーは以前のワード ブレーカーよりも優れたセマンティック品質を提供することを示しています。 このため、再呼び出しの精度が向上します。
多くの言語では、ワード ブレーカーがすぐ使用できる状態で SQL Server に付属しており、既定で有効になります。
SQL Server にワード ブレーカーとステミング機能が含まれている言語の一覧については、 sys.fulltext_languagesを参照してください。
Full-Text Search で列レベル言語の名前を使用する方法
フルテキスト インデックスの作成時には、有効な言語名を各列に対して指定する必要があります。 言語名が有効であっても 、sys.fulltext_languages カタログ ビューによって返されない場合、Full-Text Search は、同じ言語ファミリの使用可能な最も近い言語名 (存在する場合) にフォールバックします。 それ以外の場合、Full-Text 検索はニュートラル ワード ブレーカーにフォールバックします。 このフォールバック動作は、再呼び出しの精度に影響する可能性があります。 したがって、フルテキスト インデックスの作成時には、有効かつ使用可能な言語名を各列に対して指定することを強くお勧めします。
Note
LCID は、フルテキスト インデックス作成で有効なすべてのデータ型 ( char 型や nchar型など) に適用されます。 char、 varchar、または text 型の列の並べ替え順を、LCID で識別された言語とは異なる言語に設定した場合でも、それらの列に対してフルテキスト インデックスを作成したりクエリを実行したりするときには LCID が使用されます。
単語区切り
インデックス作成の対象テキストを単語の境界でトークン化するのは、言語固有のワード ブレーカーです。 したがって、単語を区切る動作は言語によって異なります。 1 つの言語 ( x) を使用して複数の言語 {x、 y、および z} のインデックスを作成すると、一部の動作で予期しない結果が発生する可能性があります。 たとえば、ダッシュ (-) またはコンマ (,) は、ある言語では破棄されるが、別の言語ではスローされない単語区切り要素である場合があります。 また、まれに、ある単語の語幹が言語によって異なる場合に、予期しない語幹検索の動作が生じることがあります。 たとえば、英語では通常、単語の境界は空白またはなんらかの句読点になります。 ドイツ語などの他の言語では、単語や文字を組み合わせることができます。 そのため、選択する列レベルの言語は、その列の行に格納する言語を表す必要があります。
西洋言語
西洋言語ファミリの場合、列に格納する言語がわからない場合、または複数の言語が格納されると予想される場合は、一般的な回避策として、列に格納される可能性がある最も複雑な言語にワード ブレーカーを使用します。
たとえば、英語、スペイン語、ドイツ語のコンテンツを 1 つの列に格納することが想定される場合があります。 これらの 3 つの西洋言語は、ドイツ語のパターンが最も複雑で、同様の単語区切りのパターンを持っています。 したがって、この例では、ドイツ語のワード ブレーカーを使用することをお勧めします。そうすれば、英語とスペイン語のテキストも正しく処理できます。 一方、英語のワード ブレーカーを使用した場合は、複合語を持つドイツ語のテキストを完璧には処理できないことがあります。
言語ファミリで最も複雑な言語のワード ブレーカーを使用しても、ファミリ内のすべての言語の完全なインデックス作成が保証されるわけではありません。 最も複雑なワード ブレーカーが別の言語で記述されたテキストを正しく処理できないコーナー ケースが存在する場合があります。
非西洋言語
英語以外の言語 (中国語、日本語、ヒンディー語など) の場合、前の回避策は言語上の理由から必ずしも機能するとは限りません。 西洋以外の言語の場合は、次のいずれかの回避策を検討してください。
異なるファミリに属する複数の言語の場合
類似性のない複数の言語 (たとえばスペイン語と日本語) が 1 つの列に格納される可能性がある場合は、格納する列を言語ごとに分けることを検討してください。 この分離により、各列に言語固有のワード ブレーカーを使用できます。 この回避策を選択した場合に、クエリ時にクエリ言語が判明していないときは、両方の列に対してクエリを実行し、適切な行やドキュメントを検索できるようにする必要があります。
バイナリ コンテンツ (Microsoft Word 文書など) の場合
インデックス付きコンテンツが バイナリ 型の場合、テキスト コンテンツをワード ブレーカーに送信する前に処理する Full-Text Search フィルターでは、バイナリ ファイル内に存在する特定の言語タグが優先される場合があります。 この場合、インデックス作成時に、フィルターはドキュメントまたはドキュメントのセクションに対して適切な LCID を出力します。 Full-Text エンジンは、その LCID を持つ言語のワード ブレーカーを呼び出します。 ただし、複数の言語のコンテンツにインデックスを作成した後は、コンテンツのインデックスが正しく作成されたかどうかを確認することをお勧めします。
プレーン テキスト コンテンツの場合
コンテンツがプレーンテキストの場合は、 xml データ型に変換して、各ドキュメントまたはドキュメント セクションに対応する言語を示す言語タグを追加できます。 ただし、そのためには、フルテキスト インデックスの作成前に言語を把握しておく必要があります。
語幹検索
列レベルの言語を選択する際のもう 1 つの考慮事項は 、ステミングです。 フルテキスト クエリでのステミングは、特定の言語で単語のすべての語幹 (変曲) 形式を検索するプロセスです。 汎用のワード ブレーカーで複数の言語を処理する場合、列に対して指定された言語に対してのみステミング プロセスが機能します。列内のその他の言語に対しては、ステミング プロセスが機能しません。 たとえば、ドイツ語のステマーは、英語やスペイン語 (など) では機能しません。 このため、クエリ時に選択した言語によっては、再呼び出しに影響する場合があります。
列の種類が Full-Text 検索に及ぼす影響
言語を選択する際のもう 1 つの注意点は、データの表記方法に関連するものです。 varbinary(max) 列に格納されていないデータの場合、特別なフィルター処理は実行されません。 テキストはそのままの形で単語を分解するコンポーネント (ワード ブレーカー) に渡されます。
また、ワード ブレーカーは主に記述されたテキストを処理することを目的として設計されています。 そのため、テキストに何らかの種類のマークアップ (HTML など) がある場合、インデックス作成と検索中に言語的な精度が向上しない可能性があります。 その場合、2 つの選択肢があります。推奨される方法は、テキスト データを varbinary(max) 列に格納し、ドキュメントの種類を示してフィルター処理することです。 これがオプションでない場合は、ニュートラル ワード ブレーカーの使用を検討し、可能であれば、マークアップ データ (HTML の "br" など) をノイズ ワード リストに追加することを検討してください。
Note
ニュートラル言語を指定しても、言語ベースのステミングは機能しません。
フルテキスト クエリで既定以外の列レベル言語を指定する
既定では、SQL Server では、Full-Text Search は、フルテキスト句に含まれる各列に指定された言語を使用してクエリ用語を解析します。 この動作をオーバーライドするには、クエリ時に既定以外の言語を指定します。 リソースがインストールされているサポートされている言語の場合、CONTAINS、CONTAINSTABLE、FREETEXT、または FREETEXTTABLE クエリのLANGUAGE <language_term>句を使用して、クエリ用語の単語区切り、ステミング、類義語辞典、およびストップワード処理に使用される言語を指定できます。