搜索歷史基本原理實現(xiàn)即時自動補全聯(lián)想搜索技巧
實現(xiàn)搜索歷史-[即時自動補全&聯(lián)想搜索]
無論是新聞、內(nèi)容、還是電商平臺,聯(lián)想輸入已經(jīng)成為搜索功能的標配,早已不是什么新鮮事物。我們隨便打開一個搜索引擎或者是電商平臺,當我們在輸入框輸入拼音或者文字時就會看到輸入框下方彈出有意義的搜索建議,提示我們是不是想要輸入“以下”內(nèi)容,幫助我們補齊輸入或是修正錯誤的輸入,優(yōu)化我們的搜索體驗。

在上圖示例中,我們可以看到,輸入關(guān)鍵字 聯(lián)想搜索,Google 搜索會聯(lián)想到聯(lián)想搜索、elasticsearch聯(lián)想搜索,好處就是,我們無須輸入完整的關(guān)鍵字即可輕松完成針對這些 topics 的搜索。
今天我們實現(xiàn)的功能和聯(lián)想搜索有一點差別,我們是根據(jù)用戶隔離,基于個人搜索歷史的聯(lián)想搜索。
如何實現(xiàn)基于個人搜索歷史的聯(lián)想推薦
一個好的自動補全器必須是快速的,并且在用戶鍵入下一個字符后立即更新聯(lián)想詞列表。自動補全器的核心是一個函數(shù),它接受輸入的前綴,并搜索以給定前綴開頭的詞匯或語句列表。通常來說,只需要返回少量的數(shù)目即可。
架構(gòu)圖

詞匯表實現(xiàn)
實現(xiàn)方式有很多種,例如前綴樹實現(xiàn),有限狀態(tài)自動機(DFA)實現(xiàn)等等。
這里采用Redis ZSET數(shù)據(jù)結(jié)構(gòu)快速實現(xiàn)。
- Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復(fù)的成員。
- 不同的是每個元素都會關(guān)聯(lián)一個 double 類型的分數(shù)。redis 正是通過分數(shù)來為集合中的成員進行從小到大的排序。
type zset key search-history-common key search-history-user:1 key search-history-user:2 key search-history-user:3


備注:
- 常用搜索詞庫數(shù)據(jù)統(tǒng)計規(guī)則:定時取出所有人詞庫中排名靠前n位的搜索項并放入常用搜索庫中
- 分數(shù)值 = 原有分數(shù)值*1.01+1.01 (為什么用一元函數(shù),因為可以讓常用詞和不常用詞更快的區(qū)分開)
- 分數(shù)值初始值為 1
實現(xiàn)原理
新增關(guān)鍵字操作
- 直接添加 默認score = 1
- 添加失敗查詢score
- 設(shè)置新score = score*1.1+1.1 (注意zset不能重新設(shè)置score
- 緩存完成

# 計算新score # 新score應(yīng)該 = score*1.1+1.1 但是 需要用ZADD,所以需要換算,(score*1.1+1.1)-score = a ZADD key a member # 化簡得到 ZADD key score*0.1+1.1 member
# 添加 member = 1 返回 score # 如果存在則添加失敗 返回 0 ZADD key 1 member # 獲取分,不存在返回 null ZSCORE key member # 對某個鍵加上增量 ZADD key 1 member
刪除關(guān)鍵字操作
- 直接刪除
# 刪除成功返回 1,如果一個zset下沒有item, zset也會被自動刪除 ZREM key member
查詢推薦列表操作
- 全量查詢當前用戶詞匯表
- 使用String.contains 或者其他框架過濾出推薦詞
- 返回推薦列表到前端

# 全量查詢 zset key(從小到大) ZRANGE key 0 -1 member2 member # 全量查詢 zset key(從大到小) ZRANGE key 0 -1 WITHSCORES member2 2 member 6
以上就是搜索歷史基本原理實現(xiàn)即時自動補全聯(lián)想搜索技巧的詳細內(nèi)容,更多關(guān)于搜索歷史自動補全聯(lián)想搜索的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Scratch3.0 頁面初始化同時加載sb3文件的操作代碼
今天通過本文給大家分享Scratch3.0 頁面初始化同時加載sb3文件的操作代碼,感興趣的朋友一起看看吧2021-08-08
vscode 左側(cè)擴展活動欄內(nèi)容消失的問題及解決方法
vscode左側(cè)活動欄默認會有 一些內(nèi)容,今天一不小心,不知道怎么的,將部分內(nèi)容搞沒了,vscode 左側(cè)擴展活動欄內(nèi)容消失了怎么辦,下面給大家分享本文幫助大家快速解決,感興趣的朋友一起看看吧2021-08-08
在IDEA(2020.2)中配置Git及使用Git的圖文詳解
這篇文章主要介紹了在IDEA(2020.2)中配置Git及使用Git的圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Clion ROS開發(fā)環(huán)境設(shè)置技巧
這篇文章主要介紹了Clion ROS開發(fā)環(huán)境設(shè)置技巧,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

