Asp.net mvc 搜索数据库-ASP.NET MVC#

Asp.net mvc 搜索数据库-ASP.NET MVC#,asp.net-mvc,database,search,Asp.net Mvc,Database,Search,我正在尝试在我的ASP.NETMVC(C#,LINQtoSQL)网站中实现完整的搜索功能 该站点由大约3-4个表组成,其中包含我要搜索的大约1-2列 这就是我到目前为止所做的: public List<SearchResult> Search(string Keywords) { string[] split = Keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntri

我正在尝试在我的ASP.NETMVC(C#,LINQtoSQL)网站中实现完整的搜索功能

该站点由大约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;
    }
公共列表搜索(字符串关键字)
{
string[]split=Keywords.split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries);
List ret=新列表();
foreach(拆分中的字符串s)
{
IEnumerable results=db.BlogPosts.Where(x=>x.Text.Contains)| | x.Title.Contains(s));
foreach(结果中的BlogPost)
{
如果(ret.Exists(x=>x.PostID==p.PostID))
继续;
ret.Add(新搜索结果)
{
PostTitle=p.标题,
BlogPostID=p.BlogPostID,
Text=p.Text
});
}
}
返回ret;
}
如您所见,我有一个用于关键字的foreach和一个在表上运行的内部foreach(我会对每个表重复它)

这似乎效率低下,我想知道是否有更好的方法为数据库创建搜索方法


另外,我可以对数据库中的列做些什么,以便更快地搜索它们?我读了一些关于索引它们的文章,这只是我在SQL Management Studio中看到的“全文索引”的真/假字段吗?

下面应该可以做到这一点。我不能马上说let kwa=…部分是否真的会工作,但是需要类似的东西才能使关键字数组在SQL Server上下文中可用。我已经有一段时间没有使用LINQtoSQL了(我已经使用LINQtoEntities4.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();
}
公共列表搜索(字符串关键字)
{    
var searcResults=来自db.BlogPosts中的bp
设kwa=keywords.Split(新字符[]{''},StringSplitOptions.RemoveEmptyEntries);
其中kwa.Any(kw=>bp.Text.Contains(kw)| | bp.Title.Contains(kw))
选择新的搜索结果
{
PostTitle=bp.Title,
BlogPostID=bp.BlogPostID,
Test=bp.Text
};
返回searchResults.ToList();
}
另外,我可以对中的列执行什么操作 数据库,以便可以 搜索速度更快?我读了一些东西 关于索引它们,这就是 “全文索引”真/假字段 我在SQL管理工作室看到了什么

是的,启用全文索引通常会大大提高此场景的性能。但不幸的是,它不能自动使用LIKE操作符(这就是LINQ查询生成的内容)。因此,您必须使用内置的全文搜索功能之一,如FREETEXT、FREETEXTTABLE、CONTAINS或CONTAINSTABLE

只是解释一下,原始代码将比全文搜索慢很多,因为它通常会导致表扫描。例如,如果您正在搜索一个名为title的varchar字段,该字段类似于“%ABC%”,那么除了让SQL扫描每条记录以查看它是否包含这些字符之外,别无选择

但是,内置的全文搜索实际上会对指定包含在全文索引中的每一列的文本进行索引。正是这个索引大大加快了您的查询速度

不仅如此,全文搜索还提供了LIKE运营商无法提供的一些很酷的功能。它没有谷歌那么复杂,但它有能力搜索根单词的其他版本。但我最喜欢的功能之一是排名功能,它可以返回一个额外的值来表示相关性,然后您可以使用它对结果进行排序。要使用该函数,请查看或函数

更多资源: