フルテキスト述語とフルテキスト関数の概要

フルテキスト クエリでは、フルテキスト述語 (CONTAINS と FREETEXT) およびフルテキスト関数 (CONTAINSTABLE と FREETEXTTABLE) が使用されます。この述語と関数は、さまざまな形式のクエリ用語に対応する豊富な Transact-SQL 構文をサポートします。フルテキスト クエリを記述するには、これらの述語と関数をいつどのように使用するかを理解する必要があります。このトピックでは、述語と関数の概要を示し、CONTAINS 述語と CONTAINSTABLE 関数の共通点について説明します。

フルテキスト述語 (CONTAINS と FREETEXT) の概要

CONTAINS と FREETEXT は、SELECT ステートメントの WHERE 句または HAVING 句で指定します。これらの述語は、LIKE や BETWEEN など他の Transact-SQL 述語と組み合わせて使用できます。

CONTAINS 述語と FREETEXT 述語は、TRUE 値または FALSE 値を返します。これらの述語は、特定の行がフルテキスト クエリと一致するかどうかを判断する選択基準としてのみ使用します。一致する行は結果セットで返されます。

CONTAINS または FREETEXT を使用する場合は、検索するテーブルの単一の列、一連の列、すべての列のいずれかを指定できます。また、フルテキスト クエリで単語区切りとステミング、類義語辞典の検索、およびノイズ ワードの削除を行うために使用される言語リソースの言語を指定することもできます。

CONTAINS と FREETEXT は、次のようにさまざまな検索で利用できます。

  • CONTAINS (または CONTAINSTABLE) は、単語または語句との完全一致検索やあいまい一致検索、特定の範囲内での近接検索、または重み付き検索に使用します。CONTAINS を使用する場合は、検索するテキストを指定する検索条件を少なくとも 1 つ指定し、一致を判断する条件を指定する必要があります。

    検索条件の間には論理演算を使用できます。詳細については、このトピックの「CONTAINS および CONTAINSTABLE でのブール演算子 (AND、OR、AND NOT) の使用」を参照してください。

  • FREETEXT (または FREETEXTTABLE) は、指定した単語、語句、または文章 (freetext 文字列) の正確な文字列の並びではなく意味を照合する場合に使用します。指定した列のフルテキスト インデックスに、用語または一定の形式の用語が見つかった場合は、一致すると判断されます。

リンク サーバーに対してクエリを実行する場合は、4 つの要素で構成される名前を CONTAINS または FREETEXT で使用できます。詳細については、「リンク サーバーへのクエリ (フルテキスト検索)」を参照してください。

これらの述語の構文および引数の詳細については、「CONTAINS (Transact-SQL)」および「FREETEXT (Transact-SQL)」を参照してください。

注意注意

データベースの互換性レベルが 100 に設定されている場合、OUTPUT 句でフルテキスト述語を使用することはできません。

A. CONTAINS を <simple_term> と共に使用する

次の例では、"Mountain" という単語を含み、価格が $80.99 であるすべての製品を検索します。

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. FREETEXT を使用して、指定した文字値を含む単語を検索する

次の例では、vital、safety、components に関連する単語を含むすべてのドキュメントを検索します。

USE AdventureWorks;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO

フルテキスト関数 (CONTAINSTABLE と FREETEXTTABLE) の概要

CONTAINSTABLE 関数と FREETEXTTABLE 関数は、SELECT ステートメントの FROM 句で通常のテーブル名と同じように指定できます。この関数では、フルテキスト クエリと一致する 0 行、1 行、または 2 行以上で構成されるテーブルが返されます。返されたテーブルには、ベース テーブルの行のうち、関数のフルテキスト検索条件に指定した選択基準に一致する行のみが含まれます。

このいずれかの関数を使用するクエリでは、次のように、各行の関連順位値 (RANK) とフルテキスト キー (KEY) が取得されます。

  • KEY 列

    KEY 列には、返された行の一意の値が格納されます。KEY 列は、選択基準を指定する際に使用できます。

  • RANK 列

    RANK 列には、各行が選択基準にどの程度一致しているかを示す順位値が格納されます。行内のテキストまたはドキュメントの順位値が高いほど、指定したフルテキスト クエリとその行との関連性が高いことを示します。複数の行に同じ順位が付けられる可能性もあるので注意してください。top_n_by_rank パラメータ (省略可能) を指定して、返される一致結果の数を制限することもできます。詳細については、「順位付け結果セットの制限 (フルテキスト検索)」および「検索クエリの結果が順位付けされる方法 (フルテキスト検索)」を参照してください。

