FREETEXT (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Предикат, используемый в Transact-SQL в предложении WHERE инструкции SELECT Transact-SQL для выполнения полнотекстового поиска по столбцам полнотекстового индекса, содержащим символьные типы данных SQL Server. Этот предикат выполняет поиск значений, которые соответствуют условию поиска по смыслу, а не написанию. Когда используется предикат FREETEXT, ядро полнотекстовых запросов автоматически выполняет описанные далее действия над строкой freetext_string, присваивает вес каждому терму, а затем ищет совпадения.
Разбивает строку на отдельные слова согласно границам слов (пословное разбиение).
Формирует словоформы (а также производит выделение основы слова).
Определяет список расширений или замен для термов на основании совпадений в тезаурусе.
Примечание.
Сведения о формах полнотекстового поиска, поддерживаемых SQL Server, см. в статье "Запрос" с полнотекстовой поиском.
Область применения: SQL Server ( SQL Server 2008 (10.0.x) до текущей версии.
Соглашения о синтаксисе 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. Если в качестве входных данных используется другой тип символьных данных, производится неявное преобразование. Типы данных больших значений nvarchar(max) и varchar(max) использовать нельзя. В следующем примере переменная @SearchWord
, тип которой определен как varchar(30)
, вызывает неявное преобразование в предикате FREETEXT
.
USE AdventureWorks2022;
GO
DECLARE @SearchWord VARCHAR(30)
SET @SearchWord ='performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
Так как пробное сохранение параметров не работает с преобразованием, для улучшения производительности следует использовать тип nvarchar. В данном примере следует объявить переменную @SearchWord
с типом nvarchar(30)
.
USE AdventureWorks2022;
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 задан, то соответствующий язык будет применяться ко всем элементам условия поиска. Если значение не указано, то используется язык полнотекстового поиска, заданный для столбца.
Если в одном столбце хранятся документы на различных языках в виде больших двоичных объектов, то идентификатор локали заданного документа определяет, какой язык должен использоваться для индексирования его содержимого. Указание аргумента LANGUAGE language_term при запросе к такому столбцу может повысить вероятность хорошего соответствия.
Если аргумент language_term является строкой, он соответствует значению столбца alias в представлении совместимости sys.languages (Transact-SQ). Строка должна быть заключена в одиночные кавычки: 'language_term'. Если значением аргумента language_term является целое число, оно представляет собой действительный код языка. Если значение language_term задано в шестнадцатеричной форме, то после символов "0x" должна следовать шестнадцатеричная запись кода языка. Шестнадцатеричное значение не может иметь более восьми знаков, включая начальные нули.
Если значение находится в формате двойного байтового набора символов (DBCS), Microsoft SQL Server преобразует его в Юникод.
Если указанный язык недопустим или отсутствуют ресурсы, соответствующие указанному языку, Microsoft SQL Server возвращает ошибку. Для использования нейтральных языковых ресурсов следует указать 0x0 в качестве значения аргумента language_term.
Общие замечания
Полнотекстовые предикаты и функции работают в одной таблице, что следует из наличия предиката FROM. Для поиска в нескольких таблицах используйте в предложении FROM соединенную таблицу, чтобы выполнять поиск в результирующем наборе, который получен в результате соединения нескольких таблиц.
Полнотекстовые запросы с использованием FREETEXT являются менее точными, нежели полнотекстовые запросы с использованием CONTAINS. Полнотекстовая поисковая система SQL Server определяет важные слова и фразы. Ни одному из зарезервированных ключевых слов или подстановочных знаков не придается специального смысла, который они обычно имеют при использовании в параметре <contains_search_condition> предиката CONTAINS.
Полнотекстовые предикаты не допускаются в предложении OUTPUT, если уровень совместимости базы данных установлен в значение 100.
Примечание.
Функция FREETEXTTABLE полезна для поиска совпадений того же типа, что и предикат FREETEXT. На эту функцию можно ссылаться как на обычное имя таблицы в предложении FROM инструкции SELECT. Дополнительные сведения см. в разделе FREETEXTTABLE (Transact-SQL).
Запрос к удаленному серверу
Четырехкомпонентное имя может использоваться в предикате CONTAINS или FREETEXT для запроса по столбцам полнотекстового индекса целевых таблиц на связанном сервере. Чтобы подготовить удаленный сервер к приему полнотекстовых запросов, сначала необходимо создать полнотекстовые индексы для целевых таблиц и столбцов на удаленном сервере, а затем добавить удаленный сервер в качестве связанного сервера.
Сравнение предиката LIKE с полнотекстовым поиском
В отличие от полнотекстового поиска предикат LIKETransact-SQL работает только с комбинациями символов. Кроме того, предикат LIKE нельзя использовать в запросах к форматированным двоичным данным. Более того, запрос с предикатом LIKE к большому количеству неструктурированных текстовых данных выполняется гораздо медленнее, чем эквивалентный полнотекстовый запрос к тем же данным. Выполнение запроса LIKE к нескольким миллионам строк текстовых данных может занять несколько минут, в то время как полнотекстовый запрос к тем же данным занимает всего несколько секунд или даже меньше, в зависимости от количества возвращаемых строк.
Примеры
А. Использование инструкции FREETEXT для поиска слов, содержащих определенные значения символов
Следующий пример просматривает все документы, содержащие слова, которые связаны со словами «vital», «safety», «components».
USE AdventureWorks2022;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
B. Использование FREETEXT с переменными
Нижеприведенные примеры используют переменную вместо конкретного термина для поиска.
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
См. также
Начало работы с компонентом Full-Text Search
Создание и управление полнотекстовыми каталогами
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
Создание и управление полнотекстовыми индексами
Запросы с полнотекстовым поиском
Создание запросов полнотекстового поиска (визуальные инструменты для баз данных)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
Типы данных (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)