Three rules: debounce keystrokes, cancel in-flight requests, render results progressively. Together they make a slow backend feel responsive.
The minimum debounce that still feels instant is around 150ms. Below that you waste requests; above that the user notices.
Use aria-live="polite" on the results container so screen readers announce changes. Keep keyboard navigation (arrow keys, Enter) wired even when results stream in asynchronously.