次の方法で共有


CONTAINTABLE(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

1 つの単語や語句に対する正確な一致またはあいまい (精度の低い) 一致、互いに一定の距離内の単語の近接性、重み付けされた一致を含む列の 0 行、1 行、または複数行のテーブルを返します。 CONTAINSTABLEは、Transact-SQL ステートメントの SELECTで使用され、通常のテーブル名であるかのように参照されます。 文字ベースのデータ型を含むフルテキスト インデックス付き列に対して SQL Server フルテキスト検索を実行します。

CONTAINSTABLECONTAINS と同じ種類の一致に役立ち、 CONTAINSと同じ検索条件を使用します。

ただし、 CONTAINSとは異なり、 CONTAINSTABLE を使用するクエリでは、各行の関連性ランク付け値 (RANK) とフルテキスト キー (KEY) が返されます。 SQL Server でサポートされているフルテキスト検索の形式については、「フルテキスト検索でのクエリ」を参照してください。

Transact-SQL 構文表記規則

構文

CONTAINSTABLE
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '
     [ , LANGUAGE language_term ]
  [ , top_n_by_rank ]
)

<contains_search_condition> ::=
    { <simple_term>
    | <prefix_term>
    | <generation_term>
    | <generic_proximity_term>
    | <custom_proximity_term>
    |  <weighted_term>
    }
    | { ( <contains_search_condition> )
    { { AND | & } | { AND NOT | &! } | { OR | | } }
     <contains_search_condition> [ ...n ]
    }

<simple_term> ::=
     { word | "phrase" }
<prefix term> ::=
     { "word*" | "phrase*" }
<generation_term> ::=
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ , ...n ] )

<generic_proximity_term> ::=
     { <simple_term> | <prefix_term> } { { { NEAR | ~ }
     { <simple_term> | <prefix_term> } } [ ...n ] }

<custom_proximity_term> ::=
  NEAR (
     {
        { <simple_term> | <prefix_term> } [ , ...n ]
     |
        ( { <simple_term> | <prefix_term> } [ , ...n ] )
      [ , <maximum_distance> [ , <match_order> ] ]
     }
       )

      <maximum_distance> ::= { integer | MAX }
      <match_order> ::= { TRUE | FALSE }

<weighted_term> ::=
     ISABOUT
    ( { {
  <simple_term>
  | <prefix_term>
  | <generation_term>
  | <proximity_term>
  }
   [ WEIGHT ( weight_value ) ]
   } [ , ...n ]
    )

引数

テーブル

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

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

column_name

フルテキスト検索用にインデックスが作成される 1 つ以上の列の名前。 列には、charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max) のいずれかの型を指定できます。

column_list

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

*

table内のすべてのフルテキスト インデックス列を使用して、指定された検索条件を検索するように指定します。 language_term を指定しない場合、テーブルのすべての列の言語は同じである必要があります。

言語 language_term

単語区切り、ステミング、類義語辞典、ノイズ ワード (または ストップワード) の削除に使用されるリソースをクエリの一部として使用する言語。 このパラメーターは省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。 language_termを指定すると、それが表す言語が検索条件のすべての要素に適用されます。 値を指定しなかった場合は、列のフルテキストの言語が使用されます。

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

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

値が 2 バイト文字セット (DBCS) 形式の場合、SQL Server によって Unicode に変換されます。

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

top_n_by_rank

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

<contains_search_condition>

column_name で検索するテキストと、その一致条件を指定します。 検索条件の詳細については、「 CONTAINS」を参照してください。

解説

フルテキスト述語と関数は、 FROM 述語で暗黙的に示されている 1 つのテーブルで動作します。 複数のテーブルを検索するには、 FROM 句で結合テーブルを使用して、2 つ以上のテーブルの積である結果セットを検索します。

