2011-01-25 66 views
0

需要帮助了解这一点。搜索逻辑和算法

我有两个表

user 
---- 
name 
skills (comma separated value of skills;not mapped to next table) 

其中一个用户的名字和他的技术能力被存储。

skills 
----- 
id 
language_name 

我们只存储技能而不映射任何东西。

而且我有一个文本框搜索表单,您可以输入主要技能:

eg. java javascript html css 

根据所输入的值我想随着技术的技能,找到了最佳人选,而且也显示了人谁与搜索到的技能最接近。

任何想法如何去实现这一点。表格结构变化的建议也值得欢迎。

注意:best人是在列表中拥有最多技能的人。

+0

最佳人员与技术技能和t他最接近技能搜索的人吗?我没有看到你的数据库中有任何能力的判断,所以如果两个人都拥有Java,那么他们在两个类别中都会被并列第一。 – Michael 2011-01-25 06:05:26

回答

1

您既可以为技能使用普通的标准化标记表并使用SQL,也可以将技能作为单个列表存储并在单列上使用FREETEXT搜索。

user  : id; name 
skill  : id; language_name 
user_skill : user_id; skill_id 

你遇到一个新的技能每一次,刚刚创建的技能为它的新条目,所以“净”,‘DOTNET的’,‘C#.net’将出现3次。

当搜索为“爪哇JavaScript的HTML教程”,打破成清单4的最佳匹配,所以查询看起来像这样

select top 10 u.name, count(*) matched 
from skill s 
inner join user_skill us on s.skill_id = us.skill_id 
inner join user u on u.user_id = us.user_id 
where s.language_name in ('java','javascript','html','css') 
group by u.name 
order by matched desc 

(显示前10个)

在SQL Server 2005在FOR XML的帮助下,还可以获得最佳10个匹配用户中每一个的缺失技能列表

select top(10) 
    u.id, 
    u.name, 
    count(*) matched, 
    stuff(
    (
    select ',' + s.language_name 
    from skill s 
    where s.language_name in ('java','javascript','html','css') 
     and not exists (
     select * from user_skill u2 
     where u2.user_id=u.id 
      and u2.skill_id=s.skill_id) 
    for xml path('') 
    ),1,1,'') as missing_list 
from skill s 
inner join user_skill us on s.skill_id = us.skill_id 
inner join [user] u on u.user_id = us.user_id 
where s.language_name in ('java','javascript','html','css') 
group by u.id, u.name 
order by matched desc 
+0

嘿,谢谢你的查询。只是想知道,是否可以修改它以显示未匹配在不同列中的技能列表? – Zaje 2011-01-25 08:56:52