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


FREETEXT (Transact-SQL)

Предикат, используемый в Transact-SQLпредложении WHERE инструкции Transact-SQL SELECT для выполнения полнотекстового поиска по столбцам полнотекстового индекса, содержащим символьные типы данных SQL Server. Этот предикат выполняет поиск значений, которые соответствуют условию поиска по смыслу, а не написанию. Когда используется предикат FREETEXT, ядро полнотекстовых запросов автоматически выполняет описанные далее действия над строкой freetext_string, присваивает вес каждому терму, а затем ищет совпадения.

  • Разбивает строку на отдельные слова согласно границам слов (пословное разбиение).

  • Формирует словоформы (а также производит выделение основы слова).

  • Определяет список расширений или замен для термов на основании совпадений в тезаурусе.

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

Сведения о формах и полнотекстовом поиске, поддерживаемых в SQL Server, см. в разделе Запрос с полнотекстовым поиском.

Значок ссылки на раздел Синтаксические обозначения Transact-SQL

Синтаксис

FREETEXT ( { column_name | (column_list) | * } 
          , 'freetext_string' [ , LANGUAGE language_term ] )

Аргументы

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

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

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

  • freetext_string
    Текст для поиска в столбце column_name. Допустим любой текст, содержащий слова, фразы или предложения. Соответствия формируются, если любой термин или его формы найдены в полнотекстовом индексе.

    В отличие от условий поиска CONTAINS и CONTAINSTABLE, где слово AND является ключевым, при использовании в параметре freetext_string слово «and» считается пропускаемым (или стоп-словом) и не обрабатывается.

    Использование функций WEIGHT, FORMSOF, символов шаблонов, NEAR, а также других синтаксических элементов запрещено. freetext_string разбивается на слова, проходит процедуру вычленения корней и пропускается через тезаурус.

    Аргумент freetext_string имеет тип nvarchar. Если в качестве входных данных используется другой тип символьных данных, производится неявное преобразование. В следующем примере переменная @SearchWord, тип которой определен как varchar(30), вызывает неявное преобразование в предикате FREETEXT.

    USE AdventureWorks2012;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    Так как пробное сохранение параметров не работает с преобразованием, для улучшения производительности следует использовать тип nvarchar. В данном примере следует объявить переменную @SearchWord с типом nvarchar(30).

    USE AdventureWorks2012;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE FREETEXT(Description, @SearchWord);
    

    Указанием запроса OPTIMIZE FOR можно также воспользоваться в случаях, когда формируется неоптимальный план.

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

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

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

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

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

Общие замечания

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

Полнотекстовые запросы с использованием FREETEXT являются менее точными, нежели полнотекстовые запросы с использованием CONTAINS. Средство SQL Server полнотекстового поиска идентифицирует важные слова и фразы. Ни одному из зарезервированных ключевых слов или символов-шаблонов не придается специального смысла, который они обычно имеют при использовании в параметре <УсловиеПоискаПредикатаCONTAINS> предиката CONTAINS.

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

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

Функция FREETEXTTABLE полезна для поиска совпадений того же типа, что и предикат FREETEXT. На эту функцию можно ссылаться как на обычное имя таблицы в предложении FROM инструкции SELECT. Дополнительные сведения см. в разделе FREETEXTTABLE (Transact-SQL).

Запрос к удаленному серверу

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

Сравнение предиката LIKE с полнотекстовым поиском

В отличие от полнотекстового поиска предикат LIKETransact-SQL работает только с комбинациями символов. Кроме того, предикат LIKE нельзя использовать в запросах к форматированным двоичным данным. Более того, запрос с предикатом LIKE к большому количеству неструктурированных текстовых данных выполняется гораздо медленнее, чем эквивалентный полнотекстовый запрос к тем же данным. Выполнение запроса LIKE к миллионам строк текстовых данных может занять несколько минут, в то время как полнотекстовый запрос к тем же данным занимает всего несколько секунд или даже меньше, в зависимости от количества возвращаемых строк.

Примеры

А.Использование инструкции FREETEXT для поиска слов, содержащих определенные значения символов

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

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

Б.Использование FREETEXT с переменными

Нижеприведенные примеры используют переменную вместо конкретного термина для поиска.

USE AdventureWorks2012;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description 
FROM Production.ProductDescription 
WHERE FREETEXT(Description, @SearchWord);
GO

См. также

Задания

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

Справочник

CREATE FULLTEXT CATALOG (Transact-SQL)

CREATE FULLTEXT INDEX (Transact-SQL)

CONTAINS (Transact-SQL)

CONTAINSTABLE (Transact-SQL)

Типы данных (Transact-SQL)

FREETEXTTABLE (Transact-SQL)

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

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

Приступая к работе с компонентом Full-Text Search

Создание и управление полнотекстовыми каталогами

Создание и управление полнотекстовыми индексами

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