На странице форма с поиском отправляет запрос (на выбор http rest get или post либо лучше используя websocket, почему - ниже) на сервер.
Сервер ищет на основе запроса клиента, смотрит, онлайн ли он (в случае с http rest это определяют таймаутами с последнего запроса, а вот с websocket все нативно и в реальном времени без проблем) и если да, шлет на все его подключения (пользователь может открыть несколько закладок в браузере или на разных компах) сообщение (с http rest геморно, клиент должен периодически делать запросы на сервер с вопросом - нет ли для меня сообщений, которые не сразу отвечают, если нет сообщений, и висят до таймаута или вообще бес конечно, выдавая по 1 байту в минуту, который просто пустышка, ради поддержания соединения).
Если пришло сообщение, клиент его выводит.
---
Для работы websocket на сервере нужна его поддержка, обычно отдельный бакэнд выступающй в виде websocket сервера и обрабатывающий запросы. Есть плагины к веб-серверам, конвертирующие это в привычный http rest стиль, но это изврат.
Когда то давно, когда websocket не был стандартом, самым простым способом слушать события с сервера был запрос на сервер и ответ в виде javascript с вызовом функции, которая собственно и есть событие (т.е. запрос на страницу подключался простым тегом < script >), сервер ничего не отправляет в канал запроса (или просто пробел по 1 в минуту чтобы по таймауту не закрылся) пока не появится необходимость. Правда клиент должен отслеживать ошибки что бы повторять запрос.
Звалось это long poolling