2009-10-03 65 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(); 
}