婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解美團實現(xiàn)搜索關(guān)鍵詞自動匹配功能的方法

詳解美團實現(xiàn)搜索關(guān)鍵詞自動匹配功能的方法

熱門標簽:機器人電銷哪個牌子好 廣西防封卡外呼系統(tǒng)原理是什么 電銷外呼系統(tǒng)罵人 浙江呼叫中心外呼系統(tǒng)多少錢 地圖標注標記位置導航 地圖標注銷售好做嗎 清遠語音外呼系統(tǒng)平臺 地圖標注操作方法 阿里機器人電銷

問題背景
搜索關(guān)鍵字智能提示是一個搜索應(yīng)用的標配,主要作用是避免用戶輸入錯誤的搜索詞,并將用戶引導到相應(yīng)的關(guān)鍵詞上,以提升用戶搜索體驗。

美團CRM系統(tǒng)中存在數(shù)以百萬計的商家,為了讓用戶快速查找到目標商家,我們基于solrcloud實現(xiàn)了商家搜索模塊。用戶在查找商家時主要輸入商戶名、商戶地址進行搜索,為了提升用戶的搜索體驗和輸入效率,本文實現(xiàn)了一種基于solr前綴匹配查詢關(guān)鍵字智能提示(Suggestion)實現(xiàn)。

需求分析
1.支持前綴匹配原則
在搜索框中輸入“海底”,搜索框下面會以海底為前綴,展示“海底撈”、“海底撈火鍋”、“海底世界”等等搜索詞;輸入“萬達”,會提示“萬達影城”、“萬達廣場”、“萬達百貨”等搜索詞。
2.同時支持漢字、拼音輸入
由于中文的特點,如果搜索自動提示可以支持拼音的話會給用戶帶來更大的方便,免得切換輸入法。比如,輸入“haidi”提示的關(guān)鍵字和輸入“海底”提示的一樣,輸入“wanda”與輸入“萬達”提示的關(guān)鍵字一樣。
3.支持多音字輸入提示
比如輸入“chongqing”或者“zhongqing”都能提示出“重慶火鍋”、“重慶烤魚”、“重慶小天鵝”。
4.支持拼音縮寫輸入
對于較長關(guān)鍵字,為了提高輸入效率,有必要提供拼音縮寫輸入。比如輸入“hd”應(yīng)該能提示出“haidi”相似的關(guān)鍵字,輸入“wd”也一樣能提示出“萬達”關(guān)鍵字。
基于用戶的歷史搜索行為,按照關(guān)鍵字熱度進行排序
為了提供suggest關(guān)鍵字的準確度,最終查詢結(jié)果,根據(jù)用戶查詢關(guān)鍵字的頻率進行排序,如輸入[重慶,chongqing,cq,zhongqing,zq] —> [“重慶火鍋”(f1),“重慶烤魚”(f2),“重慶小天鵝”(f3),…],查詢頻率f1 > f2 > f3。


解決方案
1.關(guān)鍵字收集
當用戶輸入一個前綴時,碰到提示的候選詞很多的時候,如何取舍,哪些展示在前面,哪些展示在后面?這就是一個搜索熱度的問題。用戶在使用搜索引擎查找商家時,會輸入大量的關(guān)鍵字,每一次輸入就是對關(guān)鍵字的一次投票,那么關(guān)鍵字被輸入的次數(shù)越多,它對應(yīng)的查詢就比較熱門,所以需要把查詢的關(guān)鍵字記錄下來,并且統(tǒng)計出每個關(guān)鍵字的頻率,方便提示結(jié)果按照頻率排序。搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255字節(jié)。
2.漢字轉(zhuǎn)拼音
用戶輸入的關(guān)鍵字可能是漢字、數(shù)字,英文,拼音,特殊字符等等,由于需要實現(xiàn)拼音提示,我們需要把漢字轉(zhuǎn)換成拼音,java中考慮使用pinyin4j組件實現(xiàn)轉(zhuǎn)換。
3.拼音縮寫提取
考慮到需要支持拼音縮寫,漢字轉(zhuǎn)換拼音的過程中,順便提取出拼音縮寫,如“chongqing”,"zhongqing"--->"cq",”zq”。
4.多音字全排列
要支持多音字提示,對查詢串轉(zhuǎn)換成拼音后,需要實現(xiàn)一個全排列組合,字符串多音字全排列算法如下:

