繁体   English   中英

在ASP.NET MVc Web应用程序中如何使用.contains进行搜索和自动完成搜索

[英]How scalable is using .Contains for searching and auto-complete search in asp.net MVc web applications

我发现很多教程和书籍可以在MVC Web应用程序中实现自动完成搜索,如:-

public ActionResult ArtistSearch(string q)
{
var artists = GetArtists(q);
return PartialView(artists);
}
private List<Artist> GetArtists(string searchString)
{
return storeDB.Artists
.Where(a => a.Name.Contains(searchString))
.ToList();
}

但这提出了一个问题,即该方法在可能具有成千上万条记录的实际应用程序中可扩展多少???因此,使用Contains()可以很好地扩展吗?还是有更好的方法? BR

如果我没记错的话, string.Contains()会转换为LIKE查询,在查询字符串的每一侧都带有通配符。 这使使用索引非常困难/不可能,因此由于SQL Server进行了全表扫描,因此可以期望数据集的性能为O(n)(请参阅SQL Server是否优化LIKE('%%')查询? )。

要优化查询,您可能想看看全文索引功能,更多信息请参见: SQL Server:如何优化“喜欢”查询? )。

如果可以使用.StartsWith而不是.Contains,则将有一个LIKE查询,该查询的末尾有一个通配符,并且可以在查询列上使用Index来快速查找(一定要检查查询执行计划!)。

我想,如果您专注于自动完成功能的用户体验,您会获得更好的性能:在较短的锁定时间(用户停止键入时)之后开始自动完成搜索,并确保它不会被阻止(发生在后台)。

这取决于您提供的数据。 在“现实世界”应用程序中,您需要考虑噪音/停用词(“ and”,“ the”),缩写词(“ street”的“ st”)等,以及困难的语言。

在这些情况下, .Contains不合适,因此您需要使用全文搜索索引引擎,例如Lucene.NET或SQL Server全文搜索。

子字符串查询不能使用索引查找。 但是他们仍然可以使用索引。 如果您不经常扫描几千条记录,那实际上是没有用的。

因此,我建议您在Name上创建一个索引,这样可以处理大量数据。

看起来您正在将LINQ与Entity Framework一起使用。 LINQ被转换为SQL,并且对contains的调用被转换为LIKE WHERE子句,因此您可以简单地运行SELECT * FROM Artists WHERE Name LIKE '%whatever%'以获得有关性能的信息。

请注意,您可以采取几种措施来减少影响。 您可以限制一个结果数.Take(20) 您也可以等到用户至少输入几个字符后再触发自动完成。 最后,您可以“限制”自动完成功能的调用,这样您就不必在每次输入字符时都调用自动完成功能,而不必等到他们说半秒钟而不输入其他字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM