Как правильно сделать подписку на фильтр?
Задача сделать подписку на фильтр, но не очень понятно как проектировать правильно структуру такого функционала.
Поиск работает на основе ElasticSearch. Сами исходные данные храним в PostgreSQL. Приложение написано на Laravel.
Возникает несколько вопросов:
- Как и где хранить сам фильтр? часть запроса строиться по общим фильтрам а часть по динамическим фильтрам (придётся наверное хранить в формате json)
- Когда появляется новое объявление, что приложение должно сделать? Как оно узнает кто именно подписался на данное конкретное объявление? (не взять же все подписки по очереди и проверять каждую)
Ответы (1 шт):
Для реализации этого отлично подходят percolate запросы.
Если обычно вы добавляете в индекс документы, а потом при поиске используете фильтр и в результате получаете документы, которые попадают под фильтр. В percolate запросах все наоборот, вы добавляете в индекс фильтры. А потом при поиске задаете документ и вам возвращаются фильтры, которые совпадают с этим документом, т.е. если их применить в обычном поиске, то документ будет найден.
Так вот, вы можете для каждой подписки создать фильтр (или использовать существующий), сохранить его в виде json в БД и ассоциировать его с подпиской, так чтоб можно было по фильтру найти подписку, а значит и пользователя. Далее нужно зарегистрировать фильтр как percolate запрос в elasticsearch.
Объявления будут документами. Теперь, когда появляется новое объявление делаете percolate запрос и он возвращает фильтры, которые совпадают с объявлением. Результат запроса возвращается в виде json фильтра. Теперь по нему в БД ищете подписки и пользователей, которые их создали.