【问题标题】:Are there any better search methods instead of string.Contains("keyword") using asp.net?有没有更好的搜索方法,而不是使用 asp.net 的 string.Contains("keyword")?
【发布时间】:2010-04-03 06:57:44
【问题描述】:

例如,我们应用的用户想要通过输入关键字productName来搜索产品。

sql server 数据库的 Products 表包含大约 1000 万条记录。

有没有更好和更高性能的搜索方法来代替使用 asp.net C# 的 productName.Contains("keyword") ?

我现在正在使用存储过程,但是 linq to sql 或实体框架也是可能的。

【问题讨论】:

  • 您使用什么技术访问数据库?
  • 我现在使用存储过程,但也允许使用 linq to sql 或实体框架。

标签: c# asp.net sql-server


【解决方案1】:

如果您想要更好的性能,那么您可以查看full text search。请注意,LINQ to SQL 当前不支持此功能,但您可以在存储过程中编写 SQL 并从应用程序中调用该存储过程。 this StackOverflow post 的公认答案建议阅读 this article

【讨论】:

    【解决方案2】:

    您可以使用 LIKE

    从数据库端实现此目的

    LIKE (Transact-SQL)

    类似

    DECLARE @Table TABLE(
            Val VARCHAR(50)
    )
    
    INSERT INTO @Table SELECT 'asdf'
    INSERT INTO @Table SELECT 'tada'
    INSERT INTO @Table SELECT 'foo'
    INSERT INTO @Table SELECT 'bar'
    INSERT INTO @Table SELECT 'test'
    INSERT INTO @Table SELECT 'test foo'
    
    DECLARE @Lookup VARCHAR(50)
    SELECT @Lookup = 'foo'
    
    SELECT  *
    FROM    @Table
    WHERE   Val LIKE '%' + @Lookup + '%'
    

    【讨论】:

    • 有没有比"Like" sql更好、性能更高的搜索方法?
    【解决方案3】:

    您永远不应该从您的数据库中获取比您需要的更多的数据。因此,您最好将行限制在数据层内(即您的存储过程)。你可以通过只返回匹配的行来做到这一点:

    SELECT * FROM Products WHERE ProductName LIKE '%' + @keyword + '%'
    

    @keyword 是存储过程的参数。

    但请注意,使用 LIKE 的性能可能会很慢,因为它必须读取整个表。您可以通过将开头与关键字匹配的产品获得更好的性能:

    SELECT * FROM Products WHERE ProductName LIKE @keyword + '%'
    

    注意我删除了@keyword 之前的'%'。这使 SQL Server 能够使用 ProductName 列上的索引来更快地找到行!

    如需进一步帮助,请发布您的存储过程...

    【讨论】:

      【解决方案4】:

      可能有点矫枉过正,但请查看lucene.net,我相信这是堆栈溢出用于搜索的原因

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        • 1970-01-01
        • 2012-10-28
        • 2017-08-31
        相关资源
        最近更新 更多