用戶在輸入框輸入部分文字,下方彈出下拉列表顯示相關建議(熱門搜索、歷史記錄、實時熱榜),支持鍵盤上下鍵選擇、回車確認、點擊選擇。
| 層級 | 技術方案 |
|---|---|
| 前端交互 | 輸入事件防抖 (debounce) → AJAX/Fetch 請求建議接口 → 渲染下拉列表 (UL/LI 或虛擬列表) → 鍵盤/滑鼠事件處理選中回填 |
| 後端建議服務 | Trie 字典樹 / 雙數組 Trie (DAT) / FST (Finite State Transducer) 存儲海量詞條 → 前綴匹配 + 熱度排序 → 返回 Top N |
| 數據來源 | 搜索日誌統計熱門 Query、業務實體詞庫(商品名、品牌、分類)、實時熱榜計算 |
| 緩存層 | Redis 緩存熱門前綴對應的建議列表,毫秒級響應 |
<input type="text" id="searchBox" autocomplete="off" />
<ul id="suggestList" style="display:none; position:absolute; border:1px solid #ccc; background:#fff;"></ul>
<script>
const input = document.getElementById('searchBox');
const list = document.getElementById('suggestList');
let debounceTimer;
input.addEventListener('input', () => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
const kw = input.value.trim();
if (!kw) { list.style.display = 'none'; return; }
fetch(`/api/suggest?q=${encodeURIComponent(kw)}`)
.then(r => r.json())
.then(data => {
if (data.length === 0) { list.style.display = 'none'; return; }
list.innerHTML = data.map(item => `${item} `).join('');
list.style.display = 'block';
});
}, 150); // 150ms 防抖
});
list.addEventListener('click', e => {
if (e.target.tagName === 'LI') {
input.value = e.target.dataset.val;
list.style.display = 'none';
// 觸發搜索
}
});
// 鍵盤上下鍵選擇邏輯略...
</script>
Score = log(搜索次數) * 權重 + 業務加權,定期離線計算 Top K 存入 Redis。GET /api/suggest?q=關鍵詞&limit=10 → ["建議1","建議2",...]。自動補全原理詳解:搜索框自動補全技術實現
搜索框自動補全 = **前端防抖請求 + 後端前綴匹配排序 + 緩存加速**。核心難點在後端海量詞條的高效前綴查找與實時熱度排序,成熟方案首選 Elasticsearch Completion Suggester 或自建 DAT/FST 索引。