寫一下個人spark實(shí)現(xiàn)的es completion suggester,目錄如下,
1. Overview
2. 補(bǔ)全功能
- 整體架構(gòu)
- 分詞
- 檢索歷程
3. 糾正功能
- 待實(shí)現(xiàn)
4. 存在問題
5. Reference
Overview
檢索建議suggestion(補(bǔ)全completion和糾正correction)是提升用戶搜索體驗(yàn)的一個重要功能,通過協(xié)助用戶輸入更精準(zhǔn)的關(guān)鍵詞,提高后續(xù)全文檢索階段文檔匹配度。


補(bǔ)全功能
在電商平臺(淘寶、京東、Amazon等)上,檢索建議補(bǔ)全可以幫助用戶更準(zhǔn)確、更迅速地定位到潛在購買商品。例如,用戶輸入空氣,電商平臺根據(jù)用戶的歷史行為(login user)或者平臺總體推薦結(jié)果(non-login user),給出有關(guān)空氣的一系列檢索關(guān)鍵詞(如空氣質(zhì)量、空氣劉海、空氣清新劑等),該檢索關(guān)鍵詞可以是簡體、繁體、全拼、首字母拼音等形式。下面使用es的Completion Suggester來實(shí)現(xiàn)補(bǔ)全功能。


整體架構(gòu)
架構(gòu)模塊組織如下,

由三個模塊,一個proxy,一條es總線組成。code將suggestion和normal隔離成2個index,不在normal mapping里加入suggestion,方便更好地管理和升級suggestion;也減輕normal es coordinator的壓力。
分詞
suggest分詞
對于每一個需要index的商品名稱,使用ik挖出其簡體token;使用pinyin挖出其ik后的token的全拼連接和首字母連接。然后插入到suggestion index。
case class SuggestJson(
item_id: Long,
item_name_suggester: Seq[String]
)
//SuggestJson(93,List(han, dou, yi, she, 2017, ban, 女裝, nvzhuang, nz, 夏裝, xiazhuang, xz, 新款, xinkuan, xk, 寬松, kuansong, ks, xian, shou, 短袖, duanxiu, dx, 兩件套, liangjiantao, ljt, 連衣裙, lianyiqun, lyq, oy6198, lu, 淺藍(lán)色, qianlanse, qls)),(這里需要將`韓都衣舍`這個token加入ik詞表,防止被切開)
normal分詞
正常情況下分詞的ik配置與suggestion配置要求一致,然后將其插入到normal index。
case class NormalJson(
item_id: Long,
item_name: String,
item_price: Double,
shop_name: String
)
//NormalJson(93,韓都衣舍2017韓版女裝夏裝新款寬松顯瘦短袖兩件套連衣裙OY6198陸 淺藍(lán)色 M,116.0,韓都衣舍旗艦店)
檢索歷程
下面描述一下用戶檢索歷程,
- 用戶在前端輸入一個query
- 該query經(jīng)過proxy請求
search_suggestion_with_query模塊找到該query所對應(yīng)的建議詞列表(這里建議詞最好是排序的,即返回與query相關(guān)性最高的建議詞),并返回至前端,供用戶選擇 - 用戶在sorted suggestion query list里面點(diǎn)選其中一個作為最終檢索關(guān)鍵詞(final query)
- final query經(jīng)過proxy請求
search_doc_with_suggestion模塊,查詢normal index里面的內(nèi)容
糾正功能
還沒有實(shí)現(xiàn),但是可以使用Phrase Suggester和Term suggester來實(shí)現(xiàn)。
- Term Suggester,基于編輯距離,對analyze過的單個term去提供建議,并不會考慮多個term/詞組之間的關(guān)系。
quert -> query - Phrase Suggester,在Term Suggester的基礎(chǔ)上,通過ngram以詞組為單位返回建議。
noble prize -> nobel prize - Completion Suggester,FST數(shù)據(jù)結(jié)構(gòu),類似Trie樹,不用打開倒排,快速返回,前綴匹配
- Context Suggester,在Completion Suggester的基礎(chǔ)上,用于filter和boost

存在問題
- suggestion和normal的分離,suggested query的排序。如輸入拼音,如果根據(jù)前綴查找規(guī)則,漢字是不會返回的,但是這里需要漢字
- 糾正功能的實(shí)現(xiàn),todo code implementation