金沙數(shù)據(jù)-《大話搜索引擎》第一季之初遇搜索(二)
時(shí)間:2023-03-20 07:20:01 | 來(lái)源:電子商務(wù)
時(shí)間:2023-03-20 07:20:01 來(lái)源:電子商務(wù)
本季內(nèi)容概覽:大概會(huì)花費(fèi)4篇左右的文章為大家講解一個(gè)普適率80%左右的垂直搜索引擎,內(nèi)容涵蓋需求分析、架構(gòu)設(shè)計(jì)、模塊切分、各種填坑、效果評(píng)測(cè) 直至上線運(yùn)行。
本篇知識(shí)點(diǎn)概覽:工程切分、倒排、分詞
一、放水篇(如果時(shí)間少請(qǐng)直接跳過(guò)閱讀
干貨篇 ; 特別聲明:如果有時(shí)間建議放水篇也閱讀一下,無(wú)水萬(wàn)物枯萎凋零 搜索亦然)
上篇話說(shuō)架構(gòu)模塊切分完畢,按照國(guó)際慣例我以為一切準(zhǔn)備就緒只等光膀子開(kāi)始碼磚了,然而如大家所想我以為我以為的就是我以為的!就像帝都霧霾來(lái)襲站在國(guó)貿(mào)看到的天空中飄著一個(gè)小三角板似的怪物,走近一看才知道是這么大一個(gè)大褲衩??!
進(jìn)入A公司的前一個(gè)周基本上都是在熟悉一些東西(對(duì)我來(lái)說(shuō)應(yīng)該是調(diào)研,因?yàn)閷?duì)搜索啥都不知道),記得楊總當(dāng)時(shí)安排了3人日讓我把solr tutorial看一遍并且將里面的demo也做一遍。對(duì)于我大學(xué)四年英文考試是否需要補(bǔ)考全看閱卷老師心情的水平來(lái)說(shuō)當(dāng)時(shí)面對(duì)滿篇的e文網(wǎng)頁(yè)也是壓力山大, 現(xiàn)在想象也是醉了,本身不多的內(nèi)容我竟然吭哧了三天才算理清楚solr到底是個(gè)啥玩意!但是一路走過(guò)來(lái)才發(fā)現(xiàn)自己是幸運(yùn)的,solr tutorial寥寥數(shù)頁(yè)文章無(wú)疑是對(duì)搜索小白最好的入門(mén)教材,它使你能快速上手感知搜索是個(gè)什么東東而又不至于一開(kāi)始就陷入各種燒腦無(wú)聊的理論知識(shí)甚至算法無(wú)法自拔。
這幾年遇見(jiàn)過(guò)剛?cè)胨阉鞯脑S多朋友直接一上來(lái)就要來(lái)高大上的比如自己寫(xiě)分詞、自己定制排序、幾十條數(shù)據(jù)用solrcloud,其中理由大都很有趣 比如領(lǐng)導(dǎo)要求、公司要求、xxx公司就是這么搞的、還有的更搞笑的是好不容易有一次自己做主的機(jī)會(huì)自己想挑戰(zhàn)一把極限!其實(shí)按照他們實(shí)際需求來(lái)說(shuō)大部分并無(wú)必要 。最后的結(jié)果大部分可能是搜索做的焦頭爛額,被挑戰(zhàn)的頭暈眼花在搜索的職業(yè)發(fā)展道路上中途退場(chǎng)了,凡此種種不免深感惋惜。
solr tutorial熟悉完畢后我迎來(lái)了第一個(gè)3人日的小任務(wù)LogCleaner, 對(duì) 你沒(méi)看錯(cuò)是LogCleaner(日志清理工),也許你會(huì)納悶這是什么鬼和搜索有毛關(guān)系? 咱們看看這個(gè)LogCleaner工程要實(shí)現(xiàn)的功能:A 將指定目錄下的日志刪除、 B 日志名字可以配置并支持正則表達(dá)式、C 可以指定日志文件保留的天數(shù)(天、時(shí)、分都可配置)、D 可以指定日志的開(kāi)始或者結(jié)束時(shí)間進(jìn)行刪除。是的這個(gè)工程本身和搜索沒(méi)什么關(guān)系,我當(dāng)時(shí)也很納悶 這難道是進(jìn)少林寺學(xué)武術(shù)先要做一年掃地僧考驗(yàn)一下不成。當(dāng)天回家想了一下四個(gè)人的團(tuán)隊(duì)除了楊總外地主和老曹都是五年以上的搬磚老司機(jī),這些打掃衛(wèi)生的活當(dāng)然非我莫屬了,于是也便釋然了。接下來(lái)如你所猜,又來(lái)了LogStorer(日志存儲(chǔ)工)、LogDumper(日志轉(zhuǎn)儲(chǔ)工) ,就這樣我在日志中死扛度過(guò)了兩個(gè)月(后來(lái)才知道這些項(xiàng)目也都是整個(gè)搜索中的一塊塊積木,是不是有點(diǎn)像武俠了`(*∩_∩*)′)。當(dāng)然在這兩個(gè)月期間課余時(shí)間也沒(méi)敢懈怠,幾乎是在公交車(chē)上看完了《搜索引擎lucene+Heritix》,然后又拉著老曹跑人大打印店把《lucene in action》的英文第一版打印了厚厚一摞繼續(xù)啃(當(dāng)時(shí)lucene in action只有第一版英文版,并且一直缺貨,老曹說(shuō)人民大學(xué)的打印店打印很便宜就索性下個(gè)電子版的去打印了)這兩本書(shū)跟隨我在北京搬家搬了無(wú)數(shù)次,直到最近才把它們拿去送給后來(lái)者了。
由于項(xiàng)目緊張晚上加班經(jīng)常一塊吃飯,私下里我也好奇地主和老曹都在做什么高大上的東西,這一看也是驚呆了。 老曹一直在倒騰詞(那時(shí)候?qū)υ~庫(kù)沒(méi)概念),將老的銀杏搜索的熱搜詞一堆一堆的弄過(guò)來(lái)然后從網(wǎng)上找一些餐飲相關(guān)的詞合并進(jìn)來(lái),還有天天分析餐廳標(biāo)題,將那些和餐飲八竿子都打不找的詞肉眼一個(gè)個(gè)找出來(lái)去掉,天天滿屏詞亂飛也是頭要炸了。開(kāi)了幾次會(huì)議后終于確定我們選擇自己做分詞采用正向匹配最小的算法(餐飲行業(yè)的詞大部分是菜譜和餐廳名,大部分都在2-5個(gè)漢字左右 2-3個(gè)的占到80%以上,并且根據(jù)老曹整理的實(shí)際餐廳數(shù)據(jù)場(chǎng)景和楊總跟大家的分析正向匹配最小算法效率相對(duì)較高并且歧義很小即使有歧義也可以自己修改詞庫(kù)控制)。這樣也就帶來(lái)了一個(gè)問(wèn)題如果ABC是個(gè)詞 AB也是個(gè)詞,則ABC永遠(yuǎn)不會(huì)被切分出來(lái),那么詞庫(kù)中到底是留AB呢還是留ABC呢?只有把這類(lèi)的詞找出來(lái)看具體場(chǎng)景才能人工判斷決定留誰(shuí)。于是老曹開(kāi)始寫(xiě)一個(gè)腳本處理大約20w的詞庫(kù)將這種包含關(guān)系的詞找出來(lái),比較清晰的記得當(dāng)時(shí)老曹特意讓我們等一下他讓腳本跑起來(lái)再一塊去吃晚飯,吃完晚飯回來(lái)跑了一個(gè)多小時(shí)的腳本還是沒(méi)有跑完,一直到晚上九點(diǎn)半大家準(zhǔn)備撤了回家的時(shí)候老曹突發(fā)警告說(shuō)“腳本還沒(méi)跑完大家都別懂我電腦?。 ?,第二天一大早大家好奇的聚集在一起準(zhǔn)備看看腳本跑出的結(jié)果,這一看心里拔涼拔涼的, word 哥 竟然還在跑?。?!瘋掉了! 后來(lái)大家一塊查原因才知道由于是臨時(shí)腳本沒(méi)怎么估計(jì)性能問(wèn)題,結(jié)果腳本里有幾個(gè)for循環(huán),計(jì)算量超萬(wàn)萬(wàn)億了!?。?br> 與此同時(shí)地主正在設(shè)計(jì)一個(gè)mysql大表并和業(yè)務(wù)人員去理各種字段關(guān)系以及triger設(shè)計(jì),由于涉及的數(shù)據(jù)源和表都超多所以工作也是不輕松,這工作也持續(xù)了近兩個(gè)月中間也開(kāi)了無(wú)數(shù)次的評(píng)審會(huì)。楊總一直在輔導(dǎo)我們每個(gè)人應(yīng)該如何做各自模塊和工程并時(shí)刻做著救火隊(duì)員的工作。
是的,如大家所見(jiàn)我們前兩個(gè)月并沒(méi)有大家期望的高大上的搜索技術(shù),相反大都是些世俗的臟活累活,甚至以后也很少會(huì)有多么高大上的技術(shù)工程?,F(xiàn)在回過(guò)頭來(lái)看,一個(gè)好的搜索的確離不開(kāi)甚至80%以上的活都是很平常的臟活累活。每個(gè)細(xì)節(jié)、模塊、工程的精細(xì)雕琢才有可能做出一些還不錯(cuò)的成績(jī)。搜索就像生活,相對(duì)于詩(shī)和遠(yuǎn)方更多的還是些柴米油鹽醬醋茶,時(shí)不時(shí)的換個(gè)尿不濕也是常事o(* ̄▽?zhuān)?)o。
二、干貨篇(友情提醒:如果您是一名搜索初學(xué)者這部分請(qǐng)仔細(xì)閱讀,以免出現(xiàn)整個(gè)系列文章讀完后搜索技術(shù)點(diǎn)忘得一干二凈,而每篇里面扯的蛋都?xì)v歷在目、栩栩如生的情況?。?br>
工程拆分細(xì)節(jié)架構(gòu)中模塊拆分和工程拆分大部分時(shí)候會(huì)不一樣,一般來(lái)說(shuō)模塊拆分更抽象將意思表達(dá)出來(lái)即可,更側(cè)重宏觀上的控制;工程拆分則要側(cè)重團(tuán)隊(duì)之間的溝通協(xié)作方便和代碼依賴交叉最小化,以及大塊的代碼如何解耦和復(fù)用上 相對(duì)來(lái)說(shuō)會(huì)細(xì)一些。上篇里提到過(guò)的架構(gòu)圖中的模塊大家可能還有印象,下面這幅圖里是整個(gè)工程圖,給大家一個(gè)直觀的感受后接下來(lái)會(huì)對(duì)每個(gè)工程做詳細(xì)描述。
如上圖所示,我把大概15個(gè)工程按優(yōu)先級(jí)的維度分成了三大部分,因?yàn)闃I(yè)務(wù)需求的不同大部分第一次做垂直搜索的人員可能只需要用到其中的一部分或兩部分,這樣整理應(yīng)該會(huì)更通俗易懂一些。
core(核心): 這部分是必須有的,也就是作為一個(gè)搜索引擎必須具備的工程組件,就像作為一輛汽車(chē)起碼要有四個(gè)輪子,作為一個(gè)人起碼要有四肢和大腦一樣。
extend(擴(kuò)展) :這部分可有可無(wú),按照我接觸的一些初次需要搜索功能的平臺(tái)來(lái)說(shuō)真實(shí)需求幾乎90%的情況不需要,然而你懂的,實(shí)際上大部分情況下需求會(huì)被放大?,F(xiàn)在回過(guò)頭來(lái)看這些就像我們的生活,有車(chē)有房的并不比月光族的生活質(zhì)量和幸福感會(huì)高一樣,同樣對(duì)于搜索剛剛起步的階段做了這一部分?jǐn)U展如果駕馭不了往往會(huì)使得整個(gè)搜索更差,甚至整個(gè)項(xiàng)目遠(yuǎn)遠(yuǎn)超期或者中途夭折。
assistant(輔助):這部分比較難以形容也相對(duì)雜亂些,幾個(gè)詞形容一下大家自己悟吧:錦上添花、打醬油、工匠精神、吃瓜群眾、未雨綢繆、杞人憂天。(整個(gè)《大話搜索引擎》系列會(huì)有好多工程會(huì)屬于這部分,也許只能系列文章全寫(xiě)完后才能確切講清楚這部分是干啥的)
core(核心):1.DataCollector(數(shù)據(jù)采集工程) 將變更餐廳相關(guān)信息近實(shí)時(shí)的采集到搜索庫(kù)中。 輸入:分屬于兩個(gè)類(lèi)型的數(shù)據(jù)庫(kù)(mysql,oracle)的20多張餐廳相關(guān)信息表。輸出:整理好的單表數(shù)據(jù)到SeachDB。此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程運(yùn)行。
2.IndexBuilder(索引創(chuàng)建工程) 負(fù)責(zé)將采集好的變更的餐廳數(shù)據(jù)近實(shí)時(shí)的發(fā)給solr讓其創(chuàng)建索引。輸入:SearchDB中的數(shù)據(jù)源; 輸出:整理好的xml文檔發(fā)給solr。 此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程運(yùn)行。
3.SearchService(搜索服務(wù)工程) 接受web發(fā)來(lái)的搜索請(qǐng)求執(zhí)行搜索操作,并做一些業(yè)務(wù)轉(zhuǎn)換。 輸入:搜索請(qǐng)求參數(shù)、業(yè)務(wù)配置文件、solr返回的源數(shù)據(jù); 輸出:整理好的規(guī)范化的xml數(shù)據(jù)。 此工程在部署的時(shí)候是一運(yùn)行在web容器中的標(biāo)準(zhǔn)http服務(wù)。
4.triger(數(shù)據(jù)觸發(fā)器) 數(shù)據(jù)源DB上的觸發(fā)器,負(fù)責(zé)將變更的數(shù)據(jù)觸發(fā)到對(duì)應(yīng)的表中。輸入:20多張餐廳信息表的變更事件;輸出:變更信息表中的數(shù)據(jù)(只標(biāo)識(shí)增刪改和餐廳業(yè)務(wù)主鍵)。此“工程”是DB上的機(jī)制,只是開(kāi)發(fā)些triger腳本即可。
extend(擴(kuò)展):1.WordSegmentation(分詞工程) 將索引和查詢的字符串分詞,包含正向匹配最小的分詞器(主分詞器)、特殊符號(hào)分詞器、兒話音分詞器、全半角轉(zhuǎn)化分詞器。輸入:字符串 ; 輸出:一個(gè)個(gè)詞。比如輸入:“西直門(mén)肯德基餐廳” 輸出:“西直門(mén)” ”肯德基“ “餐廳”。此工程在部署的時(shí)候是以jar包的形式內(nèi)嵌到solr中的。(分詞這塊具體在搜索中是啥意思文章后半部分會(huì)細(xì)講)
2.SearchProxy(搜索代理工程) 接受SearchService的業(yè)務(wù)api參數(shù)進(jìn)行審核解析為solr的復(fù)雜語(yǔ)法,并查詢solr數(shù)據(jù)返回原生xml信息。 輸入:SearchService查詢請(qǐng)求參數(shù) 輸出:solr返回的原生xml數(shù)據(jù);此工在部署的時(shí)候是以jar包的形式內(nèi)嵌到SearchService中的。
3.UpdateFacetCfg(切面數(shù)據(jù)配置更新工程) 負(fù)責(zé)將數(shù)據(jù)庫(kù)變更的需要做切面統(tǒng)計(jì)的數(shù)據(jù)從數(shù)據(jù)庫(kù)下載好組織好生成xml文件供SearchService使用,例如:區(qū)域、菜系、價(jià)格區(qū)間、地鐵沿線 等等。 輸入:數(shù)據(jù)庫(kù)原始信息或者運(yùn)營(yíng)人員提的數(shù)據(jù)變更; 輸出:樹(shù)狀facet.xm結(jié)構(gòu)文件。此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程運(yùn)行,定期向SearchService中輸送最新的切面數(shù)據(jù)文件facet.xml,SearchService則有自動(dòng)檢測(cè)文件變更的線程將最新文件加載到內(nèi)存中使用。兩個(gè)工程通過(guò)文件的形式解耦。
4.SearchLogic(搜索邏輯功能) 擴(kuò)展solr功能提供一些靈活的查詢模型。例如And, OR, Mix(分詞查詢語(yǔ)句之間先And查詢,無(wú)結(jié)果自動(dòng)切換到OR查詢)。輸入:模型參數(shù);輸出:改寫(xiě)的查詢語(yǔ)法解析。 這塊要改寫(xiě)不少solr的代碼,至于當(dāng)時(shí)為什么要做這塊原因大概這么幾點(diǎn)。A:SearchService提供給多個(gè)業(yè)務(wù)系統(tǒng)用,查詢精確度要求不一樣 B:solr當(dāng)時(shí)的版本(1.4)在語(yǔ)法解析上會(huì)有一些錯(cuò)誤在配置同義詞的情況下 And和OR關(guān)系解析不正確導(dǎo)致同義詞配置形同虛設(shè)(餐飲行業(yè)好多同義詞 比如 菜花<->花菜 土豆<->山藥蛋 等等)。C:對(duì)于先And后Or的查詢?cè)趕olr層hack會(huì)減少一次網(wǎng)絡(luò)傳輸,性能會(huì)更好些。此工程在部署的時(shí)候是以jar包的形式內(nèi)嵌到solr中的。
5.SearchSimilarity(搜索相關(guān)度工程) 修改solr的相關(guān)度函數(shù)代碼使其更適合垂直行業(yè)搜索。其實(shí)改動(dòng)的很少,但是效果很不錯(cuò)。這塊暫時(shí)不細(xì)講,因?yàn)樯婕暗膬?nèi)容太多,后續(xù)的文章中會(huì)花費(fèi)大的篇幅去講解。感興趣的同學(xué)可以提前看看了解一下下圖的lucene評(píng)分公式,在沒(méi)講解這個(gè)公式前很難把修改的東西起了什么作用講明白。
score(q,d)=(overlap/maxOverlap)·(1/(q.getBoost()^2·∑(idf(t)·t.getBoost())^2))·∑(tf(t in d)·idf(t)^2·t.getBoost()·doc.getBoost()·lengthNorm·∏f.getBoost())
6.Monitor(搜索監(jiān)控工程)監(jiān)控系統(tǒng)主要負(fù)責(zé)兩個(gè)工作,一個(gè)是發(fā)現(xiàn)任何solr服務(wù)不可用則自動(dòng)發(fā)郵件通知搜索團(tuán)隊(duì)每個(gè)人,另一個(gè)則是將solr服務(wù)下線通知LB讓SearchService端立即停止請(qǐng)求不可用的solr,并同時(shí)周期性檢測(cè)服務(wù)是否已經(jīng)恢復(fù),恢復(fù)的話則會(huì)自動(dòng)通知LB上線并發(fā)郵件通知搜索團(tuán)隊(duì)每個(gè)人。此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程運(yùn)行。
assistant(輔助):1. LoadBalance(負(fù)責(zé)均衡工程) load balance這個(gè)模塊是用來(lái)做負(fù)載均衡,比如三個(gè)solr slave可能有一臺(tái)機(jī)器配置好,則在流量分配上可以多分一些。另外比如solr服務(wù)掛掉了 LB則不會(huì)上SearchService上的請(qǐng)求打過(guò)來(lái)。此工在部署的時(shí)候是以jar包的形式內(nèi)嵌到SearchService中的。
2. ResParticiple(餐飲行業(yè)分詞測(cè)試工程) 這個(gè)工程本來(lái)可以不提的,本身上線的時(shí)候也不會(huì)用到,但是它的確又扮演了非常重要的角色。這個(gè)工程在分詞器進(jìn)行修改后會(huì)拿餐廳標(biāo)題、熱搜字符串等經(jīng)常被檢索的字段分類(lèi)隨機(jī)跑出來(lái)一定數(shù)量(上萬(wàn))的分詞效果供大家檢測(cè)分詞是否合理詞庫(kù)是否完善。這幾乎也是初次建立自己詞庫(kù)和分詞器的必經(jīng)之路,盡管繁瑣甚至大部分是人肉工作,但是相當(dāng)有必要!! 此工程不需要部署,通俗點(diǎn)講是良心活、工匠活。3.LogCleaner(日志清理工程)主要負(fù)責(zé) A 將指定目錄下的日志刪除、 B 日志名字可以配置并支持正則表達(dá)式、C 可以指定日志文件保留的天數(shù)(天、時(shí)、分都可配置)、D 可以指定日志的開(kāi)始或者結(jié)束時(shí)間進(jìn)行刪除。 上線部署的時(shí)候是多部署,多個(gè)運(yùn)行在后臺(tái)的守護(hù)進(jìn)程,主要工作是給各個(gè)搜索工程吐出的搜日志做清理或保留工作。(其實(shí)現(xiàn)在來(lái)看這塊的功能更常規(guī)的做法應(yīng)該是log4j+shell腳本去處理) 4.LogStorer(日志存儲(chǔ)工程) 將SearchService的文件日志讀取存儲(chǔ)到關(guān)系數(shù)據(jù)庫(kù)中,以備后續(xù)統(tǒng)計(jì)分析使用。主要是針對(duì)搜索參數(shù)的比如:搜索詞、ip、用戶id、選擇的篩選條件、排序條件等等。這塊其實(shí)是搜索用戶數(shù)據(jù)采集的雛形,后面的經(jīng)歷中會(huì)對(duì)這塊做更深入講解,其實(shí)大部分搜索的后期優(yōu)化來(lái)源于和搜索相關(guān)甚至不相關(guān)的數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)。此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程運(yùn)行。 5.LogDumper(日志轉(zhuǎn)儲(chǔ)工程) 將一個(gè)月前的搜索日志信息轉(zhuǎn)儲(chǔ)到搜索日志歷史表中,這塊就不多解釋了把,你懂的。此工程在部署的時(shí)候是一個(gè)單獨(dú)的后臺(tái)守護(hù)進(jìn)程行。
搜索引擎基本術(shù)語(yǔ)文檔(doc):搜索引擎中的一條數(shù)據(jù)記錄,比如一個(gè)餐廳、一個(gè)商品。
文檔id(docId):搜索引擎內(nèi)部唯一標(biāo)識(shí)一篇文檔的標(biāo)記,就像我們的身份證編號(hào)一樣。
詞:查詢、索引 存儲(chǔ)的最小原子單位。比如漢字的最細(xì)粒度一個(gè)字也可以說(shuō)是一個(gè)詞。
分詞器:將文本或字符串分解成一個(gè)一個(gè)詞的工具。
倒排索引表:以詞為索引記錄每個(gè)詞都在哪些文檔中出現(xiàn)過(guò)。
正排索引表:以文檔id為索引,記錄相應(yīng)的文檔存儲(chǔ)的位置。
正排倒排講解 搜索引擎中常聽(tīng)的的兩個(gè)術(shù)語(yǔ)是正排索引和倒排索引(高大上的稱呼可以是 forward index和 inverted index),到底是什么意思呢?大家對(duì)索引這個(gè)詞應(yīng)該并不陌生,比如說(shuō)目錄索引,郵編索引等等。通俗的講我們經(jīng)常閱讀書(shū)籍的目錄索引就是一種正排索引,比如你有天想唱《兒歌三百首》中的“葫蘆娃”這首歌,通過(guò)目錄很快找到了“葫蘆娃”的頁(yè)碼(docId:文檔id)在36頁(yè),于是很快找到了整個(gè)歌曲。再比如有天你的領(lǐng)導(dǎo)發(fā)你的緊急郵件中有一字“擦”,你認(rèn)識(shí)但是不知道什么意思,于是拿起了祖?zhèn)鞯摹缎氯A字典》查到了這個(gè)"擦"字在第585頁(yè),此處的585即可理解場(chǎng)倒排索引id,字典的組織結(jié)構(gòu)是比較像搜索引擎的倒排索引結(jié)構(gòu)的。
ok? 如果這個(gè)不太好理解,拿我們就那更正規(guī)的講法講解一遍。
假如有一天你的女神腦洞大開(kāi)讓你將包含“媽媽”這個(gè)詞的兒歌全部唱一遍,那我們看如果根據(jù)正排索引來(lái)找出所有歌曲的話則只能一個(gè)一個(gè)歌曲看,如果那天《兒歌三百首》增長(zhǎng)到《兒歌三億首》是不是這種場(chǎng)景要崩潰香菇的感覺(jué)?那如果我們用倒排索引來(lái)查呢? “媽媽”這個(gè)詞對(duì)應(yīng)的倒排列表(文檔Id列表)為 1、6、9 而根據(jù)這三個(gè)文檔id再到正排表中快速查到 “媽媽帶我沙灘跑”、“傻媽媽”、“喂媽媽” so fast !so easy!咱們?cè)偌狱c(diǎn)難度,又假設(shè)你女神突然想起一首歌叫 ”xxx小雪人“而xxx以及記不清具體是啥了,現(xiàn)在我們使用正排索引無(wú)疑還是藍(lán)廋香菇!那看看偉大的倒排表如何呢:“小雪人”分詞為 “小” “雪人”,對(duì)應(yīng)的倒排docid列表分別是 “小”:2、5、7 ; “雪人“:2,兩個(gè)docid列表取交集得到docid列表為2,則根據(jù)正排表快速找到”門(mén)口有個(gè)小雪人“ 于是你的女神向你投來(lái)了崇拜的目光,如此估計(jì)你下個(gè)雙十一不用一個(gè)人過(guò)了。
分詞講解 聊搜索引擎,分詞就不可能避開(kāi),也許有人說(shuō)外文比如英文搜索引擎應(yīng)該不用分詞吧,是的你猜錯(cuò)了!分詞的好壞直接影響到召回率(查詢出來(lái)的真正相關(guān)的文檔數(shù)/總相關(guān)的文檔數(shù))和查準(zhǔn)率(查詢出來(lái)的真正相關(guān)的文檔數(shù)/查詢出來(lái)的文檔總數(shù))。詞是在搜索引擎中的最小原子單位,在lucene的體系又稱之為term或token。既然是最小的原子單位就意味著不可再分,不管是查詢還是索引都是以這個(gè)最小單位為基礎(chǔ)。 那么什么叫分詞的,就是將一個(gè)長(zhǎng)字符串通過(guò)一定的規(guī)則或者詞庫(kù)分解成多個(gè)小字符串的過(guò)程而這里被分解后的小字符串即是搜索引擎中的最小單位的一個(gè)實(shí)體--詞。所以搜索引擎中的”詞“和我們生活中說(shuō)的”詞“并不是同一個(gè)概念??! ”張三買(mǎi)了一張三角桌子“ 可以分詞為 ”張三、買(mǎi)了、一張、三角、桌子“ , 也可以分詞為”張三、買(mǎi)了、一、張三、桌子“ ,如果樂(lè)意也可以分詞為”張三買(mǎi)了、一張三角、桌子“ , 上面提到的“張三” “張三買(mǎi)了”都是一種詞,至于是不是詞全是分詞器說(shuō)了算,就像每年評(píng)優(yōu)秀員工一樣,領(lǐng)導(dǎo)說(shuō)你是你就是不是也是!
好,接下來(lái)我們做個(gè)智力題,說(shuō):”兔媽媽出門(mén)前讓小白兔把一個(gè)胡蘿卜切成了10小段放進(jìn)鍋里煮,結(jié)果兔媽媽回來(lái)了要它從鍋里撈出來(lái)一條完好無(wú)損的整根蘿卜,請(qǐng)問(wèn)小白兔能做到嗎?“,是的你回答正確顯然不能, 那么難度加大說(shuō):”兔媽媽出門(mén)前讓小白兔把一個(gè)胡蘿卜切成了無(wú)數(shù)蘿卜絲放進(jìn)鍋里煮,結(jié)果兔媽媽回來(lái)了要它從鍋里撈出來(lái)10小段蘿卜,請(qǐng)問(wèn)小白兔能做到嗎?“,是的你又答對(duì)了肯定不可能做到。然而初入搜索者經(jīng)常會(huì)犯懵,時(shí)不時(shí)的去讓自己扮演兔媽媽?zhuān)屗阉饕姘缪菪“淄?,讓搜索引擎藍(lán)瘦的香菇!不信你看下面這個(gè)例子:我文檔里面有"中國(guó)東北大學(xué)“,為什么搜索“中國(guó)大學(xué)”搜不出來(lái), 反而搜索“北大”把 中國(guó)東北大學(xué)搜索出來(lái)了!
如何選擇分詞器?分詞的問(wèn)題也是搜索技術(shù)社區(qū)里面經(jīng)常甚至每天都會(huì)問(wèn)到的一類(lèi)問(wèn)題。典型問(wèn)題如:“我用什么分詞器好 ik、庖丁、mmseg、ansj還是hanlp?” 這個(gè)就好比問(wèn)ruby、java、python、php那個(gè)更牛X?再打個(gè)比方這些開(kāi)源的分詞器就像做好的鞋子(大部分有其固定特點(diǎn)),你直接問(wèn)柜員要最漂亮的鞋子,結(jié)果給你推薦一個(gè)紅色女士高跟鞋結(jié)果哪知道你是個(gè)大老爺們并且有著48的大腳!分詞的選擇脫離開(kāi)業(yè)務(wù)場(chǎng)景和自己的數(shù)據(jù)場(chǎng)景無(wú)異于緣木求魚(yú),關(guān)于如何選擇分詞我以后會(huì)根據(jù)自己趟過(guò)的坑讓大家一步步去理解加深,實(shí)際中沒(méi)有最好的只有合適不合適的!
今天就先羅嗦到這里吧,感謝各位看官看到了文章末尾,若是無(wú)意挑戰(zhàn)中挑戰(zhàn)了各位親的忍耐力還請(qǐng)海涵。其實(shí)本身不打算把文章搞這么長(zhǎng)并讓大家等這么久的,但是權(quán)衡再三還是感覺(jué)放在一篇中知識(shí)點(diǎn)相對(duì)比較完整獨(dú)立,前后篇耦合度也低一些,作為一個(gè)碼農(nóng)的潔癖,你是知道的O(∩_∩)O。
點(diǎn)擊最下方 閱讀原文 查看上一篇《大話搜索引擎》第一季之初遇搜索(一)
----------------下篇預(yù)告---------------------
為什么沒(méi)做競(jìng)價(jià)的搜索引擎突然有了競(jìng)價(jià)功能,是誰(shuí)在搗鬼?
如何證明一個(gè)新的搜索比老的搜索效果好?
如何做真正的搜索引擎壓力測(cè)試?
以上疑問(wèn)將在下篇中逐一揭密,敬請(qǐng)期待!
喜歡的朋友請(qǐng)關(guān)注公眾號(hào):gold_data (金沙數(shù)據(jù)) 您將會(huì)及時(shí)得到最新的文章。
關(guān)鍵詞:數(shù)據(jù),索引,金沙,大話