搜索数据库 - ASP.NET MVC C#

Oma*_*mar 2 database asp.net-mvc search

我正在尝试在我的ASP.NET MVC(C#,Linq-to-Sql)网站中实现完整的搜索功能.

该网站包含大约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;
    }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有一个关键字的foreach和一个在表上运行的内部foreach(我会为每个表重复它).

这似乎是无用的,我想知道是否有更好的方法来创建数据库的搜索方法.

此外,我可以对数据库中的列执行哪些操作以便更快地搜索它们?我读了一些关于索引它们的东西,这只是我在SQL Management Studio中看到的"全文索引"真/假字段吗?

Ste*_*ham 6

此外,我可以对数据库中的列执行哪些操作以便更快地搜索它们?我读了一些关于索引它们的东西,这只是我在SQL Management Studio中看到的"全文索引"真/假字段吗?

是的,启用全文索引通常会大大提高此方案的性能.但不幸的是,它不能自动与LIKE运算符一起工作(这就是你的LINQ查询正在生成的).所以你必须使用其中一个内置的全文搜索功能,如FREETEXT,FREETEXTTABLE,CONTAINS或CONTAINSTABLE.

只是为了解释,您的原始代码将比全文搜索慢得多,因为它通常会导致表扫描.例如,如果您正在使用LIKE'%ABC%'搜索名为title的varchar字段,那么除了SQL扫描每条记录以查看它是否包含这些字符之外别无选择.

但是,内置的全文搜索实际上会将您指定的每列的文本编入索引以包含在全文索引中.而且这个索引可以大大加快您的查询速度.

不仅如此,全文搜索还提供了LIKE运算符无法提供的一些很酷的功能.它不像谷歌那么复杂,但它能够搜索根词的替代版本.但我最喜欢的功能之一是排名功能,它可以返回一个额外的值来表示相关性,然后您可以使用它来对结果进行排序.要使用它来查看FREETEXTTABLECONTAINSTABLE函数.

更多资源: