Общие сведения о полнотекстовых предикатах и функциях

Полнотекстовые запросы используют полнотекстовые предикаты (CONTAINS и FREETEXT) и функции (CONTAINSTABLE и FREETEXTTABLE). Эти предикаты и функции поддерживают расширенный синтаксис Transact-SQL, который поддерживает разнообразные формы выражений запроса. Для создания полнотекстовых запросов нужно знать, когда и как использовать полнотекстовые предикаты и функции. В этом разделе описаны предикаты и функции, рассматриваются общие возможности предиката CONTAINS и функции CONTAINSTABLE.

Общие сведения о полнотекстовых предикатах (CONTAINS и FREETEXT)

Предикаты CONTAINS и FREETEXT задаются в предложении WHERE или HAVING инструкции SELECT. Они могут быть объединены с любым из других предикатов Transact-SQL, например LIKE и BETWEEN.

Предикаты CONTAINS и FREETEXT возвращают значение TRUE или FALSE. С их помощью можно задавать критерии выбора, чтобы определить, соответствует ли данная строка полнотекстовому запросу. Совпадающие строки возвращаются в результирующем наборе.

При использовании предиката CONTAINS или FREETEXT можно указать, следует ли искать один столбец, список столбцов или все столбцы в таблице. Можно также указать язык, ресурсы которого будут использоваться данным полнотекстовым запросом для разбиения слов и морфологического поиска, поиска в тезаурусе и удаления неучитываемых слов.

Предикаты CONTAINS и FREETEXT используются для разных видов совпадений.

  • Использование предиката CONTAINS (или CONTAINSTABLE) для нахождения точного или неточного (менее точного) совпадения с отдельными словами и фразами, сходства слов на определенном расстоянии друг от друга или взвешенных совпадений. При использовании предиката CONTAINS необходимо указать по крайней мере одно условие поиска, в котором задается искомый текст и условия, определяющие совпадения.

    Между условиями поиска можно использовать логическую операцию. Дополнительные сведения см. в подразделе Использование логических операторов AND, OR, AND NOT (в предикатах CONTAINS и CONTAINSTABLE) ниже в этом разделе.

  • Использование предикатов FREETEXT (или FREETEXTTABLE) для поиска совпадения по смыслу, а не буквального совпадения задаваемых слов, фраз или предложений (текст в свободной форме). Соответствие регистрируется, если в полнотекстовом индексе указанного столбца найден любой из терминов в любой форме.

В предикатах CONTAINS или FREETEXT при выполнении запросов к связанным серверам можно использовать четырехкомпонентные имена. Дополнительные сведения см. в разделе Запросы к связанным серверам с помощью компонента Full-Text Search.

Дополнительные сведения о синтаксисе и аргументах этих предикатов см. в разделах CONTAINS (Transact-SQL) и FREETEXT (Transact-SQL).

ПримечаниеПримечание

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

Примеры

A. Использование CONTAINS с <simple_term>

В следующем примере выполняется поиск всех продуктов с ценой $80.99, которые содержат слово "Mountain".

USE AdventureWorks2008R2;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

Б. Поиск слов, содержащих определенные символы, с помощью предиката FREETEXT

Следующий пример просматривает все документы, содержащие слова, которые связаны со словами «vital», «safety», «components».

USE AdventureWorks2008R2;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO

Общие сведения о полнотекстовых функциях (CONTAINSTABLE и FREETEXTTABLE)

На функции CONTAINSTABLE и FREETEXTTABLE можно ссылаться в предложении FROM инструкции SELECT как на обычное имя таблицы. Они возвращают пустую таблицу, либо таблицу с одной или несколькими строками, соответствующими полнотекстовому запросу. Возвращаемая таблица содержит только строки базовой таблицы, которые соответствуют критерию выбора, задаваемому в условии полнотекстового поиска функции.

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

  • Столбец KEY

    Столбец KEY возвращает уникальные значения возвращаемых строк. С помощью столбца KEY можно задавать критерии выбора.

  • Столбец RANK

    Столбец RANK содержит ранжирующее значение для каждой строки, указывающее степень соответствия этой строки критериям выбора. Чем выше ранжирующее значение текста или документа в строке, тем больше она релевантна данному полнотекстовому запросу. Следует отметить, что разные строки могут ранжироваться одинаково. Можно ограничить число возвращаемых совпадений. Для этого нужно задать необязательный параметр top_n_by_rank. Дополнительные сведения см. в разделах Ограничение ранжированных результирующих наборов (компонент Full-Text Search) и Как ранжируются результаты поискового запроса (полнотекстовый поиск).

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

