【问题标题】:How scalable is using .Contains for searching and auto-complete search in asp.net MVc web applications在 asp.net MVc Web 应用程序中使用 .Contains 进行搜索和自动完成搜索的可扩展性如何
【发布时间】:2012-03-11 21:56:46
【问题描述】:

我发现了很多在 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();
}

但这提出了一个问题,即这种方法在可能有数千条记录的实际应用程序中的可扩展性是多少??? BR

【问题讨论】:

  • 为什么不在大型数据集上进行测试?
  • 取决于您的架构和数据量。对于大型数据集,我可能会使用缓存而不是数据库。

标签: c# performance asp.net-mvc-3 contains


【解决方案1】:

如果我没记错的话,string.Contains() 被翻译成一个 LIKE 查询,查询字符串的每一边都有一个通配符。这使得使用索引变得非常困难/不可能,因此您可以期望数据集上的性能为 O(n),因为 SQL Server 会执行全表扫描(请参阅Does SQL Server optimize LIKE ('%%') query?)。

要优化您的查询,您可能需要查看全文索引功能,更多信息请参见:SQL Server: how to optimize "like" queries?)。

如果您可以使用.StartsWith 而不是 .Contains,您将在末尾有一个带有通配符的 LIKE 查询,并且您可以在查询列上使用索引来快速查找(请务必检查查询执行计划!)。

如果您尝试专注于自动完成功能的用户体验,我想您会获得更好的感知性能:在短暂的锁定期(当用户停止输入时)开始自动完成搜索,并确保它不会't 阻止(发生在后台)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      所以我建议你在Name 上创建一个索引,这样你就可以处理大量数据了。

      【讨论】:

        【解决方案4】:

        看起来您正在将 LINQ 与实体框架一起使用。 LINQ 被转换为 SQL,对 contains 的调用被转换为 LIKE WHERE 子句,因此您只需运行 SELECT * FROM Artists WHERE Name LIKE '%whatever%' 即可了解性能。

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

        【讨论】:

          猜你喜欢
          • 2012-01-14
          • 2012-06-03
          • 2019-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-10
          相关资源
          最近更新 更多