CONTAINSTABLE (Transact-SQL)

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

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

В отличие от CONTAINS, запросы с функцией CONTAINSTABLE содержат типизированные полнотекстовые запросы, возвращающие ранжирующие по релевантности значения (RANK) и полнотекстовый ключ (KEY) для каждой строки. Сведения о видах полнотекстового поиска, поддерживаемых в SQL Server, см. в разделе Запрос с полнотекстовым поиском.

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Значок ссылки на раздел Cинтаксические обозначения в 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
    Имя таблицы, у которой есть полнотекстовый индекс. Аргумент table представляет собой имя объекта базы данных, состоящее из одной, двух, трех или четырех частей. При выполнении запроса к представлению задействуется только базовая таблица с полнотекстовым индексированием.

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

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

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

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

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

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

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

    Если значение указано в формате двухбайтовой кодировки (DBCS), то MicrosoftSQL 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 (Transact-SQL).

Замечания

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

Таблица результатов содержит столбец KEY со значениями полнотекстового ключа. Каждая таблица с полнотекстовым индексом содержит столбец, значения которого уникальны, а значения в столбце KEY набора результатов являются значениями полнотекстового ключа в строках, удовлетворяющих заданному условию поиска. Уникальный ключевой столбец можно определить с помощью свойства TableFulltextKeyColumn, которое возвращает функция OBJECTPROPERTYEX. Чтобы получить идентификатор столбца, связанного с полнотекстовым ключом полнотекстового индекса, используйте таблицу sys.fulltext_indexes. Дополнительные сведения см. в разделе sys.fulltext_indexes (Transact-SQL).

Чтобы получить нужные строки первоначальной таблицы, следует указать соединение со строками, возвращаемыми функцией CONTAINSTABLE. Обычно используется следующая форма инструкции SELECT с предложением FROM и функцией 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 к соответствующей таблице или столбцам, к которым обращается функция.

Примеры

А.Получение значений ранга

В следующем примере выполняется поиск всех названий продуктов, содержащих слова «frame», «wheel» или «tire», при этом для каждого слова задается определенный вес. Для каждой строки набора результатов, удовлетворяющей условию поиска, отображается относительная «близость» к совпадению (ранг). Кроме того, строки с более высоким рангом возвращаются первыми.

USE AdventureWorks2012;
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 по SQL Server 2014 включительно.

В следующем примере используется оператор NEAR для поиска «bracket» и «reflector», находящихся близко друг от друга в столбце таблицы Production.Document. Возвращаются только ранжирующие строки от 50 и выше.

USE AdventureWorks2012
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.

В.Получение 5 строк с максимальным рангом с помощью функции top_n_by_rank

В следующем примере возвращается описание первых 5 товаров, где столбец Description содержит слово «aluminum» рядом со словом «light» или «lightweight».

USE AdventureWorks2012;
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

GO

Г.Указание аргумента LANGUAGE

Следующий пример демонстрирует использование аргумента LANGUAGE.

USE AdventureWorks2012;
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.

См. также

Задания

Создание запросов полнотекстового поиска (визуальные инструменты для баз данных)

Справочник

CONTAINS (Transact-SQL)

SELECT (Transact-SQL)

Предложение FROM (Transact-SQL)

Основные понятия

Ограничение количества результатов поиска с использованием функции RANK

Запрос с полнотекстовым поиском

Запрос с полнотекстовым поиском