Функция CONTAINSTABLE используется для тех же видов совпадений, что и предикат CONTAINS, а функция FREETEXTTABLE — для тех же видов совпадений, что и предикат FREETEXT. Дополнительные сведения см. выше в подразделе Обзор полнотекстовых предикатов (CONTAINS и FREETEXT). При выполнении запросов, которые используют функции CONTAINSTABLE и FREETEXTTABLE, нужно явно объединить строки, возвращаемые со строками в базовой таблице SQL Server.

Дополнительные сведения о синтаксисе и аргументах этих функций см. в разделах Функция CONTAINSTABLE (Transact-SQL) и FREETEXTTABLE (Transact-SQL).

Примеры

A. Использование 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

Б. Использование FREETEXTTABLE

В следующем примере запрос FREETEXTTABLE расширяется таким образом, чтобы он возвратил первыми строки с самыми высокими ранжирующими значениями и добавил ранг каждой строки к списку выбора. Чтобы задать запрос, необходимо знать, что столбец CategoryID является уникальным ключевым столбцом для таблицы Категории.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories AS FT_TBL 
     INNER JOIN
     FREETEXTTABLE(Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Ниже приведено расширение того же запроса, которое возвращает только строки с ранжирующим значением 10 или выше.

USE Northwind;
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Categories FT_TBL 
     INNER JOIN
     FREETEXTTABLE (Categories, Description,
                    'How can I make my own beers and ales?') AS KEY_TBL
     ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Использование условных операторов AND, OR, AND NOT (в CONTAINS и CONTAINSTABLE)

Функция CONTAINSTABLE и предикат CONTAINS используют одинаковые условия поиска. Они поддерживают объединение нескольких искомых терминов (с помощью логических операторов AND, OR, AND NOT) для выполнения логических операций. Например, оператор AND можно использовать для поиска строк, содержащих и «латте», и «пирожное с кремом». Например, с помощью оператора AND NOT можно находить строки, которые содержат слово «бублик», но не содержат «мак».

ПримечаниеПримечание

Предикаты FREETEXT и FREETEXTTABLE, напротив, обрабатывают логические термины как слова, которые следует искать.

Сведения о сочетании предиката CONTAINS с другими предикатами, которые используют логические операторы AND, OR и NOT, см. в разделе Условие поиска (Transact-SQL).

Пример

В следующем примере используется таблица ProductDescription базы данных База данных AdventureWorks2008R2. Запрос использует предикат CONTAINS для поиска описаний, в которых идентификатор описания не равен 5 и описание содержат слова «Aluminum» и «spindle». Условие поиска использует логический оператор AND.

USE AdventureWorks2008R2;
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
   CONTAINS(Description, ' Aluminum AND spindle');
GO

Дополнительные сведения

Каждая таблица, поддерживающая полнотекстовый поиск, имеет столбец, который обеспечивает принудительное применение уникальных строк в таблице (уникальныйключевой столбец). При написании полнотекстовых запросов типа CONTAINSTABLE или FREETEXTTABLE требуется имя столбца уникального ключа. Дополнительные сведения см. в разделе Как запрашивать сведения о столбце полнотекстового ключа (Transact-SQL).

Многие выражения запроса в значительной степени зависят от поведения средства разбиения по словам. Чтобы гарантировать использование правильного средства разбиения по словам (и парадигматический модуль) и файл тезауруса, рекомендуется указывать аргумент LANGUAGE. Дополнительные сведения см. в разделе Рекомендации по выбору языка при создании полнотекстового индекса.

При определении полнотекстового запроса следует иметь в виду, что средство полнотекстового поиска не учитывает стоп-слова (также известные как пропускаемые слова), указанные в критерии поиска. Стоп-слова — это часто встречающиеся слова, которые не повышают эффективность поиска конкретного текста. Примерами могут служить слова «и», «или», «о» и «в». Стоп-слова перечислены в списке стоп-слов. Каждый полнотекстовый индекс связан с конкретным списком стоп-слов, который определяет, какие стоп-слова не указываются в запросе или в индексе во время индексирования. Дополнительные сведения см. в разделе Стоп-слова и списки стоп-слов.

Совпадение с тезаурусом по умолчанию выполняется для запросов Transact-SQL с CONTAINS и CONTAINSTABLE, которые указывают предложение FORMSOF THESAURUS, и для запросов FREETEXT и FREETEXTABLE.

См. также

Задания

Справочник

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