无论是在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();
}
结果:
包围的名称必须位于搜索项目的顶部,因为它与更多关键字匹配 有什么想法吗?
答案 0 :(得分: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 :(得分:1)
像谷歌一样精彩可能相差甚远,但你可以用一种非常简单的技术来实现可接受的东西。这是个主意:
在WHERE子句中,您可以添加一个表达式,为每个成功标准(根据其相对权重)分配值,并添加它们以获得最终分数,而不是执行WHERE ck.Contains(u.LastName) || ck.Contains(u.FirstName)
。例如:
WHERE (ck.Contains(u.LastName)? 1 : 0) + (ck.Contains(u.FirstName)? 2 : 0) + ...
不确定LINQ是否支持三元运算符,但如果不支持,则可以使用循环和手动方法实现相同的功能。所有条款的总和将给予更接近匹配的候选人更高的分数。然后,您可以按此列进行排序。
答案 2 :(得分: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
(如果所有字段都匹配)。
答案 3 :(得分:0)
嗯......你 在select
中指定了具体的顺序。我猜这是你的订单,对吗?
编写排名函数,通过计算结果中存在的搜索词数量来对结果进行排名......