CONTAINS (Transact-SQL)

更新日期: 2006 年 4 月 14 日

一个谓词,用于在包含字符数据类型的列中搜索单个词和短语的精确或模糊(不太精确)匹配项、一定差异范围内的相邻词或加权匹配项。

在 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
    全文索引中包含的一列或多列的名称。 类型为 charvarcharncharnvarchartextntextimagexmlvarbinary(max) 的列是全文搜索的有效列。
  • column_list
    指示可以指定多个列(以逗号分隔)。column_list 必须用括号括起来。 除非指定 language_term,否则 column_list 表的所有列的语言都必须相同。
  • *
    指定应在已登记要进行全文搜索的表的所有列中搜索给定的包含搜索条件。 CONTAINS 子句中的列必须是单个表中的列。 如果 FROM 子句中有多个表,那么 * 必须由表名限定。 除非指定 language_term,否则表的所有列的语言都必须相同。
  • LANGUAGE language_term
    用户发出查询时所用的语言。 如果列中包含多个存储为二进制大型对象 (BLOB) 的文档,用于对实际文档内容建立索引的语言由文档的区域设置标识符 (LCID) 决定。 因此,一个列可能存储了多种语言。 LANGUAGE 参数允许用户指定搜索使用的语言,从而提高获得有效匹配项的可能性。

    此参数是可选参数,可以指定为与某种语言的 LCID 对应的字符串、整数或十六进制值。 如果指定了 language_term,则其表示的语言将应用于搜索条件的所有元素。 如果未指定值,则使用该列的全文语言。

    如果指定为字符串,则 language_term 对应于 syslanguages 系统表中 alias 列的值。 字符串必须用单引号引起,如 'language_term'。 如果指定为整数,则 language_term 是标识该语言的实际 LCID。 如果指定为十六进制值,则 language_term 将以 0x 开头,后面跟有 LCID 的十六进制值。 十六进制值不能超过八位(包括前导零在内)。

    如果该值是双字节字符集 (DBCS) 格式,则 SQL Server 会将其转换为 Unicode 格式。

    如果指定的语言无效,或者没有安装对应于该语言的资源,SQL Server 将出错。 若要使用非特定语言资源,请将 0x0 指定为 language_term

  • <contains_search_condition>
    指定要在 column_name 中搜索的文本和匹配条件。

    contains_search_conditionnvarchar。 将另一个字符数据类型用作输入时,将发生隐式转换。 在以下示例中,@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(zh-cn,SQL.90).gif注意:
    某些语言(如亚洲一些地区的书面语言)的短语可以由彼此之间没有空格的一个或多个词组成。
  • <simple_term>
    指定词或短语的完全匹配项。 有效的简单字词示例有“blue berry”、blueberry 和“Microsoft SQL Server”等。 应该使用双引号 ("") 将短语括起来。 短语中词在数据库列中出现的顺序必须与 <contains_search_condition> 中指定的顺序相同。 搜索词或短语中的字符时不区分大小写。 在全文索引中,不会存储全文索引列中的干扰词(如 a、and 或 the 等)。 如果在单个词搜索中使用了干扰词,SQL Server 将返回错误消息,指出查询仅包含干扰词。SQL Server 在每个 SQL Server 实例的 \Mssql\Binn\FTERef 目录下有一个标准的干扰词列表。

    标点将被忽略。 因此,CONTAINS(testing, "computer failure") 将匹配包含“Where is my computer? Failure to find it would be expensive.”这个值的行。 有关断字符行为的详细信息,请参阅断字符和词干分析器

  • <prefix_term>
    指定以指定文本开始的词或短语的匹配项。 将前缀字词用英文双引号 ("") 括起来,并在右引号前添加一个星号 (*),这样一来,以星号前指定的简单字词开头的所有文本都将被匹配。 应以下列方式指定子句:CONTAINS (column, '"text*"')。 星号可以匹配根词或短语的词中的 0 个、1 个或多个字符。 如果文本和星号不用英文双引号分隔,则谓词将读取 CONTAINS (column, 'text*'),全文搜索会将星号看作字符,搜索 text* 的完全匹配项。 由于断字符通常忽略 (*) 这样的字符,因此全文引擎将不会查找带此类字符的词。

    如果 <prefix_term> 是一个短语,则短语中包含的每个词都将被看成一个单独的前缀。 因此,指定了一个 "local wine *" 前缀字词的查询,将匹配所有包含 "local winery"、"locally wined and dined" 等文本的行。

  • <generation_term>
    包含的简单字词包括要搜索的原始词的变体时,指定词的匹配项。
  • INFLECTIONAL
    指定要对指定的简单字词使用与语言相关的词干分析器。 词干分析器的行为是根据每种具体语言的词干确定规则定义的。 非特定语言没有关联的词干分析器。 使用被查询的列的列语言来引用所需的词干分析器。 如果指定了 language_term,则使用与该语言对应的词干分析器。

    <generation_term> 中给定的 <simple_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,而词或短语 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 查询的结果,但 WEIGHT 会影响 CONTAINSTABLE 查询中的排名。 有关详细信息,请参阅 CONTAINSTABLE (Transact-SQL)

      ms187787.note(zh-cn,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 NOT 中出现在 AND 之后。 不允许使用 OR NOT 运算符。 不能在首个字词前指定 NOT。 例如,CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ) 就是无效的。
      • AND 用在 OR 之前。
      • 相同类型的 Boolean 运算符 (AND、OR) 可以结合使用,因此可以按任意顺序应用。
      • n
        一个占位符,指示可在其中指定多个包含搜索条件和字词。

备注

如果兼容级别小于 70,则不将 CONTAINS 看成关键字。有关详细信息,请参阅 sp_dbcmptlevel (Transact-SQL)

示例

A. 使用 CONTAINS 和 <simple_term>

以下示例将查找包含 "Mountain" 一词,并且价格为 $80.99 的所有产品。

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

B. 使用 CONTAINS 和以 <simple_term> 表示的短语

以下示例将返回包含短语 "Mountain""Road" 的所有产品。

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

C. 使用 CONTAINS 和 <prefix_term>

以下示例返回的所有产品名称中,其 Name 列中至少有一个词以前辍 chain 开头。

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

D. 使用 CONTAINS 和 OR 以及 <prefix_term>

以下示例将返回包含以 "chain""full" 为前缀的字符串的所有类别说明。

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

E. 使用 CONTAINS 和 <proximity_term>

以下示例返回包含 bikeperformance,并且这两个词相邻的所有产品名称。

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

F. 使用 CONTAINS 和 <generation_term>

以下示例将搜索包含单词 ride 的各种形式(riding、ridden 等)的所有产品。

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

G. 使用 CONTAINS 和 <weighted_term>

下面的示例将搜索包含单词 performancecomfortablesmooth 以及给定每个词的不同加权的所有产品名称。

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

H. 使用 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 帮助

更改历史记录

发布日期 历史记录

2006 年 4 月 14 日

新增内容:
  • 添加了有关避免用 contains_search_condition 进行转换的信息。

2007 年 9 月 15 日

新增内容:
  • 添加了有关 ISABOUT 定义的小数分隔符的说明。