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

Изменения: 17 июля 2006 г.

Возвращает пустую таблицу или таблицу из одной или нескольких строк. Столбцы этой таблицы содержат символьные данные, точно или нечетко (менее точно) соответствующие отдельным словам и фразам, расстоянию между словами или взвешенным совпадениям. Ссылка на функцию 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 представляет собой имя объекта базы данных, состоящее из одной, двух, трех или четырех частей.
  • column_name
    Имя столбца из таблицы table, в котором выполняется поиск. Для полнотекстового поиска подходят столбцы типа char, varchar, nchar, nvarchar, text, ntext, image, xml, binary и varbinary.
  • column_list
    Позволяет указать несколько столбцов, разделенных запятыми. Аргумент column_list необходимо заключить в круглые скобки. Если задан аргумент language_term, то у всех столбцов в списке column_list должен быть одинаковый язык.
  • *
    Указывает, что все столбцы в таблице, зарегистрированные для полнотекстового поиска, должны использоваться для поиска по заданному условию. Если предложение FROM содержит несколько таблиц, то символ «*» должен присутствовать в имени таблицы. Если аргумент language_term не указан, то язык всех столбцов таблицы должен быть одинаковым.
  • LANGUAGE language_term
    Язык, ресурсы которого будут использоваться для разбиения слов, выделения корня, проверки по словарю и удаления лишних слов из запроса CONTAINS. Этот параметр указывается по желанию и может быть указан как строка, целое число или шестнадцатеричное значение, соответствующее идентификатору территории (LCID) языка. Если аргумент language_term задан, то соответствующий язык будет применяться ко всем элементам условия поиска. Если значение не указано, используется полнотекстовый язык столбца.

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

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

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

  • top_n_by_rank
    Позволяет ограничить результирующий набор до n первых, упорядоченных по убыванию, ранжированных строк, соответствующих условию поиска. Применяется в том случае, если n является целым числом. Если используется дополнительная фильтрация, то может быть возвращено менее n результатов.
  • <contains_search_condition>
    Текст, который необходимо найти в столбце column_name, и условия соответствия. Дополнительные сведения см. в разделе CONTAINS (Transact-SQL).

Замечания

Таблица результатов содержит столбец 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», при этом для каждого слова задается определенный вес. Для каждой строки набора результатов, удовлетворяющей условию поиска, отображается относительная «близость» к совпадению (ранг). Кроме того, строки с более высоким рангом возвращаются первыми.

ms189760.note(ru-ru,SQL.90).gifПримечание.
Для запуска этого примера необходимо установить базу данных Northwind. Сведения о том, как установить базу данных Northwind, см. в разделе Загрузка образцов баз данных Northwind и pubs.
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 и выше.

ms189760.note(ru-ru,SQL.90).gifПримечание.
Для запуска этого примера необходимо установить базу данных Northwind. Сведения о том, как установить базу данных Northwind, см. в разделе Загрузка образцов баз данных Northwind и pubs.
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».

ms189760.note(ru-ru,SQL.90).gifПримечание.
Для запуска этого примера необходимо установить базу данных Northwind. Сведения о том, как установить базу данных Northwind, см. в разделе Загрузка образцов баз данных Northwind и pubs.
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];

ms189760.note(ru-ru,SQL.90).gifПримечание.
Аргумент LANGUAGE language_term не требуется при использовании функции top_n_by_rank.

См. также

Справочник

CONTAINS (Transact-SQL)
Функции наборов строк (Transact-SQL)
SELECT (Transact-SQL)
Предложение WHERE (Transact-SQL)

Другие ресурсы

Запросы к SQL Server с использованием компонента Full-Text Search

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

17 июля 2006 г.

Добавления
  • добавлен пример для аргумента LANGUAGE.