返されるテーブルには、フルテキスト キー値を含む KEY という名前の列があります。 各フルテキスト インデックステーブルには、値が一意であることが保証される列があり、 KEY 列に返される値は、contains 検索条件で指定された選択条件に一致する行のフルテキスト キー値です。 TableFulltextKeyColumn関数から取得した OBJECTPROPERTYEX プロパティは、この一意のキー列の ID を提供します。 フルテキスト インデックスのフルテキスト キーに関連付けられている列の ID を取得するには、 sys.fulltext_indexes を使用して詳細については、「 sys.fulltext_indexes」を参照してください。

元のテーブルから目的の行を取得するには、 CONTAINSTABLE 行との結合を指定します。 FROMを使用するSELECTステートメントのCONTAINSTABLE句の一般的な形式は次のとおりです。

SELECT select_list
FROM table AS FT_TBL
INNER JOIN CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY];

CONTAINSTABLEによって生成されるテーブルには、RANKという名前の列が含まれています。 RANK列は、行が選択条件とどの程度一致したかを示す各行の値 (0 ~ 1000) です。 このランク値は、通常、 SELECT ステートメントで次のいずれかの方法で使用されます。

  • テーブルの最初の行として最上位の行を返す ORDER BY 句。

  • 選択リストで、各行に割り当てられているランク値を表示します。

アクセス許可

実行アクセス許可は、テーブルまたは参照先テーブルの列に対する適切な SELECT 権限を持つユーザーのみが使用できます。

A。 基本的な例

次の例では、2 つの列の単純なテーブルを作成して設定し、3 つの国/地域とそのフラグの色を一覧表示します。 テーブルにフルテキスト カタログとインデックスを作成して設定します。 次に、 CONTAINSTABLE 構文を示します。 この例では、検索値が複数回満たされたときにランク値が高くなる方法を示します。 最後のクエリでは、緑と黒の両方を含むタンザニアは、クエリされた色の 1 つだけを含むイタリアよりも高いランクを持っています。

CREATE TABLE Flags
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO 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 CONTAINSTABLE (Flags, FlagColors, 'Green')
ORDER BY RANK DESC;

SELECT *
FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black')
ORDER BY RANK DESC;

B. ランク値を返す

次の例では、単語 framewheel、または tireを含むすべての製品名を検索し、各単語に異なる重みを指定します。 これらの検索条件に一致する返される行ごとに、一致の相対的な近さ (ランク付け値) が表示されます。 また、最も順位値の高い行を最初に返します。

USE AdventureWorks2022;
GO

SELECT FT_TBL.Name,
       KEY_TBL.RANK
FROM Production.Product AS FT_TBL
     INNER JOIN CONTAINSTABLE (
        Production.Product,
        Name,
        'ISABOUT (frame WEIGHT (.8), wheel WEIGHT (.4), tire WEIGHT (.2) )'
     ) AS KEY_TBL
     ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

C: 指定した値より大きいランク値を返します

適用対象: SQL Server 2012 (11.x) 以降のバージョン。

次の例では、NEAR を使用してbracketを検索し、reflector テーブル内で互いに近いProduction.Documentします。 また、順位値が 50 以上の行だけを返します。

USE AdventureWorks2022;
GO

SELECT DocumentNode,
       Title,
       DocumentSummary
FROM Production.Document AS DocTable
     INNER JOIN CONTAINSTABLE (Production.Document, Document, 'NEAR(bracket, reflector)') AS KEY_TBL
         ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC;
GO

フルテキスト クエリで最大距離として整数が指定されていない場合、ギャップが 100 を超える論理用語のヒットのみを含むドキュメントは、 NEAR 要件を満たせず、そのランク付けは 0 になります。

D. top_n_by_rankを使用して上位 5 つのランク付けされた結果を返す

次の使用例は、Description列に単語 aluminum または単語 light の近くにlightweight単語が含まれている上位 5 つの製品の説明を返します。

USE AdventureWorks2022;
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)', 5) AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO

E. LANGUAGE 引数を指定する

次の例は、 LANGUAGE 引数の使用を示しています。

USE AdventureWorks2022;
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)',
        LANGUAGE N'English', 5) AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO

top_n_by_rankを使用する場合、LANGUAGE language_term引数は必要ありません