Java Code復制內(nèi)容到剪貼板
  1. public static List getPermutationSentence(List> termArrays,int start) {   
  2.   
  3.   if (CollectionUtils.isEmpty(termArrays))   
  4.       return Collections.emptyList();   
  5.   
  6.   int size = termArrays.size();   
  7.   if (start  0 || start >= size) {   
  8.       return Collections.emptyList();   
  9.   }   
  10.   
  11.   if (start == size-1) {   
  12.       return termArrays.get(start);   
  13.   }   
  14.   
  15.   ListString> strings = termArrays.get(start);   
  16.   
  17.   ListString> permutationSentences = getPermutationSentence(termArrays, start + 1);   
  18.   
  19.   if (CollectionUtils.isEmpty(strings)) {   
  20.       return permutationSentences;   
  21.   }   
  22.   
  23.   if (CollectionUtils.isEmpty(permutationSentences)) {   
  24.       return strings;   
  25.   }   
  26.   
  27.   ListString> result = new ArrayListString>();   
  28.   for (String pre : strings) {   
  29.       for (String suffix : permutationSentences) {   
  30.           result.add(pre+suffix);   
  31.       }   
  32.   }   
  33.   
  34.   return result;   
  35. }  

索引與前綴查詢
方案一 Trie樹 + TopK算法
Trie樹即字典樹,又稱單詞查找樹或鍵樹,是一種樹形結(jié)構(gòu),是一種哈希樹的變種。典型應(yīng)用是用于統(tǒng)計和排序大量的字符串(但不僅限于字符串),所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計。它的優(yōu)點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。Trie是一顆存儲多個字符串的樹。相鄰節(jié)點間的邊代表一個字符,這樣樹的每條分支代表一則子串,而樹的葉節(jié)點則代表完整的字符串。和普通樹不同的地方是,相同的字符串前綴共享同一條分支。例如,給出一組單詞inn, int, at, age, adv, ant, 我們可以得到下面的Trie:

從上圖可知,當用戶輸入前綴i的時候,搜索框可能會展示以i為前綴的“in”,“inn”,”int"等關(guān)鍵詞,再當用戶輸入前綴a的時候,搜索框里面可能會提示以a為前綴的“ate”等關(guān)鍵詞。如此,實現(xiàn)搜索引擎智能提示suggestion的第一個步驟便清晰了,即用trie樹存儲大量字符串,當前綴固定時,存儲相對來說比較熱的后綴。

TopK算法用于解決統(tǒng)計熱詞的問題。解決TopK問題主要有兩種策略:hashMap統(tǒng)計+排序、堆排序
hashmap統(tǒng)計: 先對這批海量數(shù)據(jù)預處理。具體方法是:維護一個Key為Query字串,Value為該Query出現(xiàn)次數(shù)的HashTable,即hash_map(Query,Value),每次讀取一個Query,如果該字串不在Table中,那么加入該字串,并且將Value值設(shè)為1;如果該字串在Table中,那么將該字串的計數(shù)加一即可,最終在O(N)的時間復雜度內(nèi)用Hash表完成了統(tǒng)計。
堆排序:借助堆這個數(shù)據(jù)結(jié)構(gòu),找出Top K,時間復雜度為N‘logK。即借助堆結(jié)構(gòu),我們可以在log量級的時間內(nèi)查找和調(diào)整/移動。因此,維護一個K(該題目中是10)大小的小根堆,然后遍歷300萬的Query,分別和根元素進行對比。所以,我們最終的時間復雜度是:O(N) + N' * O(logK),(N為1000萬,N’為300萬)。

該方案存在的問題是:

建索引和查詢的時候都要把漢字轉(zhuǎn)換成拼音,查詢完成后還得把拼音轉(zhuǎn)換成漢字顯示,且需要考慮數(shù)字和特殊字符。
需要維護拼音、縮寫兩棵Trie樹。


