Очень просто - в чем просчет -> при каждом срабатывании search, предыдущая подписка остается. Либо сделать ее завершение через оператор first(), take(1); либо - как делал я в своих продуктах -> смапить результат после switchMap и выдать его в верстку через async пайп (естественно подписки в методе search не должно быть) или в консоль через tap() оператор