Поделиться через


CONTAINSTABLE (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Возвращает пустую таблицу или таблицу из одной или нескольких строк. Столбцы этой таблицы содержат символьные данные, точно или нечетко (менее точно) соответствующие отдельным словам и фразам, расстоянию между словами или взвешенным совпадениям. CONTAINSTABLE используется в предложении FROM инструкции Transact-SQL SELECT и ссылается, как если бы это было обычное имя таблицы. Он выполняет полнотекстовый поиск SQL Server на полнотекстовых индексированных столбцах, содержащих типы данных на основе символов.

CONTAINSTABLE полезно для тех же типов совпадений, что и CONTAINS , и использует те же условия поиска, что CONTAINSи .

В отличие от CONTAINSзапросов, использующих CONTAINSTABLE значение ранжирования релевантности () и полнотекстовый ключ (RANKKEY) для каждой строки. Сведения о формах полнотекстового поиска, поддерживаемых 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 ]
    )

Аргументы

таблицы

Имя таблицы, которая была индексирована полнотекстовой. таблица может быть одним, двумя, тремя или четырехкомпонентными именами объектов базы данных. При запросе представления можно использовать только одну полнотекстовую индексированную базовую таблицу.

таблица не может указать имя сервера и не может использоваться в запросах к связанным серверам.

column_name

Имя одного или нескольких столбцов, индексированных для полнотекстового поиска. Столбцы должны иметь тип char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary или varbinary(max).

column_list

Указывает, что можно задать несколько столбцов, разделенных запятыми. column_list должен быть заключен в скобки. Если задан аргумент language_term, то у всех столбцов в column_list должен быть одинаковый язык.

*

Указывает, что все полнотекстовые индексированные столбцы в таблице должны использоваться для поиска заданного условия поиска. Если не определен аргумент language_term, язык для всех столбцов таблицы должен быть одинаковым.

ЯЗЫК language_term

Язык, ресурсы которого используются для разбиения слов, стебляния и тезауруса и шумового слова (или стоп-слов) удаления в рамках запроса. Этот аргумент не является обязательным и может быть строкой, целым числом или шестнадцатеричным значением, соответствующим идентификатору локали (LCID). Если указан language_term , язык, который он представляет, применяется ко всем элементам условия поиска. Если значение не указано, то используется язык полнотекстового поиска, заданный для столбца.

Если в одном столбце хранятся документы на различных языках в виде больших двоичных объектов, то идентификатор локали заданного документа определяет, какой язык должен использоваться для индексирования его содержимого. При запросе такого столбца укажите LANGUAGE <language_term> , чтобы повысить вероятность хорошего совпадения.

При указании в виде строки language_term соответствует alias значению столбца в представлении совместимости sys.syslanguages . Строка должна быть заключена в одиночные кавычки: 'language_term'. Если значением аргумента language_term является целое число, оно представляет собой действительный код языка. Если значение language_term задано в шестнадцатеричной форме, то после символов "0x" должна следовать шестнадцатеричная запись кода языка. Шестнадцатеричное значение не может иметь более восьми знаков, включая начальные нули.

Если значение находится в формате двойного байтового набора символов (DBCS), SQL Server преобразует его в Юникод.

Если указанный язык недействителен или нет установленных ресурсов, соответствующих указанному языку, SQL Server возвращает ошибку. Для использования нейтральных языковых ресурсов следует указать 0x0 в качестве значения аргумента language_term.

top_n_by_rank

Указывает, что возвращаются только совпадения с наибольшим рейтингом n в порядке убывания. Применяется только при указании целочисленного значения n. Если параметр top_n_by_rank скомбинирован с другими параметрами, то запрос может вернуть меньше строк, чем фактически соответствует всем предикатам. top_n_by_rank позволяет повысить производительность запросов, вспоминая только наиболее релевантные хиты.

<contains_search_condition>

Текст, который необходимо найти в столбце column_name, и условия соответствия. Сведения об условиях поиска см. в разделе CONTAINS.

Замечания

Полнотекстовые предикаты и функции работают над одной таблицей, которая подразумевается в FROM предикате. Чтобы выполнить поиск по нескольким таблицам, используйте присоединенную таблицу в предложении FROM для поиска результирующий набор, который является продуктом двух или более таблиц.

Возвращаемая таблица содержит столбец с KEY именем, содержащий значения полнотекстового ключа. Каждая полнотекстовая индексированная таблица содержит столбец, значения которого гарантированно будут уникальными, а значения, возвращаемые в KEY столбце, — это полнотекстовые ключевые значения строк, которые соответствуют критериям выбора, указанным в условии поиска. Свойство TableFulltextKeyColumn , полученное OBJECTPROPERTYEX из функции, предоставляет удостоверение этого уникального ключевого столбца. Чтобы получить идентификатор столбца, связанного с полным текстовым ключом полнотекстового индексаsys.fulltext_indexes дополнительные сведения sys.fulltext_indexes.

Чтобы получить строки из исходной таблицы, укажите соединение со CONTAINSTABLE строками. Типичная форма предложения для инструкции FROMSELECT using 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 привилегиями в таблице или столбцах указанной таблицы.

Примеры

А. Базовый пример

В следующем примере создается простая таблица двух столбцов, в которой перечислены три страны или регионы и цвета флагов. Он создает и заполняет полнотекстовый каталог и индекс в таблице. CONTAINSTABLE Затем показан синтаксис. В этом примере показано, как значение ранга увеличивается, когда значение поиска выполняется несколько раз. В последнем запросе Танзания, которая содержит как зеленый, так и черный, имеет более высокий рейтинг, чем Италия, которая содержит только один из запрашиваемых цветов.

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;

В. Возвращать значения ранжирования

В следующем примере выполняется поиск всех названий продуктов, содержащих слова frame, wheelили 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

В. Возвращать значения ранга, превышающие указанное значение

относится к: SQL Server 2012 (11.x) и более поздним версиям.

В следующем примере для поиска bracket и reflector закрытия между собой в Production.Document таблице используется МЕТОД NEAR. Возвращаются только ранжирующие строки от 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.

Д. Возврат лучших пяти ранжированных результатов с помощью top_n_by_rank

В следующем примере возвращается описание первых пяти продуктов, в которых Description столбец содержит слово aluminum рядом с словом или словомlightlightweight.

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

Е. Указание аргумента 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

Примечание.

Аргумент LANGUAGE language_term не требуется для использования top_n_by_rank.