РЕДАКТИРОВАТЬ: Я знаю, что прошло больше года, но я наконец-то получил что-то новое для этой проблемы. Чтобы увидеть обновление для этого взгляда на этот вопрос: Пользовательский алгоритм соответствия 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 ... это дает процент финального совпадения