BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Поиск по весу с алфавитной сортировкой?

Есть список машин и отдельно людей. Люди ищут машины, когда выбирают из результатов автодополнение, вес слова, названия машинки увеличиваеться. Скажем Lada Priora сегодня искало 5 людей, а BMW X8 только 3, вес первого выше чем второго.

Есть пакеты которые реализуют такое быстро?
Так как автодополнение должно работать моментально. На сайте условно 100 000 каждый день выбрано автодополнений, следовательно вес слов постоянно меняеться и надо все подсчитывать и выводит актуальный результат.

Потом, алфавитная сортировка для названий с одинаковым рейтингом. Скажем Lada Hip имеет рейтинг 100 запросов сегодня и Lada Hop 100, сортировка идет в зависимости от букв в тайтле, в нашем случае Lada Hip будет первой, а Hop второй. Если будет Lada Hap, то она будет первой.

Необходимо скомбинировать и то и другое, самопильное решение работает 10 секунд примерно и скорость постепенно пдает (

Как бы вы сделали такое? Пакет? Идеи?
  • Вопрос задан
  • 108 просмотров
Решения вопроса 2
Каждые N минут в фоне обновлять для машин поле рейтинга. При поиске сортировать по рейтингу и по названию. Элементарщина же.

От того, что машина встанет не на первое место, а на четвёртое в конкретную минуту, пользователь потеряет гораздо меньше, чем от тормозящих подсказок.
Ответ написан
@deliro
Агрессивное программирование
Есть идея, как сделать это быстро в ущерб памяти. В базе добавляется поле hits (и по нему же BTree индекс) напротив каждой сущности

- Юзер кликает на приору
- hits приоры увеличивается на единицу
- В очередь (celery, крон, неважно) планируется задание на уменьшение hits приоры на единицу через 24 часа

В итоге мы получаем всегда актуальное количество кликов за последние 24 часа

Но мы получаем столько заданий в очереди, сколько было кликов за последние 24 часа. Можно пойти чуть дальше и оптимизировать:

- Юзер кликает на приору
- hits увеличивается на единицу
- В промежуточном хранилище (например, в редисе) инкрементится приора на единицу

Каждую минуту проходимся по записям в редисе кроном и ставим задачу на декремент N единиц с приоры через сутки и удаляем соответствующую запись.

Таким образом, получаем заданий в очереди и количество UPDATE в базе данных не больше, чем 60 * 24 * количество_машин в сутки

Дальше можно оптимизировать пачковое увеличение hits. И так же, как с декрементом, пачками собирать и каждую минуту увеличивать у нескольких машин hits.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Ticketland.ru Москва
от 120 000 руб.
Интерно Ростов-на-Дону
от 35 000 до 50 000 руб.
Радюшин и Компания Тольятти
от 50 000 до 100 000 руб.