Как Тиндер узнает, кого видели?(Backend) - PullRequest
0 голосов
/ 22 мая 2019

У меня есть источник динамических моделей.Теперь я запрашиваю их через ElasticSearch, чтобы я мог выполнить гео-поиск.

дай мне все модели в круге 30 км.

Теперь у пользователя есть система Tinder.Так что можете стереть.Как узнать, какие модели мне больше не нужно искать?Каков наилучший способ сделать это?

Таблица с уже увиденными картами?Затем я вычитаю из ElasticSearch, получаю массив из 100 карт и сравниваю их?Если он уже видел все 100, то спросите ElasticSearch еще раз?Это имеет мало смысла.Чем больше пользователь видел, тем дольше идут запросы.Как ты это делаешь?

1 Ответ

0 голосов
/ 23 мая 2019

Это вопрос, основанный на мнении, поэтому мой ответ основан на мнении.

Один из способов сделать это - Предварительный прогрев того, что должно быть показано пользователю.

Решение:

Фоновое задание запускается каждые x часов, которое выбирает все возможные результаты из Elastic Search, используя поисковый запрос с заданными параметрами, такими как возраст, пол, интерес, местоположение и т. Д. Информация о том, чтоПользователь уже видел, может быть сохранен в фильтр Блума .Все записи, которые еще не были просмотрены, могут быть сохранены в кеше, а когда пользователь выбирает следующую запись, возвращается кешированная сущность.Всякий раз, когда пользователь видит одного человека, этот человек добавляется в фильтр Блума, так что тот же человек больше не отображается.

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

  1. Включение функции суперзвезды

    всякий раз, когда A помечает B как суперподобный, независимо отиз всего того, что А добавляется в список B, который будет отображаться.

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

    Это сложная проблема, которую нужно решить, мы можем добавить какой-то случайный порядок или параметр (например, последнее обновление) или сохранить указатель того, сколько пользователей мы уже прошли в последнем задании, и на этот раз начнем с +1 этогоcounter.), который может быть уверен, что всякий раз, когда мы запрашиваем эластичные результаты поиска, они почти случайны, а первые несколько не всегда совпадают.

  3. Пакетное задание может быть запущено при необходимости.

    Допустим, пользователь меняет свои предпочтения / местоположение, мы должны иметь возможность аннулировать кэш и заново согреть кэш с новыми результатами..

...