フルテキスト インデックス作成時の言語の選択Choose a Language When Creating a Full-Text Index

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

フルテキスト インデックスを作成する際には、列レベルの言語をインデックス列に対して指定する必要があります。When creating a full-text index, you need to specify a column-level language for the indexed column. 指定した言語の ワード ブレーカーとステマー が、列のフルテキスト クエリで使用されます。The word breaker and stemmers of the specified language will be used by full-text queries on the column. フルテキスト インデックスの作成時に列の言語を選択する際には、注意点が 2 つあります。There are a couple of things to consider when choosing the column language when creating a full-text index. これらの注意点は、テキストをトークン化する方法と、Full-Text Engine によるインデックス作成の方法にかかわるものです。These considerations relate to how your text is tokenized and then indexed by Full-Text Engine.


列レベルの言語をフルテキスト インデックス列に対して指定するには、列の指定時に LANGUAGE language_term 句を使用します。To specify a column-level language for a column of full-text index, use the LANGUAGE language_term clause when specifying the column. 詳細については、「CREATE FULLTEXT INDEX (Transact-SQL)」および「ALTER FULLTEXT INDEX (Transact-SQL)」を参照してください。For more information, see CREATE FULLTEXT INDEX (Transact-SQL) and ALTER FULLTEXT INDEX (Transact-SQL).

フルテキスト検索の言語サポートLanguage Support in Full-Text Search

ここでは、ワード ブレーカーとステミング機能の概要を示し、列レベルの言語の LCID がフルテキスト検索で使用されるしくみについて説明します。This section provides an introduction to word breakers and stemmers, and discusses how full-text search uses the LCID of the column-level language.

ワード ブレーカーとステミング機能の概要Introduction to Word Breakers and Stemmers

SQL Server 2008:SQL Server 2008 以降のバージョンには、以前の SQL ServerSQL Serverから大幅に機能が強化された、まったく新しいワード ブレーカーとステミング機能が用意されています。and later versions include a complete new family of word breakers and stemmers that are significantly better than those previously available in SQL ServerSQL Server.


これらの新しい言語コンポーネントは、Microsoft Natural Language Group (MS NLG) によって実装およびサポートされています。The Microsoft Natural Language Group (MS NLG) implemented and supports these new linguistic components.

新しいワード ブレーカーには次の利点があります。The new word breakers provide the following benefits:

  • 堅牢性Robustness

    負荷の高いクエリ環境における新しいワード ブレーカーの堅牢性が、テストによって明らかにされています。Testing has shown that the new word breakers are robust in high-pressure query environments.

  • SecuritySecurity

    言語コンポーネントのセキュリティが向上したため、SQL Server の新しいワード ブレーカーは既定で有効になります。The new word breakers are enabled by default in SQL Server thanks to security improvements in linguistic components. SQL Server の全体的なセキュリティと堅牢性を強化するためには、ワード ブレーカーやフィルターなどの外部コンポーネントに署名することを強くお勧めします。We highly recommend that external components such as word breakers and filters be signed to improve the overall security and robustness of SQL Server. 次のようにフルテキストを構成すると、これらのコンポーネントが署名されていることを確認できます。You can configure full-text to verify that these components are signed as follows:

    EXEC sp_fulltext_service 'verify_signature';  
  • [品質]Quality

    ワード ブレーカーの設計が変更されました。新しいワード ブレーカーのセマンティクスの品質が以前よりも向上したことが、テストによって明らかにされています。Word breakers have been redesigned, and testing has shown that the new word breakers provide better semantic quality than previous word breakers. このため、再呼び出しの精度が向上します。This increases the recall accuracy.

  • 多くの言語では、ワード ブレーカーがすぐ使用できる状態で SQL Server に付属しており、既定で有効になります。Coverage for a vast list of languages, word breakers are included in SQL Server out of the box and enabled by default.

