我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。
我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。1.1 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'beijing' ) remark: beijing是一个单词,要用单引号括起来。
1.2 查询住址在河北省的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"HEIBEI province"' ) remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。
2. 查询以 '湖' 开头的地址 SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"hu*"' ) remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。 记住是 *,不是 %。
3. 查询有 '南京路' 字样的地址 SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'nanjing NEAR road' ) remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。 A NEAR B,就表示条件: A 靠近 B。
5. 类似加权的查询 SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' ) remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。
6. 查询住址在河北省或北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"HEIBEI province" OR beijing' ) remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。
7. 单词的多态查询 SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' ) remark: 查询将返回包含 'street','streets'等字样的地址。 对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
SQL SERVER 联机丛书:
CONTAINS一个谓词,用于搜索包含基于字符的数据类型的列,该列与单个词和短语,以及与另一个词一定范围之内的近似词精确或模糊(不太精确的)匹配或者加权匹配。CONTAINS 可以搜索:
*词或短语。 < simple_term > *词或短语的前缀。 < prefix term > *另一个词附近的词。 < proximity_term > *由另一个词的词尾变化生成的词 < generation_term > (例如,词 drive 是 drives、drove、driving 和 driven 词尾变化的词干)。 *比另一个词具有更高加权的词。 < weighted_term >
语法CONTAINS ( { column | * } , '< contains_search_condition >' )
< 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 , < 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 ] )
参数 column 已经注册全文检索的特定列的名称。字符串数据类型的列是有效的全文检索列。
* 指定应该使用表中所有已注册为全文检索的列,对给定的包含搜索条件进行搜索。如果 FROM 子句中有多个表,那么 * 必须由表名限定。
<contains_search_condition> 指定要在 column 中搜索的文本。变量不能用作搜索条件。
word 没有空格或标点符号的字符串。
phrase 在每个词之间带有空格的一个或多个词。
说明 对于某些语言(例如亚洲的一些语言),短语可以由彼此之间没有空格的一个或多个词组成。
<simple_term> 词或短语
指定对每个精确词(单字节语言中没有空格或标点符号的一个或多个字符)或短语(单字节语言中由空格和可选的标点符号分隔的一个或多个连续的词)的匹配。有效的简单术语示例为 "blue berry"、blueberry 和 "Microsoft SQL Server"。应该使用双引号 ("") 将短语括起来。短语中词出现的顺序(在 <contains_search_condition> 中指定)必须与它们出现在数据库列中的顺序相同。对词或短语中字符的搜索是区分大小写的。全文索引列中的干扰词(例如 a、and 或 the)不被存储在全文索引中。如果在单个词搜索中使用干扰词,那么 SQL Server 将返回一个错误信息指明查询中只有干扰词出现。SQL Server 在目录 /Mssql/Ftdata/Sqlserver/Config 下包括干扰词的标准列表。 标点符号被忽略。因此,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 指定应匹配单数与复数以及名词、动词和形容词的性别与中性形式。也应匹配各种动词时态。 在 <generation_term> 中给定的 <simple_term> 将不与名词和动词匹配。
<proximity_term> 另一个词附近的词
指定匹配的词或短语,这些词或短语必须彼此接近。<proximity_term> 的运算与 AND 运算符相似:两者都要求在被搜索的列中有多个词或短语存在。如果 <proximity_term> 中的词彼此越接近,那么匹配就越好。
NEAR | ~ 指明 NEAR 或 ~ 运算符左边的词或短语应该与 NEAR 或 ~ 运算符右边的词或短语近似接近。可以链接多个近似术语,例如: a NEAR b NEAR c 这表示词或短语 a 应接近词或短语 b,而词或短语 b 应接近词或短语 c。 Microsoft? SQL Server? 对左右两边的词或短语之间的距离分等级。低等级值(例如 0)指明两者之间距离较大。如果指定的词或短语之间相互分开,则认为满足了查询条件;但是,查询有一个很低的 (0) 等级值。然而,如果 <contains_search_condition> 仅由一个或多个 NEAR 近似术语组成,那么 SQL Server 不返回等级值为 0 的行。有关分等级的更多信息,请参见 CONTAINSTABLE。
<weighted_term> 比另一个词具有更高加权的词
指定匹配词和短语列表的匹配行(由查询返回),可以对每行随意给定一个加权值。
ISABOUT 指定 <weighted_term> 关键字。 WEIGHT (weight_value) 指定数值介于 0.0 和 1.0 之间的加权值。<weighted_term> 中的每个组件可能包含一个 weight_value。通过 weight_value,可以改变查询的各个部分怎样来影响指派给与查询匹配的每行的等级值。加权对值的等级进行不同的度量强制,因为使用了 <weighted_term> 的所有组件来共同确定匹配。如果存在与任意一个 ISABOUT 参数的匹配,则返回一行,而不论是否指派了加权值。若要确定每个返回行的等级值(该值指明返回行之间的匹配程度),请参见 CONTAINSTABLE。
AND | AND NOT | OR
指定两个包含搜索条件之间的逻辑运算。当 <contains_search_condition> 包含有括号中的组时,首先计算这些组。在计算括号中的组之后,当与包含搜索条件一起使用这些逻辑运算符时,应用下面的规则:
1. NOT 在 AND 之前应用。 2. NOT 只能出现在 AND 之后,例如 AND NOT。不允许使用 OR NOT 运算符。不能将 NOT 运算符指定在第一术语之前(例如,CONTAINS (mycolumn, 'NOT "phrase_to_search_for" '))。 3. AND 在 OR 之前应用。 4. 相同类型的布尔运算符 (AND、OR) 可以结合使用,并因此可以按任何顺序进行应用。n
一个占位符,指明可在其中指定多个包含搜索条件和术语。
注释如果兼容级别小于 70,则 CONTAINS 不被看作是关键字。有关更多信息,请参见 sp_dbcmptlevel。
示例:A. 使用带有 <simple_term> 的 CONTAINS 下面的示例查找包含词"bottles"且价格为 $15.00 的所有产品。
USE Northwind GO SELECT ProductName FROM Products WHERE UnitPrice = 15.00 AND CONTAINS(QuantityPerUnit, 'bottles') GO
B. 在 <simple_term> 中使用 CONTAINS 和短语 下面的示例返回包含短语 "sasquatch ale" 或 "steeleye stout" 的所有产品。
USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ') GO
C. 使用带有 <prefix_term> 的 CONTAINS 下面的示例返回所有满足该条件的产品名称:这些产品名称至少含有一个以 ProductName 列中前辍 Choc 起始的词。
USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' "choc*" ') GO
D. 使用带有 <prefix_term> 的 CONTAINS 和 OR 下面的示例返回包含字符串 "sea" 或 "bread" 的所有分类描述。
USE Northwind SELECT CategoryName FROM Categories WHERE CONTAINS(Description, '"sea*" OR "bread*"') GO
E. 使用带有 <proximity_term> 的 CONTAINS 下面的示例返回在词 "spread" 附近有词 "Boysenberry" 的所有产品名称。
USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry') GO
F. 使用带有 <generation_term> 的 CONTAINS 下面的示例搜索具有 dry 形式的词的所有产品:dried 和 drying 等等。
USE Northwind GO SELECT ProductName FROM Products WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ') GO
G. 使用带有 <weighted_term> 的 CONTAINS 下面的示例搜索包含词 spread、sauces 或 relishes 以及给予每个词不同加权的所有产品名称。
USE Northwind GO SELECT CategoryName, Description FROM Categories WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8), sauces weight (.4), relishes weight (.2) )' ) GO
H. 使用带变量的 CONTAINS 下例使用变量而非特定的搜索术语。
USE pubs GO DECLARE @SearchWord varchar(30) SET @SearchWord ='Moon' SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)