Логика поиска и алгоритм - PullRequest
       26

Логика поиска и алгоритм

0 голосов
/ 25 января 2011

Нужна помощь в выяснении этого.

У меня есть две таблицы

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

где хранится имя пользователя и его технические навыки.

skills
-----
id
language_name

, где мы храним только навыки без привязки к чему-либо.

И у меня есть форма поиска с одним текстовым полем, где вы можете ввести основной навык:

eg. java javascript html css

На основе введенного значения я хочу найти лучшего человека с техническими навыками, а также отобразить человека, который ближе всего подходит к искомым навыкам.

Любая идея, как мне добиться этого. Рекомендации по изменению структуры таблиц также приветствуются.

Примечание: Человек best - это тот, кто обладает наибольшим количеством навыков в списке.

1 Ответ

1 голос
/ 25 января 2011

Вы можете использовать обычную нормализованную таблицу тегов для навыков и использовать SQL, или вы можете сохранить навыки в виде одного списка и использовать поиск FREETEXT по одному столбцу.

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

Каждый раз, когда вывстретите новый навык, просто создайте для него новую запись в навыке, чтобы «.Net», «DotNet», «C # .Net» появлялись 3 раза.

При поиске лучшего соответствия для «java»javascript html css ", разбейте его на список из 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 с помощью FORXML, вы также можете получить список недостающих навыков для каждого из 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
...