Вы можете создать минимизированный конечный автомат (например, DAWG), который содержит конечные узлы для всех существующих кодов ваших продуктов. Затем сохраните это в некотором оптимизированном формате в строке Javascript (или в небольшом количестве строк).
Эти строки можно затем отправить в браузер в сжатом виде, вероятно, это не займет много времени для загрузки.
Затем вы можете пройти конечный автомат в зависимости от количества уже набранных символов и эффективно найти все коды продуктов, которые начинаются с этих символов.
Вот так я и сделаю.
Или может быть просто загрузить весь словарь, потому что 20k не так много. Я написал игру на Javascript, которая загружала словарь большего размера и не была настоящей проблемой.