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 г.

Новое содержимое:
  • Добавлены сведения об избежании преобразования значений параметра freetext_string.