ワード ブレーカーとステマーが SQL Server に付属している言語の一覧については、「 sys.fulltext_languages (Transact-SQL)」を参照してください。For a list of the languages for which SQL Server includes a word breaker and stemmers, see sys.fulltext_languages (Transact-SQL).

列レベルの言語の名前がフルテキスト検索で使用されるしくみHow Full-Text Search Uses the Name of the Column-Level Language

フルテキスト インデックスの作成時には、有効な言語名を各列に対して指定する必要があります。When creating a full-text index, you need to specify a valid language name for each column. 言語名が有効であっても sys.fulltext_languages (Transact-SQL) カタログ ビューによって返されない場合、同じ言語ファミリに使用可能な言語名があれば、最も近いものがフルテキスト検索に使用されます。If a language name is valid but not returned by the sys.fulltext_languages (Transact-SQL) catalog view, full-text search falls back to the closest available language name of the same language family, if any. それ以外の場合は、代わりにニュートラル ワード ブレーカーがフルテキスト検索に使用されます。Otherwise, full-text search falls back to the Neutral word breaker. このフォールバック動作は、再呼び出しの精度に影響する可能性があります。This fall-back behavior might affect the recall accuracy. したがって、フルテキスト インデックスの作成時には、有効かつ使用可能な言語名を各列に対して指定することを強くお勧めします。Therefore we strongly recommend that you specify a valid and available language name for each column when creating a full-text index.


LCID は、フルテキスト インデックス作成で有効なすべてのデータ型 ( char 型や nchar型など) に適用されます。The LCID is used against all data types eligible for full-text indexing (such as char or nchar). charvarchar、または text 型の列の並べ替え順を、LCID で識別された言語とは異なる言語に設定した場合でも、それらの列に対してフルテキスト インデックスを作成したりクエリを実行したりするときには LCID が使用されます。If you have the sort order of a char, varchar, or text type column set to a language setting different from the language identified by the LCID, the LCID is used anyway during full-text indexing and querying of those columns.

単語分割Word Breaking

インデックス作成の対象テキストを単語の境界でトークン化するのは、言語固有のワード ブレーカーです。A word breaker tokenizes the text being indexed on word boundaries, which are language-specific. したがって、単語を区切る動作は言語によって異なります。Therefore, word-breaking behavior differs among different languages. 1 つの言語 (x) を使用して複数の言語 (x、y、および z) のインデックスを作成した場合、予期しない動作結果が生じることがあります。If you use one language, x, to index a number of languages {x, y, and z}, some of the behavior might cause unexpected results. たとえば、ダッシュ (-) やコンマ (,) などの単語区切り要素は、言語によって無視されたりされなかったりします。For example, a dash (-) or a comma (,) might be a word-break element that will be thrown away in one language but not in another. また、まれに、ある単語の語幹が言語によって異なる場合に、予期しない語幹検索の動作が生じることがあります。Also rarely unexpected stemming behavior might occur because a given word might stem differently in different language. たとえば、英語では通常、単語の境界は空白またはなんらかの句読点になります。For example, in the English language, word boundaries are typically white space or some form of punctuation. ドイツ語などの他の言語では、複数の単語や文字を組み合わせることができます。In other languages, such as German, words or characters may be combined together. したがって、列レベルで言語を選択する場合は、その列の行に格納されると予想される言語を選択する必要があります。Therefore, the column-level language that you choose should represent the language that you expect will be stored in rows of that column.

西洋言語Western Languages

西洋言語の場合、列に格納される言語がわからないときや複数の言語が格納されるときは、一般的な回避策として、列に格納される可能性がある言語のうち最も複雑な言語のワード ブレーカーを使用します。For the Western family of languages, if you are unsure which languages will be stored in a column or you expect more than one to be stored, a general workaround is to use the word breaker for the most complex language that might be stored in the column. たとえば、1 つの列に、英語、スペイン語、およびドイツ語の内容が格納される予定であるとします。For instance, you might expect to store English, Spanish and German content in a single column. これら 3 つの西洋言語は単語の区切り方がよく似ていますが、ドイツ語の場合が最も複雑です。These three Western languages possess very similar word-breaking patterns, with the German patterns being the most complex. したがって、この例では、ドイツ語のワード ブレーカーを使用することをお勧めします。そうすれば、英語とスペイン語のテキストも正しく処理できます。Therefore, a good choice is this case would be to use the German word breaker, which should be able to process English and Spanish text correctly. 一方、英語のワード ブレーカーを使用した場合は、複合語を持つドイツ語のテキストを完璧には処理できないことがあります。In contrast, the English word breaker might not process German text perfectly because of the compound words of German.

