FREETEXT (Transact-SQL)
Изменения: 14 апреля 2006 г.
Этот предикат используется для поиска в столбцах, содержащих символьные типы данных, значений, которые соответствуют условию поиска по смыслу, а не написанию. Когда используется предикат FREETEXT, ядро полнотекстовых запросов автоматически выполняет описанные далее действия над строкой freetext_string, присваивает вес каждому терму, а затем ищет совпадения.
- Разбивает строку на отдельные слова согласно границам слов (пословное разбиение).
- Формирует флективные формы слов (а также производит выделение основы слова).
- Определяет список расширений или замен для термов на основании совпадений в тезаурусе.
Соглашения о синтаксисе в Transact-SQL
Синтаксис
FREETEXT ( { column_name | (column_list) | * }
, 'freetext_string' [ , LANGUAGE language_term ] )
Аргументы
- column_name
Имя столбца, для которого зарегистрирован полнотекстовый поиск. Столбцы типов char, varchar, nchar, nvarchar, text, ntext, image, xml и varbinary(max) являются допустимыми столбцами для полнотекстового поиска.
- column_list
Указывает, что можно указать несколько столбцов, разделенных запятыми. Аргумент column_list необходимо заключить в круглые скобки. Пока не определен аргумент language_term, язык для всех столбцов column_list должен быть одинаковым.
- *
Указывает, что все столбцы, которые были зарегистрированы для полнотекстового поиска, должны быть использованы для поиска данной строки freetext_string. Если в предложении FROM указано более одной таблицы, символ «*» следует заменить на имя таблицы. Если не определен аргумент language_term, язык для всех столбцов таблицы должен быть одинаковым.
freetext_string
Текст для поиска в столбце column_name. Допустим любой текст, содержащий слова, фразы или предложения. Соответствие регистрируется, если в полнотекстовом индексе найден любой из термов в любой форме.Аргумент 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 можно также воспользоваться в случаях, когда формируется неоптимальный план.
В отличие от условия поиска CONTAINS, где слово AND является ключевым, при использовании в аргументе freetext_string слово «and» считается неучитываемым и игнорируется.
Использование конструкций WEIGHT, FORMSOF, символов-шаблонов, NEAR и прочих элементов синтаксиса запрещено. Аргумент freetext_string разбивается на слова, производится выделение основы слова и поиск в тезаурусе. Если аргумент freetext_string заключен в двойные кавычки, вместо этого производится сопоставление фразы целиком; выделение основы слова и поиск в тезаурусе не производится.
LANGUAGE language_term
Язык, ресурсы которого используются для выделения слов, определения основы слов, поиска в тезаурусе и удаления неучитываемых слов в процессе выполнения запроса FREETEXT. Этот аргумент не является обязательным и может быть строкой, целым числом или шестнадцатеричным значением, соответствующим коду языкового стандарта (LCID). Если указан аргумент language_term, язык, который он представляет, будет применен ко всем элементам условия поиска. Если не указано никакое значение, используется язык соответствующего столбца.Если аргумент language_term задан в виде строки, она соответствует значению столбца alias системной таблицы syslanguages. Строка должна быть заключена в одиночные кавычки: 'language_term'. Если значением аргумента language_term является целое число, оно представляет собой действительный код языка. Если значение language_term задано в шестнадцатеричной форме, то после символов «0x» должна следовать шестнадцатеричная запись кода языка. Шестнадцатеричное значение не может быть длиннее восьми цифр с учетом ведущих нулей.
Если значение выражено в формате с двухбайтовой кодировкой (DBCS), Microsoft SQL Server преобразует его в формат Юникод.
Если указанный язык недопустим или ресурсы, связанные с языком, не установлены, Microsoft SQL Server выдает сообщение об ошибке. Для использования нейтральных языковых ресурсов следует указать 0x0 в качестве значения аргумента language_term.
Замечания
Полнотекстовые запросы с использованием FREETEXT являются менее точными, нежели полнотекстовые запросы с использованием CONTAINS. Средство SQL Server полнотекстового поиска идентифицирует важные слова и фразы. Ни одному из зарезервированных ключевых слов или символов-шаблонов не придается специального смысла, который они обычно имеют при использовании в аргументе <УсловиеПоискаПредикатаCONTAINS> предиката CONTAINS.
Инструкция FREETEXT не будет опознана как ключевое слово, если уровень совместимости меньше 70. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).
Примеры
А. Использование инструкции 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
См. также
Справочник
CONTAINS (Transact-SQL)
Функция CONTAINSTABLE (Transact-SQL)
Типы данных (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Предложение WHERE (Transact-SQL)
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
14 апреля 2006 г. |
|