Ну во-первых у вас как то странно работает сам поиск, получается что вы каждый раз загружаете всех пользователей и потом по этой выборке локально ищите вхождения.
Вам нужно либо один раз при инициализации загрузить весь список пользователей и положить его к примеру в _source а потом при вводе текста фильтровать этот список и не мучить сервер запросами, либо если пользователей много то на сервере должен быть реализован метод для поиска сотрудников по строке.
Во-вторых, да, код написан не совсем верно.
Если вы хотите чтобы сервер искал и возвращал только подходящее то:
Observable.fromEvent(this.myInput.nativeElement, 'input')
.debounceTime(500)
.map(e => e.target.value)
.switchMap(searchText => this.http.get(`URL_API&q=${searchText}`))
.map(res => res.json())
.subscribe(users => this.userNames = users);
Если же вы хотите искать по локально сохранённой коллекции пользователей то:
Observable.fromEvent(this.myInput.nativeElement, 'input')
.debounceTime(500)
.do(e => this.searchText = e.target.value)
.switchMap(() => Observable.from(this._source))
.subscribe(users => this.userNames = users.map(item => item.fullName)
.filter(item => item.toLowerCase().includes(searchText.toLowerCase())));
Мой код может быть не на все сто рабочим но общий посыл должен быть таким.