言語ファミリ内の最も複雑な言語のワード ブレーカーを使用しても、ファミリ内のすべての言語で完璧なインデックスを作成できるとは限りません。Note that using the word breaker of the most complex language in a language family does not guarantee perfect indexing of every language in the family. 最も複雑なワード ブレーカーでも、別言語のテキストを正しく処理できないような場合があります。Corner cases might exist in which the most complex word breaker cannot correctly handle text written in another language.

西洋以外の言語Non Western Languages

西洋以外の言語 (中国語、日本語、ヒンディー語など) では、言語の特性上、前に示した回避策が必ずしも機能しません。For non Western languages (such as Chinese, Japanese, Hindi, and so forth) the above workaround does not necessarily work, for linguistic reasons. 西洋以外の言語の場合は、次のいずれかの回避策を検討してください。For non Western languages, consider one of the following workarounds:

  • 異なるファミリに属する複数の言語の場合For languages from different families

    類似性のない複数の言語 (たとえばスペイン語と日本語) が 1 つの列に格納される可能性がある場合は、格納する列を言語ごとに分けることを検討してください。If a column might contain dramatically different languages, for example, Spanish and Japanese, consider storing the content of different languages in separate columns. このようにすると、各列で言語固有のワード ブレーカーを使用できます。This would allow you to use the language-specific word breaker for each column. この回避策を選択した場合に、クエリ時にクエリ言語が判明していないときは、両方の列に対してクエリを実行し、適切な行やドキュメントを検索できるようにする必要があります。If you choose this solution and you don't know the query language at query time, you might need to issue the query against both columns to ensure that the query finds the right row or document.

  • バイナリ コンテンツ (Microsoft Word 文書など) の場合For Binary content (such as Microsoft Word documents)

    インデックス付きコンテンツが binary 型の場合、ワード ブレーカーへの送信前にテキスト コンテンツを処理するフルテキスト検索フィルターによって、バイナリ ファイル内に存在する特定の言語タグが使用されることがあります。When the indexed content is of binary type, the full-text search filter that processes the textual content before sending it to the word breaker might honor specific language tags existing within the binary file. その場合、インデックスの作成時に、ドキュメントまたはドキュメント セクションの正しい LCID がフィルターによって生成されます。In this case, at indexing time, the filter will emit the right LCID for a document or section of a document. 次に、その LCID を持つ言語のワード ブレーカーが Full-Text Engine によって呼び出されます。The Full-Text Engine will then call the word breaker for the language with that LCID. ただし、複数の言語のコンテンツにインデックスを作成した後は、コンテンツのインデックスが正しく作成されたかどうかを確認することをお勧めします。However, after indexing multi language content, we recommend that you verify that the content was correctly indexed.

  • プレーン テキスト コンテンツの場合For plain text content

    コンテンツがプレーンテキストの場合は、 xml データ型に変換して、各ドキュメントまたはドキュメント セクションに対応する言語を示す言語タグを追加できます。When your content is plain text, you can convert it to the xml data type and add language tags that indicate the language corresponding to each specific document or document section. ただし、そのためには、フルテキスト インデックスの作成前に言語を把握しておく必要があります。For this to work, however, you need to know the language before full-text indexing.


