Как правильно сделать подписку на фильтр?

Задача сделать подписку на фильтр, но не очень понятно как проектировать правильно структуру такого функционала.

Поиск работает на основе ElasticSearch. Сами исходные данные храним в PostgreSQL. Приложение написано на Laravel.

Возникает несколько вопросов:

  • Как и где хранить сам фильтр? часть запроса строиться по общим фильтрам а часть по динамическим фильтрам (придётся наверное хранить в формате json)
  • Когда появляется новое объявление, что приложение должно сделать? Как оно узнает кто именно подписался на данное конкретное объявление? (не взять же все подписки по очереди и проверять каждую)

Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Для реализации этого отлично подходят percolate запросы.

Если обычно вы добавляете в индекс документы, а потом при поиске используете фильтр и в результате получаете документы, которые попадают под фильтр. В percolate запросах все наоборот, вы добавляете в индекс фильтры. А потом при поиске задаете документ и вам возвращаются фильтры, которые совпадают с этим документом, т.е. если их применить в обычном поиске, то документ будет найден.

Так вот, вы можете для каждой подписки создать фильтр (или использовать существующий), сохранить его в виде json в БД и ассоциировать его с подпиской, так чтоб можно было по фильтру найти подписку, а значит и пользователя. Далее нужно зарегистрировать фильтр как percolate запрос в elasticsearch.

Объявления будут документами. Теперь, когда появляется новое объявление делаете percolate запрос и он возвращает фильтры, которые совпадают с объявлением. Результат запроса возвращается в виде json фильтра. Теперь по нему в БД ищете подписки и пользователей, которые их создали.

→ Ссылка