将全文搜索与SQL Server结合有多难?

我正在构建一个带有SQL后端的C#/ ASP.NET应用程序。 我正在截止日期并完成我的页面,在左侧字段中,我的一位设计师在我的一个页面上整合了全文搜索。 直到此时我的“搜索”都是filter,能够通过某些因子和列值缩小结果集。

因为我正处于截止日期(你知道每晚睡3个小时,我看起来像猫吃了什么东西并且扔了起来),我期待这个页面与其他人非常相似,我正在尝试决定是否发臭。 我之前从未在页面上进行过全文搜索….这是一座可以登山的山还是有一个简单的解决方案?

谢谢。

首先,您需要在生产服务器上启用全文搜索索引,因此,如果这不在范围内,您不会想要使用它。

但是,如果已经准备就绪,全文搜索相对简单。

T-SQL有4个谓词用于全文搜索:

  • FREETEXT
  • FREETEXTTABLE
  • CONTAINS
  • CONTAINSTABLE

FREETEXT是最简单的,可以这样做:

SELECT UserName FROM Tbl_Users WHERE FREETEXT (UserName, 'bob' ) Results: JimBob Little Bobby Tables 

FREETEXTTABLE与FreeTEXT的工作方式相同,只不过它将结果作为表返回。

T-SQL全文搜索的真正力量来自CONTAINS(和CONTAINSTABLE)谓词……这个很大,所以我只是将它的用法粘贴在:

 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 ] ) 

这意味着您可以编写如下查询:

 SELECT UserName FROM Tbl_Users WHERE CONTAINS(UserName, '"little*" NEAR tables') Results: Little Bobby Tables 

祝好运 :)

在SQL Server中进行全文搜索非常简单,在queryside上进行了一些配置和轻微调整,你很高兴! 我在20分钟之前就已经为客户做过,熟悉这个过程

这是2008年的MSDN文章 ,从那里链接到2005版本

我之前使用过dtSearch来添加文本和数据库的全文搜索,它们的东西非常便宜且易于使用。

除了添加所有内容并配置SQL之外,此脚本将搜索数据库中的所有列,并告诉您哪些列包含您要查找的值。 我知道它不是“正确的”解决方案,但可能会给你带来一些时间。

 /*This script will find any text value in the database*/ /*Output will be directed to the Messages window. Don't forget to look there!!!*/ SET NOCOUNT ON DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64) SET @valuetosearchfor = '%staff%' --should be formatted as a like search SET @objectOwner = 'dbo' DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000)) INSERT INTO @potentialcolumns (sql) SELECT ('if exists (select 1 from [' + [tabs].[table_schema] + '].[' + [tabs].[table_name] + '] (NOLOCK) where [' + [cols].[column_name] + '] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' + [tabs].[table_schema] + '].[' + [tabs].[table_name] + '] (NOLOCK) WHERE [' + [cols].[column_name] + '] LIKE ''''' + @valuetosearchfor + '''''' + '''') as 'sql' FROM information_schema.columns cols INNER JOIN information_schema.tables tabs ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA AND cols.TABLE_NAME = tabs.TABLE_NAME WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext') AND tabs.table_schema = @objectOwner AND tabs.TABLE_TYPE = 'BASE TABLE' ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position DECLARE @count int SET @count = (SELECT MAX(id) FROM @potentialcolumns) PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.' PRINT 'Beginning scan...' PRINT '' PRINT 'These columns contain the values being searched for...' PRINT '' DECLARE @iterator int, @sql varchar(4000) SET @iterator = 1 WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns) BEGIN SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator) IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '') BEGIN --SELECT @sql --use when checking sql output EXEC (@sql) END SET @iterator = @iterator + 1 END PRINT '' PRINT 'Scan completed' 

我去过那儿。 它就像一个魅力,直到你开始考虑可扩展性和高级搜索function,如搜索多个列,给每个不同的权重值。

例如,搜索“ 标题”和“ 摘要”列的唯一方法是使用SearchColumn = CONCAT(Title, Summary)SearchColumn索引的计算列。 权重? SearchColumn = CONCAT(CONCAT(Title,Title), Summary)类似的东西。 ;)过滤? 忘掉它。

“它有多难”是一个难以回答的问题。 例如,已经完成10次的人可能会认为这很容易。 我真正可以说的是,如果你使用像NLucene这样的东西而不是自己动手,你很可能会发现它更容易。