簡體   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