C# 将全文搜索与SQL Server结合起来有多难?
我正在使用SQL后端构建一个C/ASP.NET应用程序。我在截止日期前完成了我的页面,在左栏外,我的一位设计师在我的一个页面上进行了全文搜索。到目前为止,我的搜索都是过滤器,能够通过某些因子和列值缩小结果集 因为我在截止日期前,你知道,我每晚要睡3个小时,在我看起来像猫吃了又吐了的东西的时候,我期待着这一页与其他页面非常相似,我正在努力决定是否制造臭味。我以前从未在网页上做过全文搜索。。。。这是一座要攀登的山还是有一个简单的解决方案C# 将全文搜索与SQL Server结合起来有多难?,c#,asp.net,sql,.net-3.5,full-text-search,C#,Asp.net,Sql,.net 3.5,Full Text Search,我正在使用SQL后端构建一个C/ASP.NET应用程序。我在截止日期前完成了我的页面,在左栏外,我的一位设计师在我的一个页面上进行了全文搜索。到目前为止,我的搜索都是过滤器,能够通过某些因子和列值缩小结果集 因为我在截止日期前,你知道,我每晚要睡3个小时,在我看起来像猫吃了又吐了的东西的时候,我期待着这一页与其他页面非常相似,我正在努力决定是否制造臭味。我以前从未在网页上做过全文搜索。。。。这是一座要攀登的山还是有一个简单的解决方案 多谢各位 这是一个很难回答的问题。例如,一个已经做了10次的人
多谢各位 这是一个很难回答的问题。例如,一个已经做了10次的人可能会认为这很简单。我所能说的是,如果您使用类似的东西,而不是自己滚动,您可能会发现这会容易得多。在SQL Server中进行全文搜索非常简单,只需对queryside进行一点配置和轻微调整,您就可以开始了!我之前在不到20分钟的时间里为客户做过这件事,因为我熟悉这个过程
这是指向2005版本的链接,首先,您需要在生产服务器上启用全文搜索索引,因此,如果这不在范围内,您就不想这样做 然而,如果已经准备好了,那么全文搜索就相对简单了 T-SQL有4个谓词用于全文搜索: 自由文本 FREETEXTTABLE 包含 集装箱 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 ]
)
祝你好运:我以前使用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'
我去过那里。直到你开始考虑可伸缩性和高级搜索功能,比如在多个列上搜索,并赋予每一个不同的权重值。
例如,在标题和摘要列上搜索的唯一方法是使用SearchColumn=CONCATTitle的计算列,在SearchColumn上搜索摘要和索引。加权?SearchColumn=目录、标题、摘要之类的内容;过滤?算了吧。我对此投了赞成票,并将其作为答案,这不仅是因为这是一个伟大而详细的回应,也是为了xkcd参考。赢
/*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'