基于Elasticsearch实现搜索建议
搜索建議是搜索的一個重要組成部分,一個搜索建議的實現通常需要考慮建議詞的來源、匹配、排序、聚合、關聯的文檔數和拼寫糾錯等,本文介紹一個基于Elasticsearch實現的搜索建議。
問題描述
電商網站的搜索是最基礎最重要的功能之一,搜索框上面的良好體驗能為電商帶來更高的收益,我們先來看看淘寶、京東、亞馬遜網站的搜索建議。
在淘寶的搜索框輸入【衛衣】時,下方的搜索建議包括建議詞以及相關的標簽:
在京東的搜索框輸入【衛衣】時,下方搜索建議右方顯示建議詞關聯的商品數量:
在亞馬遜的搜索框輸入【衛衣】時,搜索建議上部分能支持在特定的分類下進行搜索:
通過上述對比可以看出,不同的電商對于搜索建議的側重點略有不同,但核心的問題包括:
匹配:能夠通過用戶的輸入進行前綴匹配;
排序:根據建議詞的優先級進行排序;
聚合:能夠根據建議詞關聯的商品進行聚合,比如聚合分類、聚合標簽等;
糾錯:能夠對用戶的輸入進行拼寫糾錯;
搜索建議實現
在我們的搜索建議實現里,主要考慮了建議詞的來源、匹配、排序、關聯的商品數量和拼寫糾錯。
SuggestionDiscovery
SuggestionDiscovery的職責是發現建議詞;
建議詞的來源可以是商品的分類名稱、品牌名稱、商品標簽、商品名稱的高頻詞、熱搜詞,也可以是一些組合詞,比如“分類 + 性別”和“分類 + 標簽”,還可以是一些自定義添加的詞;
建議詞維護的時候需要考慮去重,比如“衛衣男”和“衛衣 男”應該是相同的,“Nike”和“nike”也應該是相同的;
由于建議詞的來源通常比較穩定,所以執行的周期可以比較長一點,比如每周一次;
SuggestionCounter
SuggestionCounter的職責是獲取建議詞關聯的商品數量,如果需要可以進行一些聚合操作,比如聚合分類和標簽;
SuggestionCounter的實現的時候由于要真正地調用搜索接口,應該盡量避免對用戶搜索的影響,比如在凌晨執行并且使用單線程調用;
為了提升效率,應該使用Elasticsearch的Multi Search接口批量進行count,同時批量更新數據庫里建議詞的count值;
由于SuggestionCounter是比較耗資源的,可以考慮延長執行的周期,但是這可能會帶來count值與實際搜索時誤差較大的問題,這個需要根據實際情況考慮;
SuggestionIndexRebuiler
SuggestionIndexRebuiler的職責是負責重建索引;
考慮到用戶的搜索習慣,可以使用Multi-fields來給建議詞增加多個分析器。比如對于【衛衣 套頭】的建議詞使用Multi-fields增加不分詞字段、拼音分詞字段、拼音首字母分詞字段、IK分詞字段,這樣輸入【weiyi】和【套頭】都可以匹配到該建議詞;
重建索引時通過是通過bulk批量添加到臨時索引中,然后通過別名來更新;
重建索引的數據依賴于SuggestionCounter,因此其執行的周期應該與SuggestionCounter保持一致;
SuggestionService
SuggestionService是真正處于用戶搜索建議的服務類;
通常的實現是先到緩存中查詢是否能匹配到緩存記錄,如果能匹配到則直接返回;否則的話調用Elasticsearch的Prefix Query進行搜索,由于我們在重建索引的時候定義了Multi-fields,在搜索的時候應該用boolQuery來處理;如果此時Elasticsearch返回不為空的結果數據,那么加入緩存并返回即可;
如果Elasticsearch返回的是空結果,此時應該需要增加拼寫糾錯的處理(拼寫糾錯也可以在調用Elasticsearch搜索的時候帶上,但是通常情況下用戶并沒有拼寫錯誤,所以建議還是在后面單獨調用suggester);如果返回的suggest不為空,則根據新的詞調用建議詞服務;比如用戶輸入了【adidss】,調用Elasticsearch的suggester獲取到的結果是【adidas】,則再根據adidas進行搜索建議詞處理。
關于排序:在我們的實現里面是通過weight和count進行排序的,weight目前只考慮了建議詞的類型(比如分類 > 品牌 > 標簽);
實現效果和后續改進
通過上面的實現,我們已經能實現一個比較強大的搜索建議詞了,實際的效果如下所示:
后續可以考慮的改進:參考亞馬遜增加分類的聚合展示、增加用戶個性化的處理支持更好的建議詞排序、基于用戶的搜索歷史支持更好的建議詞推薦;
參考資料
Elasticsearch Prefix Query
Elasticsearch Suggester
轉載于:https://blog.51cto.com/8132260/2150787
總結
以上是生活随笔為你收集整理的基于Elasticsearch实现搜索建议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中的强制类型转换:int和byt
- 下一篇: JsonDB php json数据库 N