Форум сайта python.su
Есть список друзей которые на-Like-али себе книг.
Теперь нужно получить список этих книг с сортировкой: сверху те книги где больше лайков от друзей.
Т.е. книга 1) всего лайков 1000, из них лайков друзей: 15 - будет ниже чем 2) всего лайков 200, из них лайков друзей: 25
Как это лучше хранить (и в чем) и как получить результат?
Максимум Лайков на один объект будет < 1000 (1 версия), < 1М (2 версия).
Сейчас в голове только один нормальный вариант выборки - загонять идентификаторы пользователей кто налайкал в sphinx (в разрезе объектов), и делать выборку по релевантности.
Офлайн
Получить список друзей, получить список книг к которым есть лайки и посчитать на python очень не эффективно ?
Офлайн
Ну это как-то топорно, у меня сейчас так и работает. По скорости пока терпит, думаю на будущее.
Думаю вдруг есть какой-то способ, не грузить из базы десятки тысяч объектов для получения первых 20-и.
(Понятно что что можно закешировать/за раннее готовить данные)
По идее это динамическое поле, т.е. получается, все равно все перебирать.
Ещё это можно сделать на mongodb aggregation framework (с версии 2.5.3), но на sphinx будет быстрее.
Нашел как чуть ускорить текущее решение, пока оставлю этот способ, когда прижмет - перепилю.
Офлайн
o7412369815963
ну это был не ответ выше.
Можно завести таблицу со значениями лайков для каждого пользователя. Например
{id:45 , books: { #bookid:value '55': 5, '78': 6, } }
Отредактировано Singularity (Дек. 25, 2013 15:23:31)
Офлайн
Про такой вариант тоже думал, это получается своеобразное кеширование. Больше нагрузки будет когда пользователи будут фоловить других.
Если на пальцах посчитать: 100к пользователей, каждый фоловит по 200, каждый сделал по 500 лайков (-20% пересечений) х 2 байта = 15Гб индекс.
Думаю выгоднее будет вычислять без кеширования (т.е. купить cpu вместо памяти), (100к * 500 х 4байта (ссылка на пользователя) = 190Мб индекс)
Интересен был бы вариант с частичным кешированием, но есть ли такой?
Офлайн
Какая СУБД и какая структура таблиц?
o7412369815963Обычно для расчетов берут число Данбара (и кратные ему - только для краевых условий).
каждый фоловит по 200
Офлайн
LexanderСейчас mongodb, в 2-х версиях, 1) отдельно коллекция событий, где есть: user_id, obj_id, when, и 2) в самом объекте массив ссылок на пользователей кто лайкнул.
Какая СУБД и какая структура таблиц?
LexanderПросто представил сколько могло бы быть в среднем.
Вы осознанно взяли 200?
Офлайн
Я бы сказал что это число бесполезное в интернете
Офлайн
SingularityБойтесь стереотипов, они серьезно мешают работе. :)
Я бы сказал что это число бесполезное в интернете
Офлайн
А можно постановку уточнить? Учитываются только лайки прямых друзей? Или друзья моих друзей мои друзья?
Офлайн