MailRuChamps / hlcupdocs

High-loaded systems developer contest
https://highloadcup.ru
151 stars 34 forks source link

Ручная проверка suggest (21.12.2018) #124

Closed stremin closed 5 years ago

stremin commented 5 years ago

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

Рассмотрим запрос без фильтров из первой фазы:

REQUEST URI: /accounts/6122/suggest/?query_id=163&limit=12 REQUEST BODY: BODY GOT: {"accounts":[{"email":"lastescecim@me.com","fname":"Юрий","id":9737,"sname":"Пенатосян","status":"свободны"}, {"email":"pemretteroleh@mail.ru","fname":"Вячеслав","id":9511,"sname":"Кисатопов","status":"свободны"},… BODY EXP: {"accounts": [{"email":"leelen@icloud.com","fname":"Артём","id":9921,"status":"заняты"}, {"email":"lastescecim@me.com","fname":"Юрий","id":9737,"sname":"Пенатосян","status":"свободны"},…

Предположим, что первые два результата пришли из лайков одного и того же похожего пользователя. Получим его запросом filter (который хорошо отлажен). Получаем:

для пользователей из моего алгоритма, /filter/?likes_contains=9737,9511 {"accounts":[{"id":3084,"email":"temocihir@ya.ru"}]}

для пользователей из тестовых данных, /filter/?likes_contains=9921,9737 {"accounts":[{"id":3110,"email":"fornawisuk@ymail.com"}]}

Для моего алгоритма под отладкой я проверил, что именно 3084 использовался для первых результатов, для тестового ответа могу только предполагать, но учитывая, что лайков на пользователя обычно много, скорее всего именно пользователь 3110 дал первые записи ответа. Теперь попробуем посчитать степень схожести этих двух пользователей с 6122 из запроса.

У 6122 всего 4 лайка, что упрощает задачу: "likes": [ {"id": 3817, "ts": 1518543668}, {"id": 1075, "ts": 1538098738}, {"id": 6383, "ts": 1492606365}, {"id": 2997, "ts": 1521345968} ]

У 3084 с ним совпадает только следующий лайк: {"id": 2997, "ts": 1521326702}

У 3110 тоже только один: {"id": 1075, "ts": 1453147667}

По формуле для 3084 получаем: 1 / abs(1521345968 - 1521326702) = 5.19e-5

Для 3110: 1 / abs(1538098738 - 1453147667) = 1.18e-8

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

stremin commented 5 years ago

По test_accounts_251218.zip все сошлось без ошибок, спасибо!