Функция CONTAINSTABLE (Transact-SQL)

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

Запросы с функцией CONTAINSTABLE содержат типизированные полнотекстовые запросы, возвращающие значение ранжирования релевантности (RANK) и полнотекстовый ключ (KEY) для каждой строки. Функция CONTAINSTABLE использует такие же условия поиска, как и предикат CONTAINS.

Значок ссылки на разделСоглашения о синтаксическом обозначении в 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 > 
    | < 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 ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 
< 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.syslanguages. Строка должна быть заключена в одиночные кавычки: 'language_term'. Если аргумент language_term указан как целое число, он представляет собой фактический код языка, идентифицирующий данный язык. Если значение language_term задано в шестнадцатеричной форме, то после символов «0x» должна следовать шестнадцатеричная запись кода языка. Шестнадцатеричное значение не может иметь более восьми знаков, включая начальные нули.

    Если значение выражено в формате с двухбайтной кодировкой (DBCS), Microsoft 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 (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 для упорядочивания строк таблицы по рангу.

  • В списке выборки для определения ранга каждой строки.

Функция CONTAINSTABLE не считается ключевым словом, если уровень совместимости меньше 70. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).

Разрешения

Функцию могут выполнять только пользователи, обладающие правами доступа SELECT к соответствующей таблице или столбцам, к которым обращается функция.

Примеры

А. Получение значений ранга с помощью функции CONTAINSTABLE

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

USE Northwind;
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
    FROM Categories AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Categories, Description, 
        'ISABOUT (breads weight (.8), 
        fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
            ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Б. Получение строк с рангом, превышающим указанное значение, с помощью функции CONTAINSTABLE

Запрос в следующем примере возвращает имя и описание всех категорий товаров, где столбец Description содержит слова "sweet and savory" рядом со словами sauces или candies. Все строки с названием категории Seafood не рассматриваются. Возвращаются только строки с ранжирующим значением 2 и выше.

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

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

Запрос в следующем примере возвращает 10 строк (имя и описание категории товаров) с максимальным рангом, где столбец Description содержит слова «sweet and savory» рядом со словами «sauces» или «candies».

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

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

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

USE Northwind;
SELECT FT_TBL.Description , FT_TBL.CategoryName , KEY_TBL.RANK
FROM dbo.Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (dbo.Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)',LANGUAGE N'English', 10) 
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY];
ПримечаниеПримечание

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

См. также

Задания

Справочник

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