2009-10-03 64 views
2

我試圖在我的ASP.NET MVC實現完整的搜索功能(C#,LINQ到SQL)的網站。搜索數據庫 - ASP.NET MVC C#

該網站由大約3-4個桌子有大約1-2列,我想搜索。

這是我到目前爲止有:

public List<SearchResult> Search(string Keywords) 
    { 
     string[] split = Keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     List<SearchResult> ret = new List<SearchResult>(); 
     foreach (string s in split) 
     { 
      IEnumerable<BlogPost> results = db.BlogPosts.Where(x => x.Text.Contains(s) || x.Title.Contains(s)); 

      foreach (BlogPost p in results) 
      { 
       if (ret.Exists(x => x.PostID == p.PostID)) 
        continue; 

       ret.Add(new SearchResult 
       { 
        PostTitle= p.Title, 
        BlogPostID = p.BlogPostID, 
        Text=p.Text 
       }); 

      } 
     } 
     return ret; 
    } 

正如你所看到的,我的關鍵字和運行在一個表內的foreach一個foreach(我會重複爲每個表)。

這似乎inefficent,我想知道,如果那裏有一個更好的方式來創建數據庫的搜索方法。

而且,我能做些什麼,以列在數據庫中,使他們能夠被搜索得更快?我讀了一些關於編制索引的內容,這只是我在SQL Management Studio中看到的「全文索引」True/False字段嗎?

回答

6

而且,我能做些什麼,以列在 數據庫,以便他們可以 搜索更快?我讀到索引他們的東西 ,是剛剛 「全文索引」真/假現場 我在SQL Management Studio中看到了什麼?

是的,啓用全文索引通常會大大提高此場景的性能。但不幸的是,它不能自動與LIKE運算符一起工作(這就是你的LINQ查詢產生的)。因此,您必須使用FREETEXT,FREETEXTTABLE,CONTAINS或CONTAINSTABLE等內置全文搜索功能之一。

只是解釋,原來的代碼會比全文檢索慢得多,因爲它通常會導致表掃描。舉例來說,如果你要搜索一個名爲title varchar字段與LIKE「%ABC%」,那麼有沒有選擇,只能用於SQL掃描每一個記錄,看它是否包含這些字符。

然而,內置的全文搜索,實際上指數可以指定每列的文本在全文索引包括。這就是大大加快查詢速度的索引。

不僅如此,但全文搜索提供了一些很酷的功能,LIKE操作不能給你。它不像Google那麼複雜,但它有能力搜索根詞的替代版本。但我最喜歡的功能之一是排名功能,它可以返回一個額外的值來指示相關性,然後您可以使用它來對結果進行排序。用這個看看FREETEXTTABLECONTAINSTABLE函數。

一些更多的資源:

0

下應該做的伎倆。我不能把我的頭頂部說是否讓誇= ...部分將實際工作或沒有,但將需要類似的東西,以使SQL Server的環境中可用的關鍵字的數組。我沒有使用LINQ to SQL的一段時間(我一直在使用LINQ到實體4.0和NHibernate有一段時間了,其中有一組不同的功能)。您可能需要調整的部分得到它的工作,但總的原則是聲音:

public List<SearchResult> Search(string keywords) 
{  
    var searcResults = from bp in db.BlogPosts 
        let kwa = keywords.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries); 
        where kwa.Any(kw => bp.Text.Contains(kw) || bp.Title.Contains(kw)) 
        select new SearchResult 
        { 
         PostTitle = bp.Title, 
         BlogPostID = bp.BlogPostID, 
         Test = bp.Text 
        }; 

    return searchResults.ToList(); 
}