Contains 问题 急 在线等
if (Utility.StringUtil.IsNotNull(keyword)) { if (keyword != "Search Outlines" && keyword.Trim().Length>0) { //keyword = "SQLEncode("+keyword.Trim()+")"; keyword = Utility.StringUtil.parameterReplace(keyword.Trim()); where_keyword = string.Format(" where title like '%{0}%' or course like'%{1}%' or DocType.DocType like '%{2}%' or School like '%{3}%' or professor like '%{4}%' or contains(data, '\"{5}\"')", keyword, keyword, keyword, keyword, keyword, keyword); } } string sql = "select Outline.dataType,Outline.title,DocType.docType,Outline.course,LawSchool.School,Professor.professor,Outline.price,Outline.points,Outline.uploadDate,Outline.id " + " from Outline inner join Users on Users.id = Outline.userId " + " inner join LawSchool on Outline.schoolId = LawSchool.id " + " inner join DocType on Outline.docType=DocType.id" + " inner join Professor on Outline.professorId=Professor.id "; string countSql = "select count(*) " + " from Outline inner join Users on Users.id = Outline.userId " + " inner join LawSchool on Outline.schoolId = LawSchool.id " + " inner join DocType on Outline.docType=DocType.id" + " inner join Professor on Outline.professorId=Professor.id "; if (this.OutlineDAO.getCount(countSql + where_keyword) > 0) { sql += where_keyword; countSql += where_keyword; this.Panel_msg.Style.Add("display", "none"); }
/*在库TEST上建立全文索引*/use testcreate table poofly(id int not null, name varchar(10))go/* 首先创建一个唯一索引,以便全文索引利用*/create unique clustered index un_ky1 on poofly(id)/*创建全文目录*/create FULLTEXT CATALOG FT1 AS DEFAULT/*C创建全文索引*/create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1/*修改全文目录*/alter FULLTEXT CATALOG FT1 REBUILD/*删除全文目录FT(含有全文索引时候不能删除)*/drop fulltext catalog ft/*查看数据库所有的全文目录*/select* from sys.fulltext_catalogs/*fulltext_catalog_id name path is_default is_accent_sensitivity_on data_space_id file_id principal_id is_importing------------------- -------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- ---------- ------------------------ ------------- ----------- ------------ ------------5 test NULL 0 1 NULL NULL 1 011 FT1 NULL 1 1 NULL NULL 1 0*//* 查看所有用到全文索引的表*/exec sp_help_fulltext_tables/*TABLE_OWNER TABLE_NAME FULLTEXT_KEY_INDEX_NAME FULLTEXT_KEY_COLID FULLTEXT_INDEX_ACTIVE FULLTEXT_CATALOG_NAME-------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ------------------ --------------------- --------------------------------------------------------dbo poofly un_ky1 1 1 FT1*//*在库TEST上建立全文索引*/use testcreate table poofly(id int not null, name varchar(10))go/* 首先创建一个唯一索引,以便全文索引利用*/create unique clustered index un_ky1 on poofly(id)/*创建全文目录*/create FULLTEXT CATALOG FT1 AS DEFAULT/*C创建全文索引*/create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1/*修改全文目录*/alter FULLTEXT CATALOG FT1 REBUILD/*删除全文目录FT(含有全文索引时候不能删除)*/drop fulltext catalog ft-----------------------------------------------------使用contains关键字进行全文索引--1.前缀搜索select name from tb where contains(name,'"china*"')/*--注意这里的* 返回结果会是 chinax chinay chinaname china --返回前缀是china的name --如果不用“”隔开 那么系统会都城 contains(name,'china*') 与china* 匹配*/--2.使用派生词搜索select name from tb where contains(name,'formsof(inflectional,"foot")')/* 出来结果可能是 foot feet (所有动词不同形态 名词单复数形式)*/--3.词加权搜索select value from tb where contains(value , 'ISABOUT(performance weight(.8))')/*全值用0-1的一个数字表示 表示每个词的重要程度*/--4.临近词搜素select * from tb where contains(document,'a near b')/* 出来的结果是“a”单词与“b”单词临近的document 可以写成 contains(document,'a ~ b')*/--5.布尔逻辑搜素select * from tb where contains(name,'"a" and "b"')/*返回既包含A 又包含 B单词的行 当然 这里的AND 关键字还有换成 OR ,AND NOT 等*/----------------------------------------------------你还可以使用RREETEXT 进行模糊搜索--任意输入文本 全文索引自动识别重要单词 然后构造一个查询use test goselect * from tb where freetext(wendang,'zhubajie chi xi gua !')--============================================================--对全文索引性能影响因素很多 包括硬件资源方面 还有SQL 自身性能 和MSFTESQL服务的效率等方面--它的搜索性能有2方面 : 全文索引性能 和 全文查询性能
[解决办法]
因为它未编制全文索引
要先建立全文索引 看下面
/*在库TEST上建立全文索引*/use testcreate table poofly(id int not null, name varchar(10))go/* 首先创建一个唯一索引,以便全文索引利用*/create unique clustered index un_ky1 on poofly(id)/*创建全文目录*/create FULLTEXT CATALOG FT1 AS DEFAULT/*C创建全文索引*/create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1/*修改全文目录*/alter FULLTEXT CATALOG FT1 REBUILD/*删除全文目录FT(含有全文索引时候不能删除)*/drop fulltext catalog ft/*查看数据库所有的全文目录*/select* from sys.fulltext_catalogs/*fulltext_catalog_id name path is_default is_accent_sensitivity_on data_space_id file_id principal_id is_importing------------------- -------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- ---------- ------------------------ ------------- ----------- ------------ ------------5 test NULL 0 1 NULL NULL 1 011 FT1 NULL 1 1 NULL NULL 1 0*//* 查看所有用到全文索引的表*/exec sp_help_fulltext_tables/*TABLE_OWNER TABLE_NAME FULLTEXT_KEY_INDEX_NAME FULLTEXT_KEY_COLID FULLTEXT_INDEX_ACTIVE FULLTEXT_CATALOG_NAME-------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ------------------ --------------------- --------------------------------------------------------dbo poofly un_ky1 1 1 FT1*//*在库TEST上建立全文索引*/use testcreate table poofly(id int not null, name varchar(10))go/* 首先创建一个唯一索引,以便全文索引利用*/create unique clustered index un_ky1 on poofly(id)/*创建全文目录*/create FULLTEXT CATALOG FT1 AS DEFAULT/*C创建全文索引*/create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1/*修改全文目录*/alter FULLTEXT CATALOG FT1 REBUILD/*删除全文目录FT(含有全文索引时候不能删除)*/drop fulltext catalog ft---------------------------------------------------
[解决办法]
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)
请参见
use testcreate table poofly(id int not null, name varchar(10))go/* 首先创建一个唯一索引,以便全文索引利用*/create unique clustered index un_ky1 on poofly(id)/*创建全文目录*/create FULLTEXT CATALOG FT1 AS DEFAULT/*C创建全文索引*/create FULLTEXT INDEX ON poofly(NAME) key index un_ky1 ON FT1/*修改全文目录*/alter FULLTEXT CATALOG FT1 REBUILD/*删除全文目录FT(含有全文索引时候不能删除)*/drop fulltext catalog ft你就按这里对应好你的字段就好了
[解决办法]