CONTAINS (Transact-SQL)

Изменения: 14 апреля 2006 г.

Предикат, используемый для поиска столбцов, содержащих символьные типы данных, на предмет точного или неточного (менее точного) совпадения с отдельными словами и фразами, сходства слов на определенном расстоянии друг от друга или взвешенных совпадений.

В SQL Server 2005 в полнотекстовых предикатах CONTAINS или FREETEXT при выполнении запросов к связанным серверам можно использовать четырехсоставные имена.

CONTAINS может производить поиск:

  • слова или фразы;
  • префикса слова или фразы;
  • слова около другого слова;
  • слова, флективно сформированного из другого (например, слово «drive» является флективной основой слов «drives», «drove», «driving» и «driven»);
  • слова, которое является синонимом другого слова, с использованием тезауруса (например, слово «metal» может иметь синоним «aluminum» и «steel»).

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

CONTAINS
      ( { column_name | (column_list) | * } 
          , '< contains_search_condition >'     
   [ , LANGUAGE language_term ]
      ) 
< contains_search_condition > ::= 
    { < simple_term > 
    | < prefix_term > 
    | < generation_term > 
    | < proximity_term > 
    | < weighted_term > 
    } 
    | { ( < contains_search_condition > ) 
    [ { < AND > | < AND NOT > | < OR > } ] 
    < contains_search_condition > [ ...n ] 
    } 
< simple_term > ::= 
          word | " phrase "
< prefix term > ::= 
     { "word * " | "phrase *" }
< generation_term > ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ }
     { < simple_term > | < prefix_term > } 
     } [ ...n ] 
