適用対象:SQL Server
Azure SQL データベース
Azure SQL Managed Instance
述語 CONTAINS と FREETEXT 、行セット値関数 CONTAINSTABLE と FREETEXTTABLE を SELECT 文で使って全文クエリを書きます。 この記事では、各述語と関数の例と、使用に最適なものを選択する方法を説明します。
- 単語やフレーズを合わせるには、
CONTAINSとCONTAINSTABLEを使います。 - 意味に合わせるため、正確な表現は避けて、
FREETEXTとFREETEXTTABLEを使ってください。
各述語と関数の例
この記事のコード サンプルでは、AdventureWorks2025 または AdventureWorksDW2025 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。
サンプル クエリを実行するには、フルテキスト検索も設定する必要があります。 詳細については、全文検索を使ってみるをご覧ください。
例:CONTAINS
次の例では、$80.99 という単語を含み、価格が Mountain であるすべての製品を検索します。
USE AdventureWorks2025;
GO
SELECT Name,
ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS ((Name), 'Mountain');
GO
例:フリーテキスト
次の例では、vital safety components に関連する単語を含むドキュメントをすべて検索します。
USE AdventureWorks2025;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO
例:CONTAINSTABLE
以下の例は、Description 列に、単語 aluminum が単語 light または単語 lightweight のいずれかの近くに含まれているすべての製品の説明 ID と説明文を返します。 ランクが2を超える行のみが返されます。
USE AdventureWorks2025;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
(lightweight NEAR aluminum)') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
例:FREETEXTTABLE
以下の例は、 FREETEXTTABLE クエリを拡張して、最もランクの高い行を最初に返し、各行のランク付けを選択リストに追加します。 同様のクエリを書くには、 ProductDescriptionID が ProductDescription テーブルの一意キーカラムであることを知っておく必要があります。
USE AdventureWorks2025;
GO
SELECT KEY_TBL.RANK,
FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
以下に、同じクエリを拡張して、順位が 10 以上の行だけを返す例を示します。
USE AdventureWorks2025;
GO
SELECT KEY_TBL.RANK,
FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO
単語を合わせるか、意味を合わせるか
CONTAINS
CONTAINSTABLE、すなわちFREETEXTとFREETEXTTABLEは、異なる種類のマッチングに有用です。 以下の情報は、クエリに最適な述語や関数を選ぶのに役立ちます:
CONTAINS と CONTAINSTABLE
- 完全一致またはあいまい一致 (より低い精度での一致) する単語または語句を照合できます。
- 次の操作を行うこともできます。
- 単語が互いに特定の範囲内でどれくらい近いかを指定する。
- 一致するものを重み付きで返す。
- 論理演算子で検索条件を結合する。 詳細については、この記事の後半で「 ブール演算子(AND, OR, NOT)を使 え」を参照してください。
FREETEXT および FREETEXTTABLE
- 指定した単語、語句、または文(freetext string)について、正確な文言ではなく意味を一致させます。
- 指定した列のフルテキスト インデックスに、用語または一定の形式の用語が見つかった場合は、一致すると判断されます。
述語と関数を比較する
CONTAINSまたはFREETEXT述語と、CONTAINSTABLEまたはFREETEXTTABLE行セット値関数は構文やオプションが異なります。 以下の情報は、クエリに最適な述語や関数を選ぶのに役立ちます:
述語 CONTAINS と FREETEXT
使用状況。
SELECT ステートメントの WHERE または HAVING 句で、CONTAINS および FREETEXT のフルテキストの述語を使用します。
結果。
CONTAINSおよびFREETEXT述語は、ある行が全文クエリと一致するかどうかを示すTRUEまたはFALSEの値を返します。 一致する行は結果セットで返されます。
その他のオプション。 述語は LIKE や BETWEENなど他の Transact-SQL 述語と組み合わせることができます。
テーブルの単一の列、一連の列、すべての列のいずれかを検索対象として指定できます。
また、フルテキスト クエリで単語区切りとステミング、類義語辞典の検索、およびノイズ ワードの削除を行うために使用されるリソースの言語を指定することもできます。
CONTAINSに4部名を使ったり、リンクサーバー上のターゲットテーブルの全文インデックス付き列をクエリするにはFREETEXT述語を使うことができます。 フルテキスト クエリを受け取るようリモート サーバーを準備するには、リモート サーバー上の検索対象のテーブルおよび列にフルテキスト インデックスを作成し、リモート サーバーをリンク サーバーとして追加します。
これらの述語の構文や引数の詳細については、 CONTAINS および FREETEXT を参照してください。
行セット値関数 CONTAINSTABLE と FREETEXTTABLE
使用状況。 全文CONTAINSTABLEやFREETEXTTABLE関数を、FROM文の SELECT 節の通常のテーブル名のように使うことができます。
これらのいずれかの関数を使用する場合には、検索するベース テーブルを指定する必要があります。 述語と同様に、検索するテーブルの単一の列、一連の列、またはすべての列を指定できます。また、必要に応じて、指定したフルテキスト クエリで使用される言語リソースの言語を指定することもできます。
通常、 CONTAINSTABLE や FREETEXTTABLE の結果をベーステーブルと結合する必要があります。 テーブルを結合するには、キー列の一意の名前を把握している必要があります。 この列は、全文対応のテーブルに存在し、テーブルの一意行( 一意キーカラム)を強制するために使われます。 キーカラムの詳細については、「 全文索引の作成および管理」をご覧ください。
結果。 これらの関数では、フルテキスト クエリと一致する 0 行、1 行、または 2 行以上で構成されるテーブルが返されます。 返されたテーブルには、ベース テーブルの行のうち、関数のフルテキスト検索条件に指定した選択基準に一致する行のみが含まれます。
これらの関数のいずれかを使用するクエリは、各行ごとに関連性ランキング値(RANK)と全文キー(KEY)も返します。以下のように:
KEY列。KEY列は返された行の一意値を返します。KEY列は選択基準を指定するために使用できます。RANK列。RANK列は各行のランク値を返し、その行が選択基準にどれだけ合致しているかを示します。 行内のテキストまたはドキュメントの順位値が高いほど、指定したフルテキスト クエリとその行との関連性が高いことを示します。 複数の行に同じ順位が付けられる可能性があります。 top_n_by_rank パラメーター (省略可能) を指定して、返される一致の数を制限することもできます。 詳細については、「 検索結果をランクで制限する」をご覧ください。
これらの関数の構文や引数の詳細については、 CONTAINSTABLE および FREETEXTTABLE を参照してください。
特定の種類の検索
特定の単語やフレーズ(簡単な用語)を検索する
CONTAINS、CONTAINSTABLE、FREETEXT、FREETEXTTABLEを使って特定の単語やフレーズをテーブルから検索できます。 例えば、ProductReviewデータベースのAdventureWorks2025テーブルで製品に関するすべてのlearning curveコメントを検索したい場合、CONTAINS述語は次のように使えます。
USE AdventureWorks2025;
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO
この場合は検索条件、 learning curveは複雑で、1つ以上の用語で構成されることがあります。
簡単な用語検索に関する詳細情報
フルテキスト検索において、語 (または トークン) とは、指定された言語の規則に従って適切なワード ブレーカーによって境界が識別された文字列です。 有効な句は、複数の語から構成されます。句読点を含む場合も含まない場合もあります。
例えば、 croissant は単語で、 café au lait はフレーズです。 このような言葉やフレーズは 「単純な用語」と呼ばれます。
CONTAINS そして CONTAINSTABLE そのフレーズにぴったり合うものを探します。
FREETEXT
FREETEXTTABLEフレーズを別々の単語に分割しています。
接頭辞(接頭辞用語)を持つ単語を検索する
CONTAINSやCONTAINSTABLEを使って、指定された接頭辞の単語やフレーズを検索できます。 指定したプレフィックスで始まるテキストが含まれる列のすべてのエントリが返されます。 例えば、top-、topple、toppingのように接頭辞topを含むすべての行を検索するには、クエリは次の例のように見えます。
USE AdventureWorks2025;
GO
SELECT Description,
ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO
アスタリスク (*) より前のテキストに一致するすべてのテキストが返されます。 テキストとアスタリスクが CONTAINS (DESCRIPTION, 'top*')のように二重引用符で区切られていなければ、全文検索ではアスタリスクはワイルドカードとはみなされません。
プレフィックス語句が句の場合、句を構成する各トークンは、それぞれ独立したプレフィックス語句と見なされます。 接頭辞で始まる単語があるすべての行は返されます。 例えば、接頭辞の項 light bread* は light breaded、 lightly breaded、 light breadのテキストを持つ行を見つけますが、返 lightly toasted breadは返しません。
プレフィックス検索に関する詳細情報
プレフィックス語句とは、派生語または変化形を生成するために語の前に付けられる文字列です。
単一の接頭辞項の場合、指定された項で始まる任意の単語は結果集合の一部です。 例えば、
auto*という項はautomatic、automobileなどと一致します。句の場合、句を構成する各語がプレフィックス語句と見なされます。 例えば、
auto tran*の項はautomatic transmissionとautomobile transducerに一致しますが、automatic motor transmissionには一致しません。
プレフィックス検索は CONTAINS と CONTAINSTABLEでサポートされています。
特定の単語(生成語)の屈折形を探す
CONTAINS、CONTAINSTABLE、FREETEXT、またはFREETEXTTABLEを使って動詞のさまざまな時制や活用、あるいは名詞の単数形と複数形の両方を検索できます(屈折検索)、または特定の単語の同義語形(類語辞典検索)。
以下の例は、footデータベースのfootテーブルのfeet列にある任意の形態のComments(ProductReview、AdventureWorks2025など)を検索します。
USE AdventureWorks2025;
GO
SELECT Comments,
ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO
フルテキスト検索では、動詞のさまざまな時制および活用または名詞の単数形と複数形の検索を可能にするステマーが使用されます。 ステマーについての詳細は、「 ワードブレイカーとステマーの設定と管理」をご覧ください。
世代用語検索に関する詳細情報
変化形は、動詞のさまざまな時制および活用、または名詞の単数形と複数形です。
例えば、「 drive」という単語の屈折形を検索してみてください。 テーブル内の複数の行に drive、 drives、 drove、 driving、 drivenの単語が含まれれば、それぞれが drive語から屈折的に生成できるため、結果集合に含まれます。
FREETEXT
FREETEXTTABLE指定されたすべての単語の屈折語をデフォルトで探します。
CONTAINS と CONTAINSTABLE は、省略可能な INFLECTIONAL 引数をサポートします。
特定の語のシノニムの検索
類義語辞典は、ユーザー指定の用語のシノニムを定義します。 シソーラスファイルの詳細については、「 Full-Text 検索のためのシソーラスファイルの構成および管理」をご覧ください。
例えば、類語辞典に {car, automobile, truck, van}の項目が追加された場合、 carという単語の類語辞典形式を検索できます。
automobile、truck、van、carを含むすべての行は、これらの単語がcarを含む同義語展開集合に属するため、結果集合に現れます。
FREETEXT そして FREETEXTTABLE デフォルトでシソーラスを使います。
CONTAINSとCONTAINSTABLEは、オプションのTHESAURUS引数をサポートします。
単語を他の単語の近くで検索する
"近接語句" は、相互に近い語句を示します。 最初の検索語句と最後の検索語句を分離する非検索用語の最大数を指定することもできます。 さらに、任意の順序で語や句を検索したり、指定した順序で語や句を検索したりすることができます。
例えば、単語 ice が単語 hockey の近くにある行や、 ice skating が句 ice hockeyの近くにある行を見つけたいです。
近接検索の詳細については、「NEAR を使用して別の単語の近くにある単語を検索する」をご覧ください。
重み付けされた値(重み付けされた語)を使って単語やフレーズを検索する
CONTAINSTABLEを使って単語やフレーズを検索し、重み付け値を指定できます。 重みは 0.0 ~ 1.0 の数値で指定し、一連の語句内における各語句の重要度を示します。 重み 0.0 は最低値であり、重み 1.0 は最高値です。
以下の例は、すべての顧客住所を重みを用いて検索するクエリを示しており、文字列 Bay で始まるテキストは Street または Viewのいずれかです。 結果は、指定された単語が多い行により高い順位を与えます。
USE AdventureWorks2025;
GO
SELECT AddressLine1,
KEY_TBL.RANK
FROM Person.Address AS Address
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
Street WEIGHT(0.9),
View WEIGHT(0.1)
) ') AS KEY_TBL
ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
重み付け語句は、単純語句、プレフィックス語句、生成語、または近接語句と組み合わせて使用できます。
加重語検索に関する詳細情報
重み付け語句検索において、重み付け値は、一連の語句内における各語句の重要度を示します。 重み付け値 0.0 は最低値であり、重み付け値 1.0 は最高値です。
たとえば、複数の語句を検索するクエリでは、検索条件の各検索語に、他の語との相対的な重要性を示す重み付け値を割り当てることができます。 この種のクエリ結果では、検索語に割り当てた相対的な重みに従って、最も関連性の高い行が最初に返されます。 結果セットには、指定された用語のいずれか(またはそれらの間の内容)を含む文書や行が含まれています。しかし、異なる検索語に関連する重み付け値の変動により、結果によっては他よりも関連性が高いと見なされることもあります。
重み付けされた語彙検索は CONTAINSTABLEによってサポートされています。
AND、OR、および NOT (ブール演算子) の使用
CONTAINS述語とCONTAINSTABLE関数は同じ探索条件を使用します。 どちらも、AND、 OR、 NOT などのブール演算子を用いて論理演算を行うことで複数の検索語を組み合わせることをサポートしています。 例えば、 ANDを使って、 latte と New York-style bagelの両方を含む行を見つけることができます。 例えば AND NOTを使って、 bagel を含むが cream cheeseを含まない行を見つけることができます。
対照的に、 FREETEXT と FREETEXTTABLE はブール語を検索対象の単語として扱います。
論理演算子CONTAINS、AND、ORを使う他の述語とNOTの組み合わせについては、Search conditionを参照してください。
例
以下の例では、記述IDが5でなく、記述にCONTAINSとAluminumの両方が含まれている記述を探すために、spindle述語を用います。 探索条件は AND ブール演算子を用います。 この例ではProductDescriptionデータベースのAdventureWorks2025テーブルを使用しています。
USE AdventureWorks2025;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
AND CONTAINS ((Description), 'aluminum AND spindle');
GO
大文字と小文字、ストップ ワード、言語、および類義語辞典
フルテキスト クエリを記述する場合は、次のオプションも指定できます。
大文字と小文字の区別。 フルテキスト検索クエリでは大文字と小文字は区別されません。 ただし、日本語の場合は、同じ発音を複数の方法で表記できます。この表記方法を正規化することは、大文字と小文字の区別をなくすことに似ています。たとえば、「かな」で検索することで、大文字小文字を区別しない検索に近い検索を実現できます。 この種の正書法正規化はサポートされていません。
ストップワード。 全文クエリを定義すると、Full-Text エンジンは検索条件からストップワード(ノイズワードとも呼ばれます)を破棄します。 ストップワードとは、
a、and、is、theといった単語で、頻繁に現れることがありますが、特定のテキスト検索にはあまり役立たないことが多いです。 ストップワードはストップリストに列挙されています。 各フルテキスト インデックスには特定のストップリストが関連付けられ、それによってクエリから、またはインデックス作成時にインデックスから除外されるストップワードが決まります。 詳細については、「 Full-Text 検索のためのストップワードおよびストップリストの設定および管理」をご覧ください。言語。
LANGUAGEオプションを使用します。 クエリ用語の多くは、ワード ブレーカーの動作に大きく依存します。 正しいワードブレーカー(およびステマー)やシソーラスファイルを使っているか確認するために、LANGUAGEオプションを指定するべきです。 詳細は「 全文索引作成時に言語を選択する」をご覧ください。シソーラス。
FREETEXTまた、FREETEXTTABLEクエリはデフォルトでシソーラスを使用します。CONTAINSとCONTAINSTABLEは、オプションのTHESAURUS引数をサポートします。 詳細については、「 フルテキスト検索に使用する類義語辞典ファイルの構成と管理」を参照してください。
トークン化の結果の確認
クエリに指定したワード ブレーカー、類義語辞典、およびストップリストの組み合わせを適用した後、sys.dm_fts_parser 動的管理ビューを使用して、フルテキスト検索が結果をどのようにトークン化するかを確認できます。 詳細については、 sys.dm_fts_parserをご覧ください。