система сопоставления пользователей, эффективный подход к поиску? - PullRequest
4 голосов
/ 19 августа 2011

РЕДАКТИРОВАТЬ: Я знаю, что прошло больше года, но я наконец-то получил что-то новое для этой проблемы. Чтобы увидеть обновление для этого взгляда на этот вопрос: Пользовательский алгоритм соответствия Rails 3 с запросом SQL (СЛОЖНО)

Я работаю над сайтом, на котором пользователи подбираются на основе ответов на вопросы.

Процент совпадения рассчитывается каждый раз, когда пользователь, например, посещает страницу профиля другого пользователя. Таким образом, соответствующий процент не сохраняется в базе данных и постоянно пересчитывается.

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

У меня вопрос: какой самый эффективный способ сделать это?

Что делать, если у меня есть 50 000 пользователей, и я должен перечислять их в порядке совпадения в процентах. Должен ли я рассчитывать каждый процент соответствия между одним и другими пользователями 50k, а затем создавать список из этого? Звучит как-то неэффективно для меня. Разве это не сильно замедлило бы приложение?

Я надеюсь, что кто-то может помочь мне с этим, потому что это вызывает у меня головную боль.

EDIT: Чтобы прояснить ситуацию, вот моя модель базы данных для пользователей, вопросы, ответы, user_answers и accept_answers:

    Tables:
    Users(:id, :username, etc.)
    Questions(:id, :text)
    Answers(:id, :question_id, :text)
    UserAnswers(:id, :user_id, :question_id, :answer_id, :importance)
    AcceptedAnswers(:id, :user_answer_id, :answer_id)

    Questions <-> Answers: one-to-many
    Questions <-> UserAnswers: one-to-many
    Users <-> UserAnswers: one-to-many
    UserAnswers <-> AcceptableAnswers: one-to-many

Таким образом, существует список Вопросов (с возможными ответами на этот вопрос), и Пользователи дают свои «Ответы пользователей» на эти вопросы, назначают, насколько важен этот вопрос для них и какие ответы они принимают от других пользователей.

Тогда, если вы возьмете User1 и User2, вы будете искать общие ответы на вопросы, поэтому UserAnswers, где question_id совпадает. У них 10 общих вопросов. Пользователь1 дал значение важности 10 первым пяти вопросам и значение важности 20 остальным пяти. Пользователь 2 дал приемлемые ответы на два вопроса с 20 ценностями и три с 10 ценностями. Всего 70 баллов. Наивысшая достижимая балльная оценка - это, конечно, 20x5 + 10x5 ... Итак, User2 достиг 70/150 * 100 = 46,66% ... То же самое можно сделать и с другой стороны, чтобы выяснить, насколько User1 набрал баллы User2, назначенные на эти вопросы. , Эти 2 процента затем объединяются через среднее геометрическое значение: sqrt of процент1 * процент2 ... это дает процент финального совпадения

Ответы [ 2 ]

1 голос
/ 21 августа 2011

@ Ответ Вассема, кажется, на месте вашей проблемы. Я также хотел бы предложить вам подход, в котором проценты обновляются по новым ответам и новым принятым ответам.

Я создал решение db only ( gist ), которое будет работать, но имеет дополнительную сложность промежуточной таблицы.

В идеале вы должны создать еще две таблицы, одну для важности, а другую для процентных совпадений. Вы должны создавать / вставлять / удалять строки в этих таблицах, когда пользователь назначает / обновляет важность ответа или помечает какой-либо ответ как приемлемый. Вы также можете использовать delayed_job или rescue для обновления таблиц в фоновом режиме по конкретным действиям.

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

Обновления принятого ответа должны быть простыми, так как вам нужно обновить только одну пару. Но в случае, если кто-то придает важность вопросу, может быть много вычислений, и многие проценты могут потребовать обновления. Чтобы избежать этого, вы можете предпочесть вести таблицу с важными суммами для каждой пары, обновлять ее при необходимости и вычислять фактические проценты на лету (в дБ вне курса).

1 голос
/ 20 августа 2011

Я предлагаю вам сохранить процент совпадений всех пользователей в вашей базе данных.Создайте таблицу matches с процентами совпадений для пары пользователей.Вам не нужно сохранять процент совпадений для всех пар пользователей в вашей базе данных.Действительный процент совпадения рассчитывается для двух пользователей, только если один из них принял ответ от другого пользователя.Большинство пользователей не примут ответы большинства других пользователей.

Я предлагаю вам рассчитывать и сохранять процент совпадений не в тот момент, когда пользователь посещает профиль другого пользователя.Но когда пользователь принимает ответы других пользователей.Это позволит вам избежать ненужных вычислений, а процент совпадений для пары пользователей всегда будет fresh .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...