< weighted_term > ::= 
     ISABOUT 
        ( { { 
  < simple_term > 
  | < prefix_term > 
  | < generation_term > 
  | < proximity_term > 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
        ) 
< AND > ::= 
     { AND | & }
< AND NOT > ::= 
     { AND NOT | & !}
< OR > ::= 
     { OR | | }

Аргументы

  • column_name
    Имя столбца или столбцов, включенных в полнотекстовый индекс. Столбцы типов char, varchar, nchar, nvarchar, text, ntext, image, xml и varbinary(max) являются допустимыми столбцами для полнотекстового поиска.
  • column_list
    Указывает, что можно указать несколько столбцов, разделенных запятыми. Аргумент column_list должен быть заключен в круглые скобки. Если задан аргумент language_term, то у всех столбцов в списке column_list должен быть одинаковый язык.
  • *
    Указывает, что все столбцы в таблице, зарегистрированные для полнотекстового поиска, должны быть использованы для поиска по заданному условию. Столбцы в предложении CONTAINS должны быть выбраны из одной таблицы. Если в предложении FROM есть более одной таблицы, символ * должен быть квалифицирован именем таблицы. Если аргумент language_term не указан, язык для всех столбцов в таблице должен быть одинаковым.
  • LANGUAGE language_term
    Язык, на котором пользователь делает запрос. Если столбец содержит несколько документов, которые хранятся в виде больших двоичных объектов (BLOB), язык, используемый для индексирования реального содержимого документа, определяется идентификатором языкового стандарта (LCID) документа. Следовательно, в одном столбце может храниться несколько языков. Параметр LANGUAGE позволяет пользователям указывать язык поиска, тем самым увеличивая вероятность правильного совпадения.

    Этот параметр при необходимости может быть указан в виде строки, целого числа, шестнадцатеричного значения, соответствующего коду языка (LCID). Если аргумент language_term указан, язык, который он представляет, будет применен ко всем элементам условия поиска. Если не указано никакое значение, используется язык полнотекстового столбца.

    Если аргумент language_term задан в виде строки, то он соответствует значению столбца alias системной таблицы syslanguages. Строка должна быть заключена в одинарные кавычки, например 'language_term'. При указании в виде целого числа аргумент language_term является реальным значением LCID, идентифицирующим язык. Если аргумент language_term указан в виде шестнадцатеричного числа (с префиксом 0x), то он задает код языка в шестнадцатеричном формате. Шестнадцатеричное значение не может превышать восемь цифр, включая начальные нули.

    Если значение представлено в формате двухбайтовой кодировки (DBCS), SQL Server преобразует его в Юникод.

    Если указанный язык недопустим, или ресурсы, связанные с языком, не установлены, SQL Server возвращает ошибку. Для использования нейтральных языковых ресурсов укажите аргумент language_term со значением 0x0.

  • <contains_search_condition>
    Определяет текст для поиска в столбце column_name и условия для определения совпадения.

    Аргумент contains_search_condition имеет тип nvarchar. Если в качестве входных данных используется другой тип символьных данных, выполняется неявное преобразование. В следующем примере переменная @SearchWord, тип которой определен как varchar(30), вызывает неявное преобразование в предикате CONTAINS.

    USE AdventureWorks;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    Так как пробное сохранение параметров не работает поверх преобразования, для улучшения производительности следует использовать тип nvarchar. В данном примере следует объявить переменную @SearchWord с типом nvarchar(30).

    USE AdventureWorks;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    Можно также воспользоваться подсказкой в запросе OPTIMIZE FOR в случаях, когда формируется неоптимальный план.

  • word
    Строка символов без пробелов и знаков препинания.
  • phrase
    Одно или несколько слов с пробелами между ними.

    ms187787.note(ru-ru,SQL.90).gifПримечание.
    Существуют языки, например используемые в некоторых странах Азии, которые могут содержать фразы, состоящие из одного или нескольких слов без пробелов между ними.
  • <simple_term>
    Указывает соответствие для точного слова или фразы. Примерами допустимых простых терминов являются "база данных", данные и "Microsoft SQL Server". Фразы должны заключаться в двойные кавычки (""). Слова во фразе должны стоять в таком же порядке, как задано в аргументе <contains_search_condition>, по мере их появления в столбце базы данных. Поиск символов в слове или фразе проводится без учета регистра. Лишние слова в полнотекстовых столбцах (такие как «a», «and» или «the») не хранятся в полнотекстовом индексе. Если при поиске одного слова используется лишнее слово, SQL Server возвращает сообщение об ошибке, указывая на то, что запрос содержит только лишние слова. SQL Server включает стандартный список лишних слов в каталоге \Mssql\Binn\FTERef каждого экземпляра SQL Server.

    Знаки препинания пропускаются. Поэтому предикат CONTAINS(testing, "computer failure") соответствует строке «Where is my computer? Failure to find it would be expensive». Дополнительные сведения о поведении модулей разбиения на слова см. в разделе Средства разбиения по словам и парадигматические модули.

  • <prefix_term>
    Указывает совпадение слов или фраз, начинающихся с указанного текста. Префиксные термы должны заключаться в двойные кавычки (""); необходимо добавлять звездочку (*) перед закрывающей кавычкой, чтобы совпадал весь текст, начинающийся с простого терма, заданного до звездочки. Предложение должно быть задано таким образом: CONTAINS (column, '"text*"'). Звездочка заменяет ноль, один или более символов (корневого слова или слов в слове или фразе). Если текст и звездочка не ограничены двойными кавычками, так что предикат выглядит как CONTAINS (column, 'text*'), полнотекстовый поиск считает звездочку символом и ищет точное совпадение с text*. Полнотекстовое ядро не найдет слов со звездочкой (*), так как средства разбиения на слова обычно пропускают такие символы.

    Если аргумент <prefix_term> является фразой, каждое содержащееся во фразе слово считается отдельным префиксом. Этому запросу, задающему префиксный термин «local wine*», отвечают все строки с текстом «local winery», «locally wined and dined» и т.д.

  • <generation_term>
    Задает совпадение слов, если включенные простые термы содержат варианты начального искомого слова.
  • INFLECTIONAL
    Задает языковой парадигматический модуль, который будет использован для заданного простого терма. Поведение парадигматического модуля определено правилами формирования основ для каждого конкретного языка. У нейтрального языка нет ассоциированного с ним парадигматического модуля. Язык столбцов, к которым выполняется запрос, используется для обращения к необходимому парадигматическому модулю. Если указан аргумент language_term, используется парадигматический модуль, соответствующий этому языку.

    Простой терм <simple_term> в аргументе <generation_term> не будет соответствовать одновременно существительным и глаголам.

  • THESAURUS
    Указывает, что используется тезаурус, соответствующий языку полнотекстового столбца или языку, заданному в запросе. Самый длинный шаблон или шаблоны аргумента simple_term сравниваются с тезаурусом, и создаются дополнительные условия, которые можно использовать для расширения или замены начального шаблона. Если совпадений не найдено для всего аргумента simple_term или для его части, несовпадающая часть обрабатывается как simple_term. Дополнительные сведения о тезаурусе полнотекстового поиска см. в разделе Тезаурус.
  • <proximity_term>
    Указывает совпадение слов или фраз, которые должны находиться близко друг от друга. Аргумент <proximity_term> действует подобно оператору AND: для обоих необходимо существование более одного слова или фразы в столбце поиска. Чем ближе друг к другу слова в <proximity_term>, тем лучше будет совпадение.

    • NEAR | ~
      Указывает на то, что слово или фраза слева от NEAR или оператора ~ должны быть приближены к слову или фразе справа от NEAR или оператора ~. Несколько условий близости могут быть заданы одно за другим, например:

      a NEAR b NEAR c 
      

      Это означает, что слово или фраза a должна находиться около слова или фразы b, которая должна находиться около слова или фразы c. Если несколько условий близости заданы одно за другим, все задаваемые слова должны находиться рядом. Поэтому в примере a ~ b ~ c слово или фраза a также должна находиться около слова или фразы c.

  • <weighted_term>
    Указывает на то, что совпадающие строки (возвращенные запросом) соответствуют списку слов и фраз, каждому из которых при необходимости дано взвешенное значение.
  • ISABOUT
    Задает ключевое слово для аргумента <weighted_term>.

    • WEIGHT(weight_value)
      Указывает взвешенное значение, которое может принимать значение от 0,0 до 1,0. Каждый компонент в аргументе <weighted_term> может включать аргумент weight_value. Аргумент weight_value является способом изменения того, как различные части запроса влияют на значение ранга, назначенное каждой строке, удовлетворяющей условию запроса. Параметр WEIGHT не влияет на результаты запросов CONTAINS, но влияет на ранг в запросах CONTAINSTABLE. Дополнительные сведения см. в разделе Функция CONTAINSTABLE (Transact-SQL).

      ms187787.note(ru-ru,SQL.90).gifПримечание.
      В качестве десятичного разделителя всегда используется точка, независимо от языка операционной системы.
  • { AND | & } | { AND NOT | &! } | { OR | | }
    Задает логическую операцию между двумя условиями поиска на вхождение.

    • AND | &
      Указывает на то, что для совпадения оба условия поиска на вхождение должны быть удовлетворены. Символ амперсанда (&) может быть использован вместо ключевого слова AND для представления оператора AND.
    • AND NOT | &!
      Указывает на то, что для совпадения второе условие поиска на вхождение не должно быть удовлетворено. Символ амперсанда с последующим восклицательным знаком (&!) может быть использован вместо ключевого слова AND NOT для представления оператора AND NOT.
    • OR | |
      Указывает на то, что для совпадения любое из условий поиска на вхождение должно быть удовлетворено. Символ черты (|) может быть использован вместо ключевого слова OR для представления оператора OR.

      Если аргумент <contains_search_condition> содержит группы, заключенные в круглые скобки, эти группы вычисляются в первую очередь. После вычисления групп, заключенных в скобки, эти правила применяются при использовании следующих логических операторов с условиями поиска на вхождение.

      • NOT, применяемый перед AND.
      • NOT может стоять только после AND, как в AND NOT. Оператор OR NOT недопустим. NOT не может быть указано перед первым условием. Например, условие CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ) недопустимо.
      • AND, применяемый перед OR.
      • Логические операторы одного типа (AND, OR) являются ассоциативными, и поэтому они могут быть применены в любом порядке.
      • n
        Местозаполнитель, указывающий, что могут быть заданы несколько условий поиска CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ) и входящих в них термов.