どちらの関数を使用する場合も、フルテキスト検索の対象となるベース テーブルを指定する必要があります。述語と同様に、検索するテーブルの単一の列、一連の列、またはすべての列を指定できます。また、必要に応じて、指定したフルテキスト クエリで使用される言語リソースの言語を指定することもできます。

CONTAINSTABLE は CONTAINS と同様の検索に役立ち、FREETEXTTABLE は FREETEXT と同様の検索に役立ちます。詳細については、このトピックの「フルテキスト述語 (CONTAINS と FREETEXT) の概要」を参照してください。CONTAINSTABLE 関数と FREETEXTTABLE 関数を使用するクエリを実行する場合は、返された行を SQL Server のベース テーブルの行と明示的に結合する必要があります。

これらの関数の構文および引数の詳細については、「CONTAINSTABLE (Transact-SQL)」および「FREETEXTTABLE (Transact-SQL)」を参照してください。

A. CONTAINSTABLE を使用する

次の例では、Description 列の "sauces" または "candies" という単語の近くに "sweet and savory" という語句があるすべての食品カテゴリの説明とカテゴリ名を返します。カテゴリ名が "Seafood" の行はすべて無視されます。また、順位値が 2 以上の行だけを返します。

USE Northwind;
GO
SELECT FT_TBL.Description, 
   FT_TBL.CategoryName, 
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description, 
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

B. FREETEXTTABLE を使用する

次の例では、FREETEXTTABLE クエリを拡張して、順位の高いものから順に行を返し、各行の順位を選択リストに追加します。クエリを指定するには、CategoryIDCategories テーブルの一意なキー列であることを知っている必要があります。

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

以下に、同じクエリを拡張して、順位の値が 10 以上の行だけを返す例を示します。

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

CONTAINS および CONTAINSTABLE でのブール演算子 (AND、OR、AND NOT) の使用

CONTAINS 述語と CONTAINSTABLE 関数は、同じ検索条件を使用します。どちらも、ブール演算子 AND、OR、AND NOT を使用して複数の検索語句を結合した論理演算をサポートします。たとえば、AND を使用して "latte" と "New York-style bagel" の両方を含む行を検索できます。また、AND NOT を使用して "bagel" を含み、かつ "cream cheese" を含まない行を検索することもできます。

注意注意

一方、FREETEXT と FREETEXTTABLE では、ブール演算子は検索対象の語として扱われます。

CONTAINS を、論理演算子 AND、OR、および NOT を使用する他の述語と組み合わせる方法については、「検索条件 (Transact-SQL)」を参照してください。

次の例では、AdventureWorks データベースの ProductDescription テーブルを使用します。このクエリでは、CONTAINS 述語を使用して、説明 ID が 5 以外で、説明に "Aluminum" と "spindle" という両方の単語が含まれている説明を検索します。検索条件では AND ブール演算子を使用します。

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

その他の注意点

フルテキスト処理に対応する各テーブルには、テーブルの行を一意にするための列があります (一意なキー列)。CONTAINSTABLE または FREETEXTTABLE を使用するフルテキスト クエリを記述する場合は、一意なキー列の名前が必要となります。詳細については、「フルテキスト キー列を調査する方法 (Transact-SQL)」を参照してください。

クエリ用語の多くは、ワード ブレーカの動作に大きく依存します。適切なワード ブレーカ (およびステミング機能) および類義語辞典ファイルを使用するために、LANGUAGE 引数を指定することをお勧めします。詳細については、「フルテキスト インデックス作成時の言語の選択に関するベスト プラクティス」を参照してください。

フルテキスト クエリを定義する際に、Full-Text Engine でストップ ワード (ノイズ ワードとも呼ばれます) が検索基準から除外されます。ストップ ワードとは、"a"、"and"、"is"、"the" などの頻出する単語で、特定のテキストの検索には通常役立ちません。ストップ ワードはストップ リストに列挙されています。各フルテキスト インデックスには特定のストップ リストが関連付けられ、それによってクエリから、またはインデックス作成時にインデックスから除外されるストップ ワードが決まります。詳細については、「ストップ ワードとストップ リスト」を参照してください。

類義語辞典の照合は、FORMSOF THESAURUS 句を指定する CONTAINS および CONTAINSTABLE Transact-SQL クエリ、および FREETEXT クエリと FREETEXTABLE クエリに対して既定で行われます。