FREETEXTTABLE (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

Transact-SQL SELECT ステートメントの FROM 句 で使用される関数で、文字ベースのデータ型を含むフルテキスト インデックス付き列に対して SQL Server フルテキスト検索を実行します。 この関数は、指定した freetext_string内のテキストの意味だけでなく、正確な文言に一致する値を含む列の 0 行、1 行、または複数行のテーブルを返します。 FREETEXTTABLE は、通常のテーブル名であるかのように参照されます。

FREETEXTTABLE は、 FREETEXT (Transact-SQL)と同じ種類の一致に役立ちます。

FREETEXTTABLE を使用するクエリでは、各行の関連性ランク付け値 (RANK) とフルテキスト キー (KEY) が返されます。

Note

SQL Server でサポートされているフルテキスト検索の形式については、「フルテキスト検索でのクエリ」を参照してください。

Transact-SQL 構文表記規則

構文

FREETEXTTABLE (table , { column_name | (column_list) | * }   
          , 'freetext_string'   
     [ , LANGUAGE language_term ]   
     [ , top_n_by_rank ] )  

引数

テーブル
フルテキスト クエリ用にマークされているテーブルの名前を指定します。 table または view 1、2、または 3 部構成のデータベース オブジェクト名を指定できます。 ビューに対してクエリを実行する場合は、フルテキスト インデックスが作成されたベース テーブルを 1 つだけ指定できます。

table はサーバー名を指定できず、リンク サーバーに対するクエリでは使用できません。

column_name
FROM 句で指定したテーブルのフルテキスト インデックス付きの列の名前を指定します。 列には、charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max) のいずれかの型を指定できます。

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

*
フルテキスト検索用に登録されているすべての列を使用して、指定した freetext_string を検索します。 language_termを指定しない限り、テーブル内のすべてのフルテキスト インデックス付き列の言語は同じである必要があります。

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

AND がキーワードである CONTAINS 検索条件とは異なり、単語 'and' を freetext_string で使用すると、ノイズ ワードまたは ストップワードと見なされ、破棄されます。

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

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

1 つの列に言語の異なる複数のドキュメントが BLOB (Binary Large Object) として格納されている場合、そのインデックスの作成に使用される言語は、そのドキュメントのロケール識別子 (LCID) によって決まります。 そのような列に対してクエリを実行する場合は、LANGUAGE language_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 に変換されます。

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

top_n_by_rank
降順で n最上位の一致のみが返されるように指定します。 整数値 ( n) が指定されている場合にのみ適用されます。 top_n_by_rank を他のパラメーターと組み合わせた場合、クエリから返される行数は、実際にすべての述語に一致する行数より少なくなります。 top_n_by_rank では、最も関連性の高いヒットのみを呼び出すことで、クエリのパフォーマンスを向上させることができます。

解説

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

FREETEXTTABLE では、FREETEXT 述語と同じ検索条件が使用されます。

CONTAINSTABLE と同様に、返されるテーブルには KEYRANK という名前の列があります。この列は、適切な行を取得し、行のランク付け値を使用するためにクエリ内で参照されます。

アクセス許可

FREETEXTTABLE を呼び出すには、指定されるテーブルまたは参照されるテーブル列に対して適切な SELECT 権限が必要です。

A. 簡単な例

次の例では、2 つの列の単純なテーブルを作成して設定します。3 つの郡とそのフラグの色が一覧表示されます。 テーブルにフルテキスト カタログとインデックスを作成して設定します。 次に、 FREETEXTTABLE 構文を示します。

CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));  
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);  
INSERT Flags VALUES ('France', 'Blue and White and Red');  
INSERT Flags VALUES ('Italy', 'Green and White and Red');  
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');  
SELECT * FROM Flags;  
GO  
  
CREATE FULLTEXT CATALOG TestFTCat;  
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;  
GO   
  
SELECT * FROM Flags;  
SELECT * FROM FREETEXTTABLE (Flags, FlagColors, 'Blue');  
SELECT * FROM FREETEXTTABLE (Flags, FlagColors, 'Yellow');  

B. INNER JOIN での FREETEXT の使用

次の例では、 high level of performanceの意味と一致する説明を持つ製品の説明とランクを返します。

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.Description  
    ,KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL   
    INNER JOIN FREETEXTTABLE(Production.ProductDescription,  
    Description,   
    'high level of performance') AS KEY_TBL  
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
ORDER BY RANK DESC;  
GO  

C: 言語および最高順位の一致の指定

次の例は同じで、 LANGUAGElanguage_term パラメーターと top_n_by_rank パラメーターの使用を示しています。

USE AdventureWorks2022;  
GO  
  
SELECT FT_TBL.Description  
    ,KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL   
    INNER JOIN FREETEXTTABLE(Production.ProductDescription,  
    Description,   
    'high level of performance',  
    LANGUAGE N'English', 2) AS KEY_TBL  
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
ORDER BY RANK DESC;  
GO  

Note

language language_term パラメーターは、 top_n_by_rank パラメーターを使用する必要はありません。

参照

フルテキスト検索の概要
フルテキスト カタログの作成と管理
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
フルテキスト インデックスの作成と管理
フルテキスト検索でのクエリ
フルテキスト検索クエリの作成 (Visual Database Tools)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
行セット関数 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
precompute rank サーバー構成オプション
Azure SQL Database と Azure SQL Managed Instance の機能を比較する