例如,我们的应用用户希望通过输入productName关键字来搜索产品。
sql server数据库的Products表包含大约1000万条记录。
使用asp.net C#是否有更好,更高性能的搜索方法来实现而不是productName.Contains(“keyword”)?
我现在正在使用存储过程,但linq到sql或实体框架也是可能的。
答案 0 :(得分:5)
如果您想获得更好的效果,那么您可以查看full text search。请注意,LINQ to SQL目前不支持此功能,但您可以在存储过程中编写SQL并从应用程序中调用存储过程。 this StackOverflow post的已接受答案建议阅读this article。
答案 1 :(得分:3)
您可以使用 LIKE
从数据库端实现此目的像
这样的东西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 + '%'
答案 2 :(得分:0)
您永远不应该从数据库中获取比您需要的更多数据。因此,最好限制数据层内的行(即存储过程)。您只需返回匹配的行即可完成此操作:
SELECT * FROM Products WHERE ProductName LIKE '%' + @keyword + '%'
其中@keyword是商店流程的参数。
但请注意,使用LIKE的性能可能很慢,因为它必须读取整个表。通过将启动的产品与关键字
相匹配,您可以获得更好的效果SELECT * FROM Products WHERE ProductName LIKE @keyword + '%'
注意我删除了@keyword之前的'%'。这使SQL Server能够使用ProductName列上的索引更快地找到行!
如需进一步的帮助,请发布您的存储过程...
答案 3 :(得分:0)
可能有点矫枉过正,但请查看lucene.net,我相信这是堆栈溢出用于搜索的内容