フルテキスト関数とフルテキスト述語の比較
CONTAINSTABLE 関数と FREETEXTTABLE 関数は、各行の適合順位を返すフルテキスト クエリを指定します。これらの関数は非常に良く似ていますが、フルテキスト述語である CONTAINS および FREETEXT とは使用方法が異なります。
フルテキスト述語とフルテキスト関数はどちらもフルテキスト クエリで使用し、フルテキスト検索条件を指定する構文はどちらの場合も同じです。ただし、その使用法には大きな違いがあります。いくつかの重要な類似点と相違点を次に示します。
- CONTAINS と FREETEXT はどちらも TRUE 値または FALSE 値を返し、SELECT ステートメントの WHERE 句または HAVING 句で指定します。
- CONTAINSTABLE および FREETEXTTABLE はどちらも、0 行、1 行、または複数の行のテーブルを返します。このため、FROM 句で指定する必要があります。
- CONTAINS および FREETEXT は、選択基準を指定するためにだけ使用します。Microsoft SQL Server はこの選択基準を使用して結果セットのメンバシップを決定します。
- CONTAINSTABLE および FREETEXTTABLE は、選択基準の指定にも使用します。返されたテーブルには、フルテキスト キー値を含む KEY という名前の列があります。フルテキストが設定された各テーブルには、その値が一意であると保証されている列があります。フルテキストが設定されたテーブルから CONTAINSTABLE または FREETEXTTABLE の KEY 列に返される値は、フルテキスト検索条件に指定した選択基準に一致する行を示す一意な値です。
さらに、CONTAINSTABLE と FREETEXTTABLE で生成されたテーブルには、RANK という名前の列があり、0 から 1,000 までの値が含まれています。値が小さいほど、関連順位も低くなります。これらの値は、返された行が選択基準に適合している度合いによって、行に順位を付けるのに使用されます。
メモ : |
---|
順位値は、結果セットの行の相対的な関連順位のみを示します。実際の値には重要性がなく、クエリが実行されるたびに同じであるとは限りません。順位付けの詳細については、「順位付けについて」を参照してください。 |
CONTAINS クエリと FREETEXT クエリでは、順位値は返されません。
CONTAINSTABLE 関数と FREETEXTTABLE 関数を使用するクエリを実行する場合、返された該当行が元の SQL Server テーブルの行と明示的に結合される必要があります。
次の例では、Description 列の "sauces" または "candies" という単語の近くに "sweet and savory" という語句があるすべての食品カテゴリの説明とカテゴリ名を返します。カテゴリ名が "Seafood" の行はすべて無視されます。また、順位値が 2 以上の行だけを返します。
メモ : |
---|
このトピックの一部の例を実行するには、Northwind データベースをインストールする必要があります。Northwind データベースのインストール方法についての詳細は、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。 |
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
CONTAINSTABLE と CONTAINS の比較
CONTAINSTABLE 関数と CONTAINS 述語は、同じような検索条件を使用します。
ただし、CONTAINSTABLE では、フルテキスト検索の対象となるテーブル、そのテーブルで検索の対象となる列 (またはすべての列)、および検索条件を指定します。一致結果の上位から指定数だけを返すように指定できる、オプションのパラメータがあります。詳細については、このトピックの「結果セットの制限」を参照してください。
CONTAINSTABLE は、RANK という名前の列を含むテーブルを返します。この RANK 列には、その行が選択基準にどの程度一致しているかを示す値が格納されます。行の順位値が高いほど、指定されたフルテキスト クエリに対して関連性が高いことを示しています。
FREETEXTTABLE と FREETEXT の比較
次のクエリは、FREETEXTTABLE クエリを拡張して、最も順位が高い行を最初に返し、各行の順位を選択リストに追加します。クエリを指定するには、CategoryID が Categories テーブルの一意なキー列であることを知っている必要があります。
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
一意キー列名の識別
行セット値関数を使用するクエリを記述する場合は、一意なキー列の名前を知っている必要があります。フルテキスト処理ができるように設定されているテーブルにはそれぞれ TableFulltextKeyColumn プロパティがあります。このプロパティには、テーブルの行が一意になるように選択された列の列 ID が指定されています。次の例では、プログラムによってキー列の名前を取得する方法を示します。
USE AdventureWorks;
GO
DECLARE @key_column sysname
SET @key_column = Col_Name(Object_Id('Production.Document'),
ObjectProperty(Object_id('Production.Document'),
'TableFulltextKeyColumn')
)
SELECT @key_column AS 'Unique Key Column';
GO
最も関連性の高い結果を返すための結果セットの制限
多くの場合、フルテキスト クエリでは検索条件に一致するアイテムの数が大きくなります。クエリから返される一致結果が多くなりすぎないようにするには、CONTAINSTABLE および FREETEXTTABLE で省略可能な引数 top_n_by_rank を使用します。この引数を使用すると、順位に応じて返される一致結果の数を指定できます。
メモ : |
---|
top_n_by_rank 引数を使用すると、フルテキスト クエリを満たす行のサブセットが返されます。top_n_by_rank を他の述語と組み合わせた場合、クエリから返される行数は、実際にすべての述語に一致する行数より少なくなります。 |
Microsoft SQL Server はこの情報を使用して、一致結果を順位ごとに並べ替え、指定した数だけを返します。このオプションを使用すると、パフォーマンスが大幅に向上します。たとえば、通常ならば 100 万行のテーブルから 10 万行を返すクエリに対して、上位 100 行だけを返すように要求すれば、そのクエリの処理が速くなります。
CONTAINSTABLE を使用して先の例で上位 3 個の一致結果だけが返されるように指定する場合、クエリは次のようになります。
USE Northwind;
GO
SELECT K.RANK, CompanyName, ContactName, Address
FROM Customers AS C
INNER JOIN
CONTAINSTABLE(Customers,Address, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON C.CustomerID = K.[KEY];
GO
以下に結果セットを示します。
RANK CompanyName ContactName address
---- ------------ ----------- -------
123 Bon app' Laurence Lebihan 12, rue des Bouchers
65 Du monde entier Janine Labrune 67, rue des Cinquante Otages
15 France restauration Carine Schmitt 54, rue Royale
次の例では、Description 列の "sauces" または "candies" という単語の近くに "sweet and savory" という語句がある上位 10 組の食品カテゴリの説明とカテゴリ名を返します。
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)'
, 10
) AS KEY_TBL
ON FT_TBL.CategoryID = KEY_TBL.[KEY];
GO
参照
その他の技術情報
CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)