列レベルで言語を選択する際には、ステミングについても考慮します。An additional consideration when choosing your column-level language is stemming. フルテキスト クエリでのステマー は、特定の言語の単語に対し、語幹から派生した語形 (変化形) をすべて検索するプロセスです。Stemming in full-text queries is the process of searching for all stemmed (inflectional) forms of a word in a particular language. 汎用のワード ブレーカーで複数の言語を処理する場合、列に対して指定された言語に対してのみステミング プロセスが機能します。列内のその他の言語に対しては、ステミング プロセスが機能しません。When you use a generic word breaker to process several languages, the stemming process works only for the language specified for the column, not for other languages in the column. たとえば、ドイツ語のステミング機能は、英語やスペイン語などに対して機能しません。For example, German stemmers do not work for English or Spanish (and so forth). このため、クエリ時に選択した言語によっては、再呼び出しに影響する場合があります。This might affect your recall depending on which language you choose at query time.

列の型がフルテキスト検索に及ぼす影響Effect of Column Type on Full-Text Search

言語を選択する際のもう 1 つの注意点は、データの表記方法に関連するものです。Another consideration in language choice is related to how the data is represented. varbinary(max) 列に格納されていないデータについては、特別なフィルター処理は実行されません。For data that is not stored in varbinary(max) column, no special filtering is performed. テキストはそのままの形で単語を分解するコンポーネント (ワード ブレーカー) に渡されます。Rather, the text is generally passed through the word breaking component as-is.

また、ワード ブレーカーは主に記述されたテキストを処理することを目的として設計されています。Also, word breakers are designed mainly to process written text. したがって、HTML などのなんらかのマークアップがテキストに含まれている場合には、言語面での精度が高いインデックス作成と検索は期待できません。So, if you have any type of markup (such as HTML) on your text, you may not get great linguistic accuracy during indexing and search. このような場合には、2 つの選択肢があります。推奨される方法は、テキスト データを varbinary(max) 列に格納し、ドキュメント タイプを明示してフィルター処理されるようにする方法です。In that case, you have two choices-the preferred method is simply to store the text data in varbinary(max) column, and to indicate its document type so it may be filtered. この方法を選択できない場合は、ニュートラル ワード ブレーカーの使用を検討してください。また、可能であれば、ノイズ ワードの一覧にマークアップ データ (HTML の「br」など) を追加します。If this is not an option, you may consider using the neutral word breaker and, if possible, adding markup data (such as 'br' in HTML) to your noise word lists.


ニュートラル言語を指定した場合、言語ベースのステミングは使用できません。Language based stemming does not come into play when you specify the neutral language.

フルテキスト クエリにおける既定以外の列レベル言語の指定Specifying a Non-default Column-Level Language in a Full-Text Query

SQL ServerSQL Serverの既定のフルテキスト検索では、フルテキスト句内に含まれている各列に対して指定した言語を使用して、クエリ用語が解析されます。By default, in SQL ServerSQL Server, full-text search will parse the query terms using the language specified for each column that is included in the full-text clause. この動作をオーバーライドするには、クエリ時に既定以外の言語を指定します。To override this behavior, specify a nondefault language at query time. 言語がサポートされていて、そのリソースがインストールされていれば、 CONTAINSCONTAINSTABLEFREETEXTFREETEXTTABLEクエリの LANGUAGE language_term 句を使用して、クエリ用語の単語区切り、ステマー、類義語辞典、およびストップワードの処理に使用する言語を指定できます。For supported languages whose resources are installed, the LANGUAGE language_term clause of a CONTAINS, CONTAINSTABLE, FREETEXT, or FREETEXTTABLE query can be used to specify the language used for word breaking, stemming, thesaurus, and stopword processing of the query terms.

参照See Also

データ型 (Transact-SQL) Data Types (Transact-SQL)
検索用フィルターの構成と管理 Configure and Manage Filters for Search
sp_fulltext_service (Transact-SQL) sp_fulltext_service (Transact-SQL)
sys.fulltext_languages (Transact-SQL) sys.fulltext_languages (Transact-SQL)
検索用のワード ブレーカーとステミング機能の構成と管理Configure and Manage Word Breakers and Stemmers for Search