C# 将全文搜索与SQL Server结合起来有多难?

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次的人

我正在使用SQL后端构建一个C/ASP.NET应用程序。我在截止日期前完成了我的页面,在左栏外,我的一位设计师在我的一个页面上进行了全文搜索。到目前为止,我的搜索都是过滤器,能够通过某些因子和列值缩小结果集

因为我在截止日期前,你知道,我每晚要睡3个小时,在我看起来像猫吃了又吐了的东西的时候,我期待着这一页与其他页面非常相似,我正在努力决定是否制造臭味。我以前从未在网页上做过全文搜索。。。。这是一座要攀登的山还是有一个简单的解决方案


多谢各位

这是一个很难回答的问题。例如,一个已经做了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'