FREETEXT (Transact-SQL)
Этот предикат используется в предложении WHERE для поиска в столбцах, содержащих символьные типы данных, тех значений, которые соответствуют условию поиска по смыслу, а не написанию. Когда используется предикат FREETEXT, ядро полнотекстовых запросов автоматически выполняет описанные далее действия над строкой freetext_string, присваивает вес каждому терму, а затем ищет совпадения.
Разбивает строку на отдельные слова согласно границам слов (пословное разбиение).
Формирует словоформы (а также производит выделение основы слова).
Определяет список расширений или замен для термов на основании совпадений в тезаурусе.
Синтаксис
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 заключена в двойные кавычки, производится поиск соответствия фразы; поиск корня и проверка по словарю не производится.
Аргумент freetext_string имеет тип nvarchar. Если в качестве входных данных используется другой тип символьных данных, производится неявное преобразование. В следующем примере переменная @SearchWord, тип которой определен как varchar(30), вызывает неявное преобразование в предикате FREETEXT.
USE AdventureWorks; GO DECLARE @SearchWord varchar(30) SET @SearchWord ='performance' SELECT Description FROM Production.ProductDescription WHERE FREETEXT(Description, @SearchWord);
Так как пробное сохранение параметров не работает поверх преобразования, для улучшения производительности следует использовать тип nvarchar. В данном примере следует объявить переменную @SearchWord с типом nvarchar(30).
USE AdventureWorks; 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.
Инструкция FREETEXT не будет опознана как ключевое слово, если уровень совместимости меньше 70. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).
Полнотекстовые предикаты не допускаются в предложении OUTPUT, если уровень совместимости базы данных установлен в значение 100.
Примеры
А. Использование инструкции FREETEXT для поиска слов, содержащих определенные символы
Следующий пример просматривает все документы, содержащие слова, которые связаны со словами «vital», «safety», «components».
USE AdventureWorks;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
Б. Использование FREETEXT с переменными
Нижеприведенные примеры используют переменную вместо конкретного термина для поиска.
USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
См. также