FREETEXT (Transact-SQL)

文字ベースのデータ型値を格納している列を検索するときに WHERE 句で使用する述語です。検索条件の文字列の並びと正確に一致しなくても意味が合っている値を検索できます。FREETEXT を使用すると、フルテキスト クエリ エンジンによって、freetext_string を基に次の内部操作が実行され、各語に重みが割り当てられた後、一致するものが検索されます。

  • 単語の区切りに基づいて、文字列を個々の単語に分割。

  • 単語の語尾変化形を生成 (語幹への分割)。

  • 類義語との一致に基づいて、語の拡張と置き換えの一覧を決定。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

FREETEXT ( { column_name | (column_list) | * } 
          , 'freetext_string' [ , LANGUAGE language_term ] )

引数

  • column_name
    FROM 句で指定したテーブルのフルテキスト インデックス付きの列の名前を指定します。データ型が char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary、または varbinary(max) の列を指定できます。

  • column_list
    コンマ区切りで複数の列を指定できます。column_list はかっこで囲む必要があります。language_term を指定しない場合、column_list で指定するすべての列の言語は同じにする必要があります。

  • *
    フルテキスト検索用に登録されているすべての列を使用して、指定した freetext_string を検索します。FROM 句に複数のテーブルが指定されている場合は、テーブル名で * を限定する必要があります。language_term を指定しない場合、テーブルのすべての列の言語は同じであることが必要です。

  • freetext_string
    column_name の列で検索するテキストを指定します。単語、フレーズ、文など、あらゆるテキストを入力できます。用語または一定の形式になっている用語がフルテキスト インデックス内に見つかった場合、一致するものと判断されます。

    CONTAINS と CONTAINSTABLE の検索条件では AND はキーワードになりますが、freetext_string では 'and' はノイズ語 (ストップ ワード) と見なされ、破棄されます。

    WEIGHT、FORMSOF、ワイルドカード、NEAR、およびその他の構文は使用できません。freetext_string は単語、語幹に分割され、類義語がチェックされて渡されます。

    freetext_string のデータ型は nvarchar です。入力に他の文字データ型が使用された場合は、暗黙の変換が行われます。次の例では、FREETEXT 述語において、varchar(30) として定義されている変数 @SearchWord が暗黙に変換されます。

    USE AdventureWorks2008R2;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    変換では "パラメーターを見つけ出す" 動作が機能しないため、パフォーマンスの向上を目的とする場合には nvarchar を使用してください。次の例では、@SearchWord を nvarchar(30) として宣言しています。

    USE AdventureWorks2008R2;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    最適化されていないプランが生成される場合には、OPTIMIZE FOR クエリ ヒントを使用することもできます。

  • LANGUAGE language_term
    クエリにおいて、単語区切り、語幹への分割、類義語のチェック、およびストップ ワードの破棄を行うときに使用する言語リソースの言語を指定します。このパラメーターは省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。language_term を指定した場合、その言語は検索条件のすべての要素に適用されます。値を指定しなかった場合は、列のフルテキストの言語が使用されます。

    1 つの列に言語の異なる複数のドキュメントが BLOB (Binary Large Object) として格納されている場合、そのインデックスの作成に使用される言語は、そのドキュメントのロケール識別子 (LCID) によって決まります。そのような列に対してクエリを実行する場合は、LANGUAGElanguage_term を指定すると検索の一致率が高まります。

    language_term を文字列で指定する場合は、sys.syslanguages (Transact-SQL) 互換性ビューの alias 列の値と同じ値を指定します。文字列の場合は、'language_term' のように引用符 (') で囲む必要があります。language_term を整数で指定する場合は、その言語を表す実際の LCID を指定します。language_term を 16 進数の値で指定する場合は、「0x」の後に LCID の 16 進数の値を指定します。16 進数の値は、先頭の 0 を含め、8 桁以内で指定してください。

    値を 2 バイト文字セット (DBCS) の形式で指定すると、Microsoft SQL Server で Unicode に変換されます。

    指定した言語が無効であるか、その言語に該当するリソースがインストールされていない場合は、エラーが返されます。ニュートラル言語リソースを使用するには、language_term に「0x0」を指定してください。

説明

フルテキストの述語と関数の対象は、FROM 述語で示される 1 つのテーブルです。複数のテーブルを検索するには、FROM 句で結合テーブルを使用して、複数のテーブルが組み合わされた結果セットを検索します。

FREETEXT を使用するフルテキスト クエリは、CONTAINS を使用するフルテキスト クエリほど正確ではありません。SQL Server のフルテキスト検索エンジンでは、重要な単語と語句が識別されます。予約済みキーワードやワイルドカード文字は、CONTAINS 述語の <contains_search_condition> パラメーターに指定した場合は特別な意味が与えられますが、FREETEXT の場合は特別な意味はありません。

FREETEXT は、互換性レベルが 70 未満の場合はキーワードとして認識されません。詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

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

LIKE とフルテキスト検索の比較

フルテキスト検索とは異なり、LIKE Transact-SQL 述語は文字パターンにのみ有効です。また、フォーマットされたバイナリ データのクエリには LIKE 述語を使用できません。さらに、構造化されていない大量のテキスト データに対して LIKE クエリを実行すると、同じデータに対して同等のフルテキスト検索を実行する場合に比べてはるかに時間がかかります。数百万行のテキスト データに対して LIKE クエリを実行すると、結果が得られるまでに数分かかる場合があります。一方、同じデータに対してフルテキスト クエリを実行すると、返される行数にもよりますが、数秒以内で結果を取得できます。

使用例

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

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

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

B. FREETEXT で変数を使用する

次の例では、特定の検索語ではなく変数を使用します。

USE AdventureWorks2008R2;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description 
FROM Production.ProductDescription 
WHERE FREETEXT(Description, @SearchWord);
GO