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