Ранжирование элементов базы данных по подвижным весам

Так что у меня есть то, что я считаю довольно уникальной проблемой. Мне нужно рассчитать рейтинг для очень большой таблицы предметов (200000). Их "ранг" основан на нескольких взвешенных атрибутах, которые складываются вместе. 7 атрибутов по шкале 1-4 (на основе их квартиля 1 нижняя квартиль 4 верхняя часть), каждый из которых первоначально одинаково взвешен, а затем суммируется (7-28 шкала). Я бы хотел, чтобы пользователи могли регулировать вес атрибутов, делая один или все из них вдвое или наполовину менее важными. Что потенциально может изменить их конечный рейтинг. Я смотрю, не сталкивался ли кто-нибудь с подобной проблемой или не знает, с чего начать. Спасибо!

2 ответа

Базовая структура для ранжирования - это запрос сортировки с переменными. Вам просто нужно включить пользовательский вклад в рейтинг.

Запрос выглядит примерно так:

select t.*, (@rn := @rn + 1) as ranking
from (select t.*, (@v1 * col1 + @v2 * col2 . . .) as ranking
      from table t
     ) t cross join
     (select @rn := 0) params
order by ranking;

Вы можете легко сделать это в базе данных; вам просто нужно передать правильные переменные.

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

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

Допустим, элемент имел следующие свойства {"someRetailListing":{ "id": "1", "price": "100000.12", "city": "New York City", "rooms": "4", ... "rankCity": 4, "rankPrice": 3, "rankQuality": 3 } При первом запуске сценария его общий рейтинг составляет 20/30.

Теперь пользователь приходит и добавляет свои данные, и вы сохраняете его представление в отдельном сегменте (или с типом в том же сегменте): { "type":"userRank" "uid": 3121, "propertyID": 1 "rankCity": 3, "rankPrice": 1, "rankQuality": 3 } Когда вы запускаете скрипт, возможно, вы хотите, чтобы 50% ранга исходили от пользователей, 50% от значения по умолчанию. Таким образом, вы можете суммировать все пользовательские результаты вместе, и получить среднюю оценку пользователя, затем объединить с вашими, а затем делать все, что угодно, в значительной степени.

Вы должны сохранить этот конечный результат { "type": "userPropertyRank", "propertyID": 1 "rankCity": 3, "rankPrice": 3, "rankQuality": 3 }

Другие вопросы по тегам