首頁 > 軟體

搜尋歷史基本原理實現即時自動補全聯想搜尋技巧

2023-02-14 06:02:19

實現搜尋歷史-[即時自動補全&聯想搜尋]

無論是新聞、內容、還是電商平臺,聯想輸入已經成為搜尋功能的標配,早已不是什麼新鮮事物。我們隨便開啟一個搜尋引擎或者是電商平臺,當我們在輸入框輸入拼音或者文字時就會看到輸入框下方彈出有意義的搜尋建議,提示我們是不是想要輸入“以下”內容,幫助我們補齊輸入或是修正錯誤的輸入,優化我們的搜尋體驗。

在上圖範例中,我們可以看到,輸入關鍵字 聯想搜尋,Google 搜尋會聯想到聯想搜尋elasticsearch聯想搜尋,好處就是,我們無須輸入完整的關鍵字即可輕鬆完成針對這些 topics 的搜尋。

今天我們實現的功能和聯想搜尋有一點差別,我們是根據使用者隔離,基於個人搜尋歷史的聯想搜尋

如何實現基於個人搜尋歷史的聯想推薦

一個好的自動補全器必須是快速的,並且在使用者鍵入下一個字元后立即更新聯想詞列表。自動補全器的核心是一個函數,它接受輸入的字首,並搜尋以給定字首開頭的詞彙或語句列表。通常來說,只需要返回少量的數目即可。

架構圖

詞彙表實現

實現方式有很多種,例如字首樹實現,有限狀態自動機(DFA)實現等等。

這裡採用Redis ZSET資料結構快速實現。

  • Redis 有序集合和集合一樣也是 string 型別元素的集合,且不允許重複的成員
  • 不同的是每個元素都會關聯一個 double 型別的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
type zset
key search-history-common
key search-history-user:1
key search-history-user:2
key search-history-user:3

備註:

  • 常用搜尋詞庫資料統計規則:定時取出所有人詞庫中排名靠前n位的搜尋項並放入常用搜尋庫中
  • 分數值 = 原有分數值*1.01+1.01 (為什麼用一元函數,因為可以讓常用詞和不常用詞更快的區分開)
  • 分數值初始值為 1

實現原理

新增關鍵字操作

  • 直接新增 預設score = 1
  • 新增失敗查詢score
  • 設定新score = score*1.1+1.1 (注意zset不能重新設定score
  • 快取完成

# 計算新score
# 新score應該 = 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

刪除關鍵字操作

  • 直接刪除
# 刪除成功返回 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

以上就是搜尋歷史基本原理實現即時自動補全聯想搜尋技巧的詳細內容,更多關於搜尋歷史自動補全聯想搜尋的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com