有关Contains与like搜索结果的疑问!!!

wwp_c 2009-09-05 04:47:31
在全文检索情况下,为了测试Contains的检索结果情况,分别以相同条件来作了相关对比与测试。现在问题如下:
1)为什么Contains在检索时会比like检索到的结果要少,有时还不是少一点,都是在相同检索条件下。如使用
select Content from outtext where contains(Content,'"工业园"') order by id asc就
比like少了以下几行。
(a)肥供水集团董事长戴立群、总经济师骆以林、供水发展处处长姚萱多次来到包河工业园
(b)合肥供水集团董事长戴立群、总经济师骆以林、供水发展处处长姚萱多次来到包河工业园
(c)选购产品_政策刺激内需是主流 陶企挺过09年必将迎来辉煌_装潢装修..
(d)佛山市市长陈云贤到佛山三水新明珠建陶工业园考察、调研清洁生产工作
(e)湟中县消防大队大队长陶海平等领导及甘河工业园区各企业主要负责人
这是为什么呢?为什么在使用contains时却找不到这a~e这行行呢,不也是包含了“工业园”这几个字的吗?

2)为什么在使用Contains分别执行以下语句时,得到的结果却不一样呢?
(a)语句1:
select Content from outtext where contains(Content,'"高校"') order by id asc
(b)语句2:
select Content from outtext where contains(Content,'"*高校*"') order by id asc

为什么语句2搜索到的结果要比语句1多呢,不是说Contains能在指定的字段中找到包含查询条件内容的数据行吗,
那既然这样,为什么使用通配符的与不使用的结果不一样呢?

非常感谢回复的朋友。
...全文
173 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongli520 2011-01-13
  • 打赏
  • 举报
回复
看看怎么看不了?
SQL77 2009-09-05
  • 打赏
  • 举报
回复
CONTAINS
一个谓词,用于搜索包含基于字符的数据类型的列,该列与单个词和短语,以及与另一个词一定范围之内的近似词精确或模糊(不太精确的)匹配或者加权匹配。CONTAINS 可以搜索:

词或短语。


词或短语的前缀。


另一个词附近的词。


由另一个词的词尾变化生成的词(例如,词 drive 是 drives、drove、driving 和 driven 词尾变化的词干)。


比另一个词具有更高加权的词。
语法
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> 包含有括号中的组时,首先计算这些组。在计算括号中的组之后,当与包含搜索条件一起使用这些逻辑运算符时,应用下面的规则:

NOT 在 AND 之前应用。


NOT 只能出现在 AND 之后,例如 AND NOT。不允许使用 OR NOT 运算符。不能将 NOT 运算符指定在第一术语之前(例如,CONTAINS (mycolumn, 'NOT "phrase_to_search_for" '))。


AND 在 OR 之前应用。


相同类型的布尔运算符 (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)


请参见


参考联机丛书,都说第二个才是LIKE的效果
wwp_c 2009-09-05
  • 打赏
  • 举报
回复
还有没有人可以回复我啊。
SQL77 2009-09-05
  • 打赏
  • 举报
回复
b)语句2:
select Content from outtext where contains(Content,'"*高校*"') order by id asc

这一句才是LIKE的效果

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