2013-05-29 46 views
5

无论在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(); 
} 

而结果:

enter image description here

带圈的姓名必须与搜索项的顶部,因为它更多的关键字匹配。
有什么想法?

+0

全文中有排名,使用 – vikas

+0

是你的专栏全文 – vikas

回答

1

为了简单起见,我将使用一个表,这样用户实体:

public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
} 

下面是查询(工作在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; 

范围变量match将有值在0(如果没有匹配的字段关键字),以3(如果所有字段匹配)。

+1

我接受了这个答案,因为它很简单,效果很好。感谢这个例子。 – fiberOptics

0

那么......你确实在你的select中指定了特定的顺序。我想这就是你得到的顺序,对吧?

写排序功能,即通过计算许多搜索词如何出现在结果排名结果...

5

有几种方法可以实现你想要什么:

1)写自己的排名算法。这意味着你使用Linq获得结果,然后使用自己的排名函数对它们进行排序 - 这可能很简单,比如将请求分解成单词并计算每个结果中出现的单词或复杂的单词,例如使用词干来查找不同形式的请求术语,测量术语之间的距离,提高一些术语等等。我不会推荐这样 - 因为Like查询对SQL来说很慢,您需要写一些它已经写好的东西。

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--尽管你的情况可能太多了。

1

尽管Google可能相当出色,但您可以使用非常简单的技术来实现某些可接受的功能。这里的想法是:

在你的WHERE子句中,你可以添加一个表达式,为每个成功的标准(根据其相对权重)赋值,并添加它们以获得最终得分。例如:

WHERE (ck.Contains(u.LastName)? 1 : 0) + (ck.Contains(u.FirstName)? 2 : 0) + ... 

不知道LINQ支持三元运算符或没有,但如果没有,你可以使用一个循环和人工方法也实现同样的。所有术语的总和将给予更接近匹配的候选者更高的分数。然后您可以按此列进行排序。