如何创建更准确的搜索?

fib*_*ics 5 c# linq

无论是在jquery还是c#中,我都需要准确的搜索功能.如果可能,我希望搜索像谷歌一样出色:-)

所以这是c#代码:

简要说明:
这将搜索数据库中具有完整信息的所有用户.它会搜索除当前登录用户之外的所有用户.

string[] ck = keyword.Split(new string[] { " ", ",", "." },
                            StringSplitOptions.RemoveEmptyEntries);

using (dbasecore db = ConfigAndResourceComponent.BaseCampContext())
{
    var results = (from u in db.users
                   join uinfo in db.userinfoes 
                        on u.UserID equals uinfo.UserID
                   where u.UserID != userid && 
                        (ck.Contains(u.LastName) || ck.Contains(u.FirstName) ||
                         ck.Contains(u.MiddleName) || ck.Contains(u.LoginID))
                   orderby u.LastName, u.FirstName, u.MiddleName ascending
                   select uinfo).Skip(skip).Take(take).ToList();

    return (from i in results select new UserInfo(i)).ToList();
}  
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

包围的名称必须位于搜索项的顶部,因为它匹配更多关键字.
任何的想法?

Gie*_*ius 5

有几种方法可以实现您的目标:

1)编写自己的排名算法.这意味着,您使用Linq获得结果,然后使用自己的排名函数对它们进行排序 - 这可能很简单,例如将请求拆分为单词并计算每个结果中的单词外观或复杂的内容,例如使用词干来查找不同形式的请求术语,测量术语之间的距离,提高一些术语等等.我不建议采用这种方式 - 因为LikeSQL上的查询速度很慢,你需要写一些已经写好的东西.

2)使用Sql Server全文搜索:http://msdn.microsoft.com/en-us/library/ms142524( v = sql.105).aspx.虽然我不是使用SQL Server全文搜索的粉丝,但它是一个好的和可行的解决方案.

3)使用第三方全文搜索,有一些替代方案,Lucene(http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net)可能是.net中使用最多的.这为您提供了速度和灵活性,您可以通过各种方式为数据编制索引,但当然您可以对索引进行索引.在Lucene之上还有一些API,就像Solr一样,我最喜欢它 - 尽管在你的情况下它可能太多了.


Ser*_*kiy 2

为简单起见,我将使用一张带有用户实体的表,如下所示:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是查询(在 EF 中工作),它计算每个用户的匹配值,然后仅选择与某些关键字匹配的用户,按匹配值对结果进行排序:

var keywords = new [] {"Sergey", "Berezovskiy"};

var users = from u in context.Users
            let match = (keywords.Contains(u.FirstName) ? 1 : 0) +
                        (keywords.Contains(u.LastName) ? 1 : 0) +
                        (keywords.Contains(u.MiddleName) ? 1 : 0)
            where match > 0
            orderby match descending, 
                    u.LastName, u.FirstName
            select u;
Run Code Online (Sandbox Code Playgroud)

范围变量的match值从0(如果没有字段匹配关键字)到3(如果所有字段匹配)。