方案二 Solr自帶Suggest智能提示
Solr作為一個應(yīng)用廣泛的搜索引擎系統(tǒng),它內(nèi)置了智能提示功能,叫做Suggest模塊。該模塊可選擇基于提示詞文本做智能提示,還支持通過針對索引的某個字段建立索引詞庫做智能提示。 (詳見solr的wiki頁面http://wiki.apache.org/solr/Suggester)

該方案存在的問題是:

返回的結(jié)果是基于索引中字段的詞頻進行排序,不是用戶搜索關(guān)鍵字的頻率,因此不能將一些熱門關(guān)鍵字排在前面。
拼音提示,多音字,縮寫還是要另外加索引字段。


方案三 Solrcloud建立單獨的collection,利用solr前綴查詢實現(xiàn)
如前所述,以上兩個方案在實施起來都存在一些問題,Trie樹+TopK算法,在處理漢字suggest時不是很優(yōu)雅,且需要維護兩棵Trie樹,實施起來比較復雜;Solr自帶的suggest智能提示組件存在問題是使用freq排序算法,返回的結(jié)果完全基于索引中字符的出現(xiàn)次數(shù),沒有兼顧用戶搜索詞語的頻率,因此無法將一些熱門詞排在更靠前的位置。于是,我們繼續(xù)尋找一種解決這個問題更加優(yōu)雅的方案。

至此,我們考慮專門為關(guān)鍵字建立一個索引collection,利用solr前綴查詢實現(xiàn)。solr中的copyField能很好解決我們同時索引多個字段(漢字、pinyin, abbre)的需求,且field的multiValued屬性設(shè)置為true時能解決同一個關(guān)鍵字的多音字組合問題。配置如下:

schema.xml:

XML/HTML Code復制內(nèi)容到剪貼板
  1. field name="kw" type="string" indexed="true" stored="true" />     
  2. field name="pinyin" type="string" indexed="true" stored="false" multiValued="true"/>  
  3. field name="abbre" type="string" indexed="true" stored="false" multiValued="true"/>  
  4. field name="kwfreq" type="int" indexed="true" stored="true" />  
  5. field name="_version_" type="long" indexed="true" stored="true"/>  
  6. field name="suggest" type="suggest_text" indexed="true" stored="false" multiValued="true" />  

------------------multiValued表示字段是多值的-------------------------------------

XML/HTML Code復制內(nèi)容到剪貼板
  1. uniqueKey>kw/uniqueKey>  
  2. defaultSearchField>suggest/defaultSearchField>  

說明:
kw為原始關(guān)鍵字
pinyin和abbre的multiValued=true,在使用solrj建此索引時,定義成集合類型即可:如關(guān)鍵字“重慶”的pinyin字段為{chongqing,zhongqing}, abbre字段為{cq, zq}
kwfreq為用戶搜索關(guān)鍵的頻率,用于查詢的時候排序

-------------------------------------------------------

XML/HTML Code復制內(nèi)容到剪貼板
  1. copyField source="kw" dest="suggest" />  
  2. copyField source="pinyin" dest="suggest" />  
  3. copyField source="abbre" dest="suggest" />  

------------------suggest_text----------------------------------

XML/HTML Code復制內(nèi)容到剪貼板
  1. fieldType name="suggest_text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">  
  2.     analyzer type="index">  
  3.             tokenizer class="solr.KeywordTokenizerFactory" />  
  4.             filter class="solr.SynonymFilterFactory"    
  5.                     synonyms="synonyms.txt"    
  6.                     ignoreCase="true"    
  7.                     expand="true" />  
  8.             filter class="solr.StopFilterFactory"    
  9.                     ignoreCase="true"    
  10.                     words="stopwords.txt"    
  11.                     enablePositionIncrements="true" />  
  12.             filter class="solr.LowerCaseFilterFactory" />  
  13.             filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />  
  14.     /analyzer>  
  15.     analyzer type="query">  
  16.             tokenizer class="solr.KeywordTokenizerFactory" />  
  17.             filter class="solr.StopFilterFactory"    
  18.                     ignoreCase="true"    
  19.                     words="stopwords.txt"    
  20.                     enablePositionIncrements="true" />  
  21.             filter class="solr.LowerCaseFilterFactory" />  
  22.             filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />  
  23.     /analyzer>  
  24. /fieldType>  

KeywordTokenizerFactory:這個分詞器不進行任何分詞!整個字符流變?yōu)閱蝹€詞元。String域類型也有類似的效果,但是它不能配置文本分析的其它處理組件,比如大小寫轉(zhuǎn)換。任何用于排序和大部分Faceting功能的索引域,這個索引域只有能一個原始域值中的一個詞元。

