Все очень просто.
Обычный инпут, при изменении - отправляешь запрос, при вводе следующего символа - отменяешь предыдущий запрос и посылаешь новый.
Результаты рисуешь в саджесте, выводи 10 штук - больше нет смысла
Нет, это не затратно.
Нужен еще бэк быстрый, чтобы все это нормально смотрелось