實(shí)戰(zhàn)第25期:綜合項(xiàng)目實(shí)戰(zhàn)(五)增加關(guān)鍵詞搜索,正確處理 LIKE 與查詢條件組合)
文章目錄引言:搜索框很小,背后的約定不能少一、本篇學(xué)習(xí)目標(biāo)與準(zhǔn)備二、先約定“搜索”到底是什么意思1. 接口規(guī)則2. 為什么把空關(guān)鍵詞當(dāng)成不篩選?3. 為什么不直接承諾“忽略大小寫”?三、先分清三個(gè)容易混淆的層次1. URL 編碼負(fù)責(zé)把關(guān)鍵詞送到后端2. 參數(shù)化 SQL 負(fù)責(zé)把輸入作為數(shù)據(jù)綁定3. LIKE 轉(zhuǎn)義負(fù)責(zé)讓關(guān)鍵詞保持字面含義四、先讓 ListOptions 接住關(guān)鍵詞1. 在原有參數(shù)中增加 Query2. 統(tǒng)一清理和校驗(yàn)3. 修改 HTTP 查詢參數(shù)解析五、正確構(gòu)造 LIKE 模式1. 本篇選擇 ! 作為轉(zhuǎn)義字符2. 為什么單引號(hào)不在這份轉(zhuǎn)義列表里?六、把搜索、狀態(tài)、分頁(yè)與總數(shù)連起來(lái)1. 條件只生成一次2. COUNT 與當(dāng)前頁(yè)使用同一組條件3. 沿用同一事務(wù)內(nèi)的一致讀取七、內(nèi)存版也要遵守相同搜索規(guī)則1. 按 ASCII 折疊,再做子串判斷2. 一個(gè)兼容舊數(shù)據(jù)的小邊界八、運(yùn)行完整示例,觀察特殊字符是否搜對(duì)1. 啟動(dòng)項(xiàng)目2. 創(chuàng)建四條任務(wù)3. 搜索 Go,并篩選未完成任務(wù)4. 搜索字面特殊字符九、前端接入時(shí),別只把搜索詞加進(jìn) URL1. 修改條件后重置 offset2. 避免舊搜索響應(yīng)覆蓋新結(jié)果3. 搜索列表里的任務(wù)仍需攜帶版本更新十、測(cè)試搜索功能,不能只準(zhǔn)備一個(gè) Go1. 內(nèi)存與 SQLite 共用搜索行為測(cè)試2. HTTP 測(cè)試檢查編碼與實(shí)際結(jié)果3. 條件組合與重啟測(cè)試4. 本次實(shí)際執(zhí)行了什么?十一、為什么本篇不急著增加標(biāo)題索引?十二、實(shí)戰(zhàn)練習(xí)與下一步練習(xí)1:增加僅按前綴匹配的搜索練習(xí)2:增加多個(gè)關(guān)鍵詞練習(xí)3:觀察查詢成本參考資料?創(chuàng)作者:全棧弄潮兒?? 個(gè)人主頁(yè):全棧弄潮兒的個(gè)人主頁(yè)??? 個(gè)人社區(qū),歡迎你的加入:全棧開發(fā)社區(qū)?? 專欄:Go零基礎(chǔ)實(shí)戰(zhàn)引言:搜索框很小,背后的約定不能少第23篇,我們讓待辦列表支持分頁(yè)與完成狀態(tài)篩選;第24篇增加版本號(hào),避免舊請(qǐng)求覆蓋新狀態(tài)。接下來(lái),用戶會(huì)提出一個(gè)很自然的需求:任務(wù)太多了,我只想找標(biāo)題里包含 Go 的未完成任務(wù)。給接口增加一個(gè)q參數(shù),似乎就能解決:GET /todos?q=Gocompleted=falselimit=20