前綴查詢構(gòu)造:

Java Code復制內(nèi)容到剪貼板
  1. private SolrQuery getSuggestQuery(String prefix, Integer limit) {   
  2.     SolrQuery solrQuery = new SolrQuery();   
  3.     StringBuilder sb = new StringBuilder();   
  4.     sb.append(“suggest:").append(prefix).append("*");  
  5.     solrQuery.setQuery(sb.toString());  
  6.     solrQuery.addField("kw");  
  7.     solrQuery.addField("kwfreq");  
  8.     solrQuery.addSort("kwfreq", SolrQuery.ORDER.desc);   
  9.     solrQuery.setStart(0);   
  10.     solrQuery.setRows(limit);   
  11.     return solrQuery;   
  12. }  

效果如下圖所示:

標簽:雅安 江蘇 包頭 德宏 廊坊 伊春 沈陽 臺灣

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解美團實現(xiàn)搜索關(guān)鍵詞自動匹配功能的方法》,本文關(guān)鍵詞  詳解,美團,實現(xiàn),搜索,關(guān)鍵詞,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解美團實現(xiàn)搜索關(guān)鍵詞自動匹配功能的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解美團實現(xiàn)搜索關(guān)鍵詞自動匹配功能的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    蜜芽一区二区三区| 成人av手机在线观看| 2020日本不卡一区二区视频| 成人福利电影精品一区二区在线观看| 捆绑调教一区二区三区| 91精选在线观看| 日本一区二区三区久久久久久久久不 | 欧美高清性hdvideosex| 久久久精品免费网站| 日日噜噜夜夜狠狠视频欧美人| 成人三级在线视频| 日韩电影在线看| 在线欧美日韩精品| 国产精品美女久久久久aⅴ| 国产成人亚洲精品狼色在线 | 9人人澡人人爽人人精品| 欧美大度的电影原声| 久久国产欧美日韩精品| 日韩美女视频在线| 粉嫩嫩av羞羞动漫久久久 | 欧美肥妇毛茸茸| 韩国理伦片一区二区三区在线播放 | 久久久久久久网| 国产激情精品久久久第一区二区| 精品久久免费看| 91精品福利视频| 日本va欧美va精品发布| 精品捆绑美女sm三区| 色欧美片视频在线观看| 美女看a上一区| 国产精品久久久久久户外露出| 91福利小视频| 国产精品一区二区不卡| 亚洲国产精品嫩草影院| 日韩免费高清av| 欧美日免费三级在线| 粉嫩av一区二区三区粉嫩| 日本aⅴ精品一区二区三区| 国产精品看片你懂得 | 麻豆精品一二三| 午夜精品久久久| 亚洲一区二区三区四区在线观看 | 亚洲高清三级视频| 中文字幕亚洲一区二区va在线| 欧美一区午夜视频在线观看| 色视频欧美一区二区三区| 色综合视频一区二区三区高清| 色婷婷国产精品| fc2成人免费人成在线观看播放| 久久国产婷婷国产香蕉| 在线这里只有精品| 国产精品一区二区男女羞羞无遮挡 | 久久99精品久久久久久动态图 | 天堂久久久久va久久久久| 亚洲免费高清视频在线| 亚洲特黄一级片| 99视频有精品| 成人国产精品免费观看| 丁香婷婷综合色啪| 99re66热这里只有精品3直播| www.av亚洲| 欧美一级片在线看| 欧美激情一区二区三区| 亚洲一区在线视频| 精品写真视频在线观看| 91小视频免费看| 毛片av一区二区| 欧美午夜精品久久久久久超碰 | 美女视频免费一区| 国产自产视频一区二区三区 | 4438成人网| 欧美激情自拍偷拍| 麻豆精品精品国产自在97香蕉| 久久嫩草精品久久久精品一| 91麻豆精品国产自产在线观看一区| 欧美丰满美乳xxx高潮www| 日本欧美一区二区三区乱码| 色综合久久99| 国产福利一区在线| 欧美丰满一区二区免费视频| 亚洲色图欧美偷拍| 成人在线综合网| 国产精品久久久久三级| 一区二区在线观看免费视频播放 | 日韩av电影免费观看高清完整版在线观看 | 亚洲欧洲一区二区在线播放| 蜜桃视频第一区免费观看| 成人av综合在线| 精品国产乱码久久久久久图片 | 日韩精品资源二区在线| 亚洲尤物在线视频观看| 91在线观看视频| 中文字幕在线不卡| 欧洲亚洲精品在线| 亚洲高清视频在线| 91精品一区二区三区在线观看| 三级一区在线视频先锋| 欧美剧情电影在线观看完整版免费励志电影 | 欧美一区二区三区四区高清| 亚洲国产精品嫩草影院| 欧美成人性战久久| 99精品视频中文字幕| 日本在线观看不卡视频| 国产视频一区二区三区在线观看| 99久久免费国产| 蜜桃视频第一区免费观看| 国产精品免费视频网站| 久久尤物电影视频在线观看| 成人综合在线观看| 久久99精品久久久久久动态图| 一区二区三区在线观看视频 | 日韩一区二区影院| 99久久精品一区二区| 麻豆国产欧美一区二区三区| 国产精品免费视频观看| 精品裸体舞一区二区三区| 欧洲在线/亚洲| 不卡av免费在线观看| 九九**精品视频免费播放| 亚洲愉拍自拍另类高清精品| 1000精品久久久久久久久| 国产日产精品1区| 成人短视频下载| 蜜乳av一区二区| 久久99深爱久久99精品| 免费观看日韩电影| 日本美女一区二区三区视频| 一区二区三区欧美视频| 亚洲日本青草视频在线怡红院| 久久久久国产成人精品亚洲午夜 | 国产iv一区二区三区| 国产一区二三区好的| 高潮精品一区videoshd| 99久久久精品| 欧美日本韩国一区| 国产色91在线| 亚洲午夜在线观看视频在线| 激情综合五月天| 欧美在线不卡视频| 国产三级欧美三级| 亚洲免费观看高清完整版在线观看| 亚洲成人免费视| 91天堂素人约啪| 日韩欧美亚洲国产精品字幕久久久| 精品免费一区二区三区| 亚洲大型综合色站| 色综合天天在线| 国产三级三级三级精品8ⅰ区| 亚洲第四色夜色| 在线看不卡av| 亚洲你懂的在线视频| av在线一区二区三区| 久久久久久日产精品| 国产在线看一区| 日韩欧美卡一卡二| 在线精品国精品国产尤物884a| 国产另类ts人妖一区二区| 欧美一区二区精品久久911| 中文字幕的久久| 成人高清免费观看| 久久久久国产精品麻豆ai换脸| 国产精一品亚洲二区在线视频| 亚洲精品国产视频| 亚洲欧洲日产国产综合网| 久久99久国产精品黄毛片色诱| 在线观看日韩一区| 国产色91在线| 日本久久精品电影| 成人免费一区二区三区在线观看| 日韩国产欧美在线播放| 91国偷自产一区二区开放时间 | 亚洲精品伦理在线| 欧美喷水一区二区| 亚洲成a人在线观看| 欧美系列亚洲系列| 三级不卡在线观看| 亚洲国产成人午夜在线一区| 成人午夜视频免费看| 亚洲免费在线视频| 久久精品噜噜噜成人88aⅴ | 成人不卡免费av| 日欧美一区二区| 国产午夜久久久久| 欧美专区日韩专区| 99久久99久久综合| 国产大陆精品国产| 麻豆成人av在线| 亚洲成人自拍网| 亚洲综合色婷婷| 亚洲一区二区三区精品在线| 一区视频在线播放| 26uuu国产日韩综合| 91麻豆精品国产自产在线| 色猫猫国产区一区二在线视频| 国产一区 二区 三区一级| 日本欧美肥老太交大片| 五月天激情综合| 捆绑调教美女网站视频一区| 日韩不卡在线观看日韩不卡视频| 国产精品久久久久久久久久久免费看|