Замечания

CONTAINS не распознается как ключевое слово, если уровень совместимости меньше чем 70. Дополнительные сведения см. в разделе sp_dbcmptlevel (Transact-SQL).

Примеры

A. Использование CONTAINS с <simple_term>

В следующем примере выполняется поиск всех продуктов с ценой $80.99, которые содержат слово "Mountain".

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

Б. Использование CONTAINS и фразы в <simple_term>

В следующем примере возвращаются все товары, которые содержат фразу "Mountain" или "Road".

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

В. Использование CONTAINS с <prefix_term>

Следующий пример возвращает все имена товаров, содержащие по крайней мере одно слово, начинающееся с префикса «chain» в столбце Name.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

Г. Использование CONTAINS и OR с <prefix_term>

В следующем примере возвращаются все описания категорий, которые содержат строки с префиксами "chain" или "full".

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

Д. Использование CONTAINS с <proximity_term>

В следующем примере возвращаются все названия продуктов, которые содержат слово bike около слова performance.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

Е. Использование CONTAINS с <generation_term>

В следующем примере выполняется поиск всех товаров с формами слова ride: «riding», «ridden», и т.д.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

Ж. Использование CONTAINS с <weighted_term>

В следующем примере выполняется поиск всех названий продуктов, содержащих слова performance, comfortable или smooth, при этом для каждого слова задается определенный вес.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

З. Использование CONTAINS с переменными

Приведенные ниже примеры используют для поиска переменную вместо конкретного термина.

USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

См. также

Справочник

Функция CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Предложение WHERE (Transact-SQL)

Другие ресурсы

Полнотекстовый поиск
Запросы полнотекстового поиска

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Добавления
  • Добавлены сведения о том, как избежать преобразования аргумента contains_search_condition.

15 сентября 2007 г.

Добавления
  • К определению ISABOUT добавлено примечание о десятичном разделителе.