摘要:奇技指南360搜索是360的重要產(chǎn)品,目前擁有上萬(wàn)臺(tái)服務(wù)器,每日抓取網(wǎng)頁(yè)數(shù)量高達(dá)十億,引擎索引的優(yōu)質(zhì)網(wǎng)頁(yè)數(shù)量超過(guò)數(shù)百億。本文就來(lái)為大家介紹一下,如此強(qiáng)大的搜索引擎是如何設(shè)計(jì)的,涉及了哪些關(guān)鍵技術(shù)點(diǎn)。360搜索概況目前360搜索每日抓取的網(wǎng)頁(yè)...
奇技指南
360搜索是360的重要產(chǎn)品,目前擁有上萬(wàn)臺(tái)服務(wù)器,每日抓取網(wǎng)頁(yè)數(shù)量高達(dá)十億,引擎索引的優(yōu)質(zhì)網(wǎng)頁(yè)數(shù)量超過(guò)數(shù)百億。
本文就來(lái)為大家介紹一下,如此強(qiáng)大的搜索引擎是如何設(shè)計(jì)的,涉及了哪些關(guān)鍵技術(shù)點(diǎn)。
目前360搜索每日抓取的網(wǎng)頁(yè)數(shù)量高達(dá)十億,已經(jīng)收錄的網(wǎng)頁(yè)基本上是萬(wàn)億級(jí)別的網(wǎng)頁(yè)集合,實(shí)際可檢索的網(wǎng)頁(yè)是在一個(gè)百億級(jí)別的網(wǎng)頁(yè)集合里。
目前360搜索的單日流量是億級(jí)pv。我們目前的在線、離線機(jī)群有幾萬(wàn)臺(tái)服務(wù)器來(lái)維護(hù)這么大量級(jí)的計(jì)算。
我今天的分享的主要會(huì)側(cè)重于百億級(jí)網(wǎng)站搜索引擎架構(gòu)的一些核心模塊的理論設(shè)計(jì)。本次分享內(nèi)容分為以下四個(gè)模塊:
首先從如何設(shè)計(jì)一個(gè)搜索引擎講起。
基礎(chǔ)檢索
一個(gè)用戶請(qǐng)求過(guò)來(lái)之后,整個(gè)搜索引擎的工作流程大致如下:
首先用切詞組件做分詞,把query分成多個(gè)word,然后多個(gè)word會(huì)從我們的倒排索引里面獲取倒排拉鏈,在倒排拉鏈的基礎(chǔ)上,會(huì)做求交計(jì)算來(lái)拿到所有命中的doc list。拿到doc list之后,我們希望能夠把優(yōu)質(zhì)的網(wǎng)頁(yè)反饋給用戶,這時(shí)候我們還需要做rank計(jì)算。rank計(jì)算就是拿倒排里面的一些位置索引信息,包括在正排里面拿一些rank的屬性特征信息做打分,最終會(huì)把分?jǐn)?shù)比較高的Top N結(jié)果反饋用戶。當(dāng)然在前端web頁(yè)面展示的時(shí)候,需要從正排中提取摘要信息,展示給用戶。這就是整個(gè)的檢索過(guò)程。
基礎(chǔ)索引
整個(gè)檢索過(guò)程涉及到兩個(gè)庫(kù)。第一個(gè)是正排索引,另一個(gè)是倒排索引,我這里針對(duì)這兩個(gè)庫(kù)給大家做一個(gè)簡(jiǎn)單的介紹。
什么是正排索引?我們從互聯(lián)網(wǎng)上抓取的網(wǎng)頁(yè)包含很多信息,包括網(wǎng)頁(yè)頭信息、標(biāo)題、正文、標(biāo)簽等。我們首先從網(wǎng)頁(yè)中把文章的正文以及文章相關(guān)的特征提取出來(lái),當(dāng)然也輸入一些挖掘的信息,然后做一些分詞處理。這個(gè)過(guò)程,我們是把整個(gè)的網(wǎng)頁(yè)生成了兩部分?jǐn)?shù)據(jù),第一部分就是屬性,所謂屬性就是針對(duì)這些網(wǎng)站的一些特征,比如說(shuō)網(wǎng)站分類信息、網(wǎng)站rank相關(guān)信息等。第二個(gè)是針對(duì)的正文的分詞的結(jié)果。
整個(gè)的正排索引,就是以doc為key,以屬性和word列表為value的一種結(jié)構(gòu)。因?yàn)橛脩粼跈z索時(shí)是以word為key來(lái)做檢索的,我們希望能夠把正排索引轉(zhuǎn)化成一種結(jié)構(gòu),來(lái)適應(yīng)用戶的檢索,所以我們把正排索引轉(zhuǎn)化成了以word為key,以doclist為value的一種結(jié)構(gòu),這個(gè)結(jié)構(gòu)能夠給用戶提供高效的檢索。這就是我們所謂的倒排索引。
檢索模型
上面簡(jiǎn)單地介紹了搜索引擎的工作過(guò)程及基本概念,那下面我們講一下,站在用戶檢索的角度來(lái)說(shuō),如何來(lái)設(shè)計(jì)一個(gè)搜索引擎,它的檢索模型是什么樣的?
1、query分析
首先要做的就是針對(duì)用戶輸入的query進(jìn)行query分析。query分析基本包涵三點(diǎn):確定檢索的粒度、Term屬性分析、Query需求分析。
確定檢索的粒度
所謂確定檢索粒度,就是分詞的粒度。我們會(huì)提供標(biāo)準(zhǔn)的分詞,以及短語(yǔ)、組合詞。針對(duì)不同的分詞粒度返回的網(wǎng)頁(yè)集合是不一樣的。標(biāo)準(zhǔn)分詞粒度越小,返回的結(jié)果越多,從中拿到優(yōu)質(zhì)結(jié)果的能力就越低。而短語(yǔ)和組合詞本身就是一個(gè)精準(zhǔn)的檢索組合,相對(duì)的拿到的網(wǎng)頁(yè)集合的質(zhì)量就會(huì)高一些。
Term屬性分析
這一塊主要是涉及到兩個(gè)點(diǎn)。
第一個(gè)點(diǎn)就是query中每一個(gè)詞的term weight(權(quán)重)。權(quán)重是用來(lái)做什么的?每一個(gè)用戶的query它本身都有側(cè)重點(diǎn)。舉個(gè)例子,比如“北京長(zhǎng)城”這個(gè)query,用戶輸入這個(gè)詞搜索的時(shí)候其實(shí)他想搜的是長(zhǎng)城,北京只是長(zhǎng)城的一個(gè)限定詞而已,所以說(shuō)在term weight計(jì)算的時(shí)候,長(zhǎng)城是作為一個(gè)主詞來(lái)推薦的。即使query只搜長(zhǎng)城也會(huì)返回一個(gè)符合用戶預(yù)期的結(jié)果,但是如果只搜北京的話,是不可能返回用戶預(yù)期的結(jié)果的。
第二個(gè)就是term本身的一些緊密性。緊密性代表用戶輸入的query的一些關(guān)聯(lián)關(guān)系。舉個(gè)明顯的例子,有些query是具有方向性的,比如說(shuō)北京到上海的機(jī)票怎么買?多少錢?這本身是有方向性的語(yǔ)義。
Query需求分析
針對(duì)query本身我們要分析用戶的意圖是什么?當(dāng)然也包括一些時(shí)效性的特征。舉個(gè)例子,比如說(shuō)“非誠(chéng)勿擾”這個(gè)詞,它有電影也有綜藝節(jié)目。
如果說(shuō)能夠分析出用戶本身他是想看電影還是看綜藝節(jié)目,我們就會(huì)給用戶反饋一個(gè)更優(yōu)質(zhì)的結(jié)果,來(lái)滿足用戶的需求。
query分析這里我主要做了一個(gè)簡(jiǎn)單的介紹,query分析涉及到的一些算法的東西,可能以后有機(jī)會(huì)再具體分享,這里先不做介紹。
2、查詢策略
查詢策略覆蓋的工具就是我們整個(gè)引擎架構(gòu)所要做的工作。查詢策略主要包括四個(gè)方面的工作:檢索資源、確定相關(guān)網(wǎng)頁(yè)集合、結(jié)果相關(guān)性計(jì)算、重查策略。
檢索資源
所謂檢索資源就是我們從互聯(lián)網(wǎng)上拿到的網(wǎng)頁(yè)。從互聯(lián)網(wǎng)上能拿到的網(wǎng)頁(yè),大概是萬(wàn)億規(guī)模,如果說(shuō)我們把所有網(wǎng)頁(yè)拿過(guò)來(lái),然后做建庫(kù)做索引,在用戶層面檢索,從量級(jí)上來(lái)說(shuō)是不太現(xiàn)實(shí)的。因?yàn)樗枰芏嗟臋C(jī)器資源,包括一些服務(wù)資源,另外我們從這么大一個(gè)集合里面來(lái)選取符合用戶需求的數(shù)據(jù),代價(jià)也是很大的。所以說(shuō)我們會(huì)對(duì)整個(gè)檢索資源做一個(gè)縮減,也就是說(shuō)我們會(huì)針對(duì)互聯(lián)網(wǎng)上所有的抓取過(guò)的網(wǎng)頁(yè),做一個(gè)質(zhì)量篩選。
質(zhì)量篩選出結(jié)果之后,我們還會(huì)對(duì)網(wǎng)頁(yè)做一個(gè)分類。我們拿到陌生的網(wǎng)頁(yè),會(huì)根據(jù)它本身的站點(diǎn)的權(quán)威性,網(wǎng)站本身的內(nèi)容質(zhì)量做打分。然后我們會(huì)對(duì)網(wǎng)頁(yè)分類,標(biāo)記高質(zhì)量的網(wǎng)頁(yè),普通網(wǎng)頁(yè),時(shí)效性的一個(gè)網(wǎng)頁(yè),這樣的話在用戶檢索的時(shí)候我們會(huì)優(yōu)先選擇高質(zhì)量的網(wǎng)頁(yè)返回給用戶。當(dāng)然從另外一個(gè)維度來(lái)講,我們也會(huì)從內(nèi)容上進(jìn)行分類,就是說(shuō)每個(gè)網(wǎng)頁(yè)的title和qanchor信息,也就是錨文本信息,是對(duì)整篇文章的一個(gè)描述信息,也代表文章的主體。如果我們優(yōu)先拿title和anchor信息作為用戶的召回的一個(gè)相關(guān)url集合,那它準(zhǔn)確性要比從正文拿到的結(jié)果質(zhì)量要高。當(dāng)然我們也會(huì)保留這種信息來(lái)提升它的召回的量。這是檢索要準(zhǔn)備的檢索資源這一塊。
確定相關(guān)網(wǎng)頁(yè)集合
這一塊的話基本上可以分為兩點(diǎn)。
一個(gè)是整個(gè)query切分后的 term命中,能夠命中query當(dāng)然非常好,因?yàn)樗軌蚍磻?yīng)相關(guān)數(shù)據(jù),正常情況下,網(wǎng)站和用戶query相關(guān)性是非常高的。
但是也會(huì)存在這樣問(wèn)題,所有的query全命中有可能返回網(wǎng)站數(shù)量不夠,我們這時(shí)候就需要做一些term部分命中的一些策略。前面query分析中講到了term weight的概念,我們可能會(huì)選擇一些term weight比較重要的term來(lái)作為這次召回結(jié)果的一個(gè)term。整個(gè)確定相關(guān)網(wǎng)頁(yè)集合的過(guò)程,就是一個(gè)求交計(jì)算的過(guò)程,后面我會(huì)再詳細(xì)介紹。
結(jié)果相關(guān)性計(jì)算
我們拿到了相關(guān)的網(wǎng)頁(yè)之后,會(huì)做一個(gè)打分,打分就是所說(shuō)的結(jié)果相關(guān)性計(jì)算。我這里列舉了兩個(gè)最基礎(chǔ)的計(jì)算。第一個(gè)是基礎(chǔ)權(quán)值的計(jì)算,針對(duì)每個(gè)term和文章本身的相關(guān)性的信息。第二個(gè)就是term緊密度計(jì)算,也就是整個(gè)query里面的term在文章中的分布情況。
重查策略
為什么有重查策略,就是因?yàn)樵谟脩魴z索過(guò)程中有可能返回的結(jié)果比較少,也有可能返回給用戶的結(jié)果質(zhì)量比較低,最差的就是結(jié)果不符合用戶的真正意圖。我們可能通過(guò)以下三個(gè)方式來(lái)解決這個(gè)問(wèn)題,一是增加檢索資源來(lái)拿到更多的結(jié)果;而是通過(guò)更小粒度的term,減掉一些不重要的term來(lái)拿到的結(jié)果,還有我們可能也會(huì)做一些query的改寫以及query的擴(kuò)展,來(lái)滿足用戶的意圖。
從整個(gè)檢索模型可以看到,我們要做的工作首先是query分析;第二我們需要把檢索資源提前準(zhǔn)備好,那就是所謂的索引;第三點(diǎn)是在一個(gè)query過(guò)來(lái)之后,我們通過(guò)求交計(jì)算確定相關(guān)的網(wǎng)頁(yè)集合,然后通過(guò)相關(guān)性計(jì)算,把優(yōu)質(zhì)的集合返回給用戶,最后如果結(jié)果不滿足用戶要求的話,我們可以做一個(gè)重查。
這個(gè)檢索模型,就是我們360搜索設(shè)計(jì)的一個(gè)基礎(chǔ)。
下面我介紹一下360搜索這種百億級(jí)網(wǎng)頁(yè)的搜索引擎的關(guān)鍵技術(shù)。我這里主要介紹離線建庫(kù)和在線檢索兩個(gè)核心模塊。
離線建庫(kù)和在線檢索
1、離線建庫(kù)
首先離線建庫(kù)這一塊,我們要有一些基礎(chǔ)設(shè)施,主要有三部分:Hbase/HDFS、Map-reduce、Storm/Kaka。
第一個(gè)是Hbase和HDFS。我們的網(wǎng)頁(yè)量級(jí)很大,我們會(huì)把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)抓取過(guò)來(lái)存到Hbase庫(kù)里,我們也會(huì)把我們提供檢索的網(wǎng)頁(yè)存到Hbase庫(kù)里面。為什么用Hbase呢,因?yàn)镠base是一個(gè)面向分布式,并支持列存儲(chǔ)的。支持列存儲(chǔ)這一點(diǎn)對(duì)我們很重要,因?yàn)槲覀兯械木W(wǎng)頁(yè)在抓取的過(guò)程中,包括rank同學(xué)在做rank計(jì)算的過(guò)程中,都會(huì)做一些部分更新,就是按照他們所需要的數(shù)據(jù)進(jìn)行更新,那列存儲(chǔ)就很容易滿足我們的需求。HDFS 主要用于建索引和存儲(chǔ)產(chǎn)出的索引文件,這些都是落地?cái)?shù)據(jù),啟動(dòng)了和線上更新銜接的作用(線上從HDFS拉取數(shù)據(jù))。
當(dāng)然我們的搜索引擎也會(huì)涉及到時(shí)效性的問(wèn)題,特別是突發(fā)時(shí)效性,可能會(huì)也需要有實(shí)時(shí)計(jì)算模型。我們目前的話也基于Storm,當(dāng)然還有我們自己內(nèi)部在做的一些實(shí)時(shí)性的開(kāi)發(fā)項(xiàng)目。
整個(gè)離線建庫(kù)主要的核心點(diǎn)有三個(gè)部分:
第一個(gè)就是索引劃分。所謂索引劃分,百億級(jí)的網(wǎng)頁(yè)我們不可能用一個(gè)數(shù)據(jù)庫(kù)就表示出來(lái),即使我們能表示出來(lái)一點(diǎn),也沒(méi)有這么大的機(jī)器來(lái)提供這樣一個(gè)磁盤存放這些數(shù)據(jù),因?yàn)樗饕蟾攀菐譖的一個(gè)量級(jí)。所以說(shuō)我們需要把索引劃分成小的網(wǎng)頁(yè)集合,然后再針對(duì)小的網(wǎng)頁(yè)集合做索引庫(kù),在小的網(wǎng)頁(yè)集合的基礎(chǔ)上和線上的在線服務(wù)做一個(gè)一一對(duì)應(yīng)的關(guān)系。
第二點(diǎn)是索引創(chuàng)建。索引創(chuàng)建這一塊基本上是基于Map-reduce跑的批量任務(wù)。因?yàn)槲覀兩习賰|的網(wǎng)頁(yè)需要跑下來(lái)的話,可能需要的資源很多,時(shí)間也會(huì)拉得很長(zhǎng),Map-reduce本身提供了分布式計(jì)算的機(jī)制,能夠滿足我們的需求。
第三點(diǎn)是索引更新。這一塊主要涉及到的一是我們每天新抓過(guò)來(lái)的數(shù)據(jù);二是rank的同學(xué)要做線上特征,或者屬性的一些迭代計(jì)算,要更新到線上。所以說(shuō)也會(huì)涉及到百億級(jí)別的數(shù)據(jù)的索引更新。
2、在線檢索
在線檢索的基礎(chǔ)設(shè)施有三部分:分布式服務(wù)、請(qǐng)求廣播、負(fù)載均衡。
分布式的服務(wù)框架是在線檢索的一個(gè)基礎(chǔ)配件;
在索引劃分的時(shí)候,我們會(huì)把大的網(wǎng)頁(yè)集合換成小的集合,在提供檢索的時(shí)候,我們會(huì)以廣播的方式來(lái)廣播到各個(gè)小的索引單元,收集所有符合預(yù)期的網(wǎng)頁(yè)集合才能夠把它做歸并排序,選出最優(yōu)數(shù)據(jù);
在線檢索服務(wù)我們需要考慮更多的還有系統(tǒng)本身的穩(wěn)定性,這個(gè)主要靠負(fù)載均衡來(lái)保證。
在線檢索里面最底層的兩個(gè)核心模塊是求交計(jì)算和基礎(chǔ)相關(guān)性計(jì)算。
架構(gòu)
我會(huì)通過(guò)下面這個(gè)圖給大家大概講解一下搜索引擎整體架構(gòu)的流程。
首先我們先從官網(wǎng)上抓取網(wǎng)頁(yè),抓取的網(wǎng)頁(yè)會(huì)存到基于Hbase的網(wǎng)頁(yè)庫(kù)里。這個(gè)是一個(gè)萬(wàn)億量級(jí)的網(wǎng)頁(yè)庫(kù),下一步要做的工作是質(zhì)量篩選,然后我們會(huì)把通過(guò)質(zhì)量篩選的網(wǎng)頁(yè)放到我們的索引網(wǎng)頁(yè)庫(kù)中,所有的建庫(kù),包括rank計(jì)算,以及所有與搜索引擎相關(guān)的部分都是依賴于下邊的網(wǎng)頁(yè)索引庫(kù)進(jìn)行的。我們?cè)诮ㄋ饕臅r(shí)候,會(huì)做一個(gè)分片處理,分片的機(jī)制采用了區(qū)間劃分。那么區(qū)間劃分基本上我們就是用md5作為Key,本身md5是64位的整數(shù),按照這64位整數(shù)的范圍作為一個(gè)區(qū)間劃分。從url轉(zhuǎn)換上md5它本身是均勻分布的,那我們分片按照這個(gè)區(qū)間劃分也會(huì)是均勻的,實(shí)際上我們劃分的各個(gè)索引節(jié)點(diǎn)的量級(jí)也是均等的。進(jìn)行分片之后,我們會(huì)針對(duì)每個(gè)分片基于Map-reduce來(lái)跑,生成索引,索引主要包括上面講的正排索引和倒排索引。然后會(huì)把索引推送到下面的在線服務(wù)推薦,每個(gè)在線服務(wù)推薦負(fù)責(zé)一個(gè)索引庫(kù)。這里可以看到,我們根據(jù)網(wǎng)頁(yè)的類型對(duì)索引庫(kù)也做了一個(gè)劃分,比如說(shuō)重要網(wǎng)頁(yè)索引庫(kù)和普通網(wǎng)頁(yè)索引庫(kù)。
還有一個(gè)問(wèn)題,就是我們每天的新增的網(wǎng)站,超過(guò)我們實(shí)時(shí)的網(wǎng)頁(yè)怎么辦?這種情況我們會(huì)走另外一個(gè)流程,在網(wǎng)頁(yè)抓取過(guò)來(lái)之后,也會(huì)有一個(gè)質(zhì)量篩選,這個(gè)質(zhì)量篩選有2個(gè)流程,第一個(gè)是實(shí)時(shí)計(jì)算,通過(guò)我們剛才講到的Storm集群,包括我們目前公司內(nèi)部的Titan集群,進(jìn)行實(shí)時(shí)計(jì)算來(lái)生成實(shí)時(shí)性的索引。第二個(gè)是我們會(huì)把每天更新的這些數(shù)據(jù)做批量計(jì)算,基于Map-reduce生成一個(gè)相互索引,這樣的話在時(shí)間上能夠覆蓋到所有的時(shí)間點(diǎn)。
整個(gè)離線建庫(kù)基本是這樣一個(gè)流程,下面介紹一下在線檢索的模塊。用戶檢索過(guò)來(lái)之后,我們首先做一個(gè)query分析。然后我們把query分析的結(jié)果扔給分布式服務(wù)的一個(gè)請(qǐng)求節(jié)點(diǎn),這個(gè)請(qǐng)求節(jié)點(diǎn)通過(guò)廣播的方式會(huì)把請(qǐng)求廣播到這幾種索引庫(kù)這里。在索引庫(kù)內(nèi)部會(huì)做一些求交計(jì)算。第二步我們會(huì)做基礎(chǔ)相關(guān)性的計(jì)算,然后把優(yōu)質(zhì)結(jié)果的Top N 來(lái)返回給上層的服務(wù)請(qǐng)求節(jié)點(diǎn)。服務(wù)請(qǐng)求節(jié)點(diǎn)還會(huì)做一些策略,比如說(shuō)用戶的一些特定需求,包括一些機(jī)器學(xué)習(xí)的排序,最終返回給用戶的網(wǎng)頁(yè)基本上是幾百條的一個(gè)量級(jí)。
整個(gè)架構(gòu)流程是就是這樣的模式。下面我會(huì)具體講一下我們重點(diǎn)的一些核心模塊的設(shè)計(jì)。
我先講一下網(wǎng)頁(yè)索引組織模式,也就是正排索引和倒排索引是怎么組織的。
正排索引
我們要用正排索引,首先要考慮的第一個(gè)問(wèn)題,就是如何支持獨(dú)立更新?為什么要做獨(dú)立更新,是因?yàn)槲覀價(jià)ank的同學(xué)在做任何數(shù)據(jù)挖掘,包括一些特征計(jì)算的時(shí)候,每天都有新的迭代出現(xiàn),這樣的話他就需要正排索引能夠支持這種天級(jí)的更新,甚至支持小時(shí)級(jí)的更新。所以我們希望正排索引能夠設(shè)計(jì)得足夠簡(jiǎn)單,也足夠獨(dú)立。我們這塊所有的設(shè)計(jì)依賴的主要是每個(gè)索引庫(kù)的url列表。url列表中它的位置就代表doc id,數(shù)據(jù)屬性的存儲(chǔ)會(huì)按照固定長(zhǎng)度的數(shù)據(jù)塊存放在數(shù)據(jù)文件中。數(shù)據(jù)塊的下方位置就是它對(duì)應(yīng)的doc id信息。這樣在更新和查找的過(guò)程中,我們只需要知道它的doc id,就很容易找到它所在的位置。這樣的好處第一是容易生成索引文件;第二個(gè)是可以按照自己的要求進(jìn)行更新。
我們還要考慮另外一個(gè)問(wèn)題,就是有一些算法資源挖出來(lái)的特征,并不是包含了所有的信息。比如說(shuō)有一些團(tuán)購(gòu)網(wǎng)站、美食介紹網(wǎng)站里面,會(huì)有一些位置信息,但這些是稀疏的信息,不可能按照這種固定長(zhǎng)度,每個(gè)url都會(huì)分配一個(gè)數(shù)據(jù)塊,這樣會(huì)造成大量的資源浪費(fèi)。所以我們這里會(huì)針對(duì)這種稀疏的屬性做一個(gè)變長(zhǎng)的數(shù)據(jù)塊,但是它在結(jié)構(gòu)上發(fā)生了變化,它有一個(gè)頭信息。頭信息主要是用來(lái)存儲(chǔ)它在數(shù)據(jù)文件里面的位置信息,整個(gè)頭信息和url列表是一 一對(duì)應(yīng)的,本身它里面存的就是屬性信息,這樣的話我們?cè)偻ㄟ^(guò)他的doc id直接找到他的偏移,然后通過(guò)偏移很容易找到它的屬性。
倒排索引
倒排索引我們也需要考慮兩個(gè)問(wèn)題,第一個(gè)問(wèn)題,從正排索引轉(zhuǎn)化為倒排,數(shù)據(jù)量會(huì)劇增,因?yàn)槲覀兠嫦虻氖且粋€(gè)word對(duì)應(yīng)的doc list,doc list重復(fù)度非常高,這樣的話我們就需要針對(duì)倒排索引進(jìn)行一個(gè)壓縮。
壓縮的話我們采用的原則基本是壓縮比例越多越好;解壓時(shí)越快越好。這就需要對(duì)整個(gè)倒排表做一個(gè)結(jié)構(gòu)化的設(shè)計(jì)。我們采取的做法是把整個(gè)倒排表劃分成多個(gè)塊,針對(duì)每一個(gè)塊通過(guò)一些壓縮算法做壓縮。整個(gè)倒排表劃分成塊之后,檢索的時(shí)候,也需要按照這種塊的模式來(lái)進(jìn)行解壓,所以只要解壓到的塊能夠滿足用戶的需求,那下面的塊就不用再解壓了,這樣的話就能減少解壓的成本。
一個(gè)用戶檢索的請(qǐng)求過(guò)來(lái)之后,我們希望檢索能越快越好,所以我們希望能夠提供一個(gè)范圍查找。我們會(huì)設(shè)立一個(gè)段,每個(gè)段會(huì)記錄每一個(gè)動(dòng)態(tài)表塊的最小的id和最大的id來(lái)表示范圍。那這樣的話我們?cè)跈z索一個(gè)倒排list的過(guò)程中,就先可以先檢索段,通過(guò)段找到它的在哪個(gè)塊, 再做檢索。整個(gè)倒排索引組成了一個(gè)四級(jí)結(jié)構(gòu),第一個(gè)就是它本身的詞表,第二個(gè)是段信息,第三個(gè)是倒排表,第四個(gè)是針對(duì)每個(gè)word在某個(gè)doc里面一些位置信息,這個(gè)信息主要是用來(lái)做基礎(chǔ)相關(guān)性計(jì)算的。
求交模型
我們下面講一下,在檢索的過(guò)程中,求交計(jì)算是怎么做的?
求交是檢索一個(gè)非常核心的模塊,也是對(duì)檢索性能提出非常大要求的一個(gè)模塊。我簡(jiǎn)單地舉一個(gè)例子來(lái)給大家講一下整個(gè)求交模塊的設(shè)計(jì)。
比如用戶query是由三個(gè)詞來(lái)組成的,在求交過(guò)程中,首先要從這三個(gè)word中選出拉鏈最短的一個(gè)word。因?yàn)橛米疃痰睦溔ズ推渌溓蠼唬瑫?huì)減少求交次數(shù)。
第二步,我們拿到最短拉鏈之后,比如現(xiàn)在word 1的拉鏈?zhǔn)亲疃痰?,那我們?huì)依次建立word 1的倒排拉鏈,從倒排拉鏈中獲得每個(gè)doc id和其他倒排拉鏈的doc id做求交計(jì)算。我拿doc id=11這個(gè)來(lái)給大家解釋一下求交的具體步驟。比如說(shuō)倒排拉鏈里面有11這個(gè)word,那在倒排拉鏈里,我們首先要查找的是它的段信息。我們發(fā)現(xiàn)它是在第二個(gè)段里面,就能夠很明確地知道它在word 2的第二個(gè)倒排拉鏈的數(shù)據(jù)塊,找到這個(gè)塊之后,我們?cè)僮龆植檎?,因?yàn)槲覀冊(cè)谧鏊饕臅r(shí)候,doc list 的信息有序的。做二分查找來(lái)獲取它是比較穩(wěn)定的。
當(dāng)然我們?cè)谧龆植檎业倪^(guò)程中,也會(huì)做一些優(yōu)化處理,就是一些步長(zhǎng)策略。什么是步長(zhǎng)策略?我舉個(gè)例子,如果我們要查找6倍的doc id。如果我們只做二分查找的話,我們大概要做4次 query查找才能找到這個(gè)doc id。所以我們希望有些策略來(lái)補(bǔ)充二分查找的不足,這就是步長(zhǎng)策略。第一步我們先做一次查找,比如查找6這個(gè)doc id會(huì)分布在1到7的范圍之內(nèi)。然后我們會(huì)通過(guò)1和7的邊界信息來(lái)進(jìn)一步計(jì)算它到6的距離。通過(guò)計(jì)算我們可以看到7到6就是一個(gè)步長(zhǎng),而1到6是五個(gè)步長(zhǎng)。在這種情況下我們會(huì)改變策略,也就是我們會(huì)通過(guò)一個(gè)步長(zhǎng)就找到6這個(gè)信息。當(dāng)然這是一個(gè)非常極端的例子。我想通過(guò)這個(gè)例子說(shuō)明,只要距離它的邊界比較近的時(shí)候,我們就會(huì)轉(zhuǎn)換這種步長(zhǎng)策略,來(lái)提升query查找的性能。
基礎(chǔ)相關(guān)性
下面我給大家簡(jiǎn)單介紹下基礎(chǔ)相關(guān)性。這也是整個(gè)檢索的一個(gè)核心部分,對(duì)檢索來(lái)說(shuō),它也是比較耗時(shí)的一個(gè)模塊。相關(guān)性計(jì)算它不可能把非常多的策略相關(guān)的信息都拿來(lái)計(jì)算,這樣會(huì)影響底層收集數(shù)據(jù)的性能。我們這里主要做了兩個(gè)方面的工作,一是基礎(chǔ)賦權(quán),二是緊密度計(jì)算。
1、基礎(chǔ)賦權(quán)
什么是基礎(chǔ)賦權(quán)?它是來(lái)解決query中的每一個(gè)term和它對(duì)應(yīng)的文章的權(quán)重計(jì)算。
這里先介紹TF和IDF這兩個(gè)概念。
一個(gè)技術(shù)的模型,就是TF*IDF。但是在實(shí)際的應(yīng)用中不會(huì)只有這么簡(jiǎn)單,還會(huì)出現(xiàn)很多問(wèn)題。比如一篇文章很長(zhǎng),那么它的TF就不會(huì)太準(zhǔn)?,F(xiàn)在業(yè)界也有一個(gè)模型叫BM25,它主要加入了文章長(zhǎng)度,和這個(gè)詞語(yǔ)的term weight的一些概念。
我們?nèi)绻脒_(dá)到更好的效果的話,那么就要在數(shù)據(jù)挖掘上做一些工作。比如說(shuō)我們需要挖掘出每篇文章的主題、關(guān)鍵詞,以及關(guān)鍵詞的一些限定詞這些信息,這樣可以針對(duì)term做一個(gè)分級(jí),拿到詞性信息,這樣可以更容易、更準(zhǔn)確地來(lái)描述這個(gè)word對(duì)文章的權(quán)重信息。
2、緊密度計(jì)算
所謂緊密度計(jì)算就是用戶的query過(guò)來(lái)之后,針對(duì)query的分詞,一是相鄰word之間的緊密程度在文章中是怎樣的分布;二是跨term的信息,那也就是方向的信息。
可以簡(jiǎn)單理解為我要算的就是一個(gè)距離問(wèn)題。我這里列了一個(gè)簡(jiǎn)單的具體的模型。我們首先在query中選一個(gè)詞作為中心點(diǎn),比如B。然后我們拿text文本的位置信息減去query的位置信息,然后再通過(guò)中心點(diǎn)的一個(gè)計(jì)算,算出它的相對(duì)位置。比如說(shuō)A這個(gè)term本身它的距離像1這個(gè)位置,當(dāng)然就是說(shuō)他后邊A的距離在算的過(guò)程中,你會(huì)發(fā)現(xiàn)因?yàn)樗窃贐的后面,他的距離可能就會(huì)拉長(zhǎng),這樣的話它解決的是一個(gè)方向性的問(wèn)題。(參考: proximity距離)
在后面A的距離大概是4。所以針對(duì)距離變長(zhǎng)的這種情況我們會(huì)做一些打壓?;A(chǔ)相關(guān)性是檢索的一個(gè)基礎(chǔ)。當(dāng)然在基礎(chǔ)相關(guān)性的基礎(chǔ)上,我們會(huì)把優(yōu)質(zhì)的網(wǎng)頁(yè)集合拿到上層,上層也會(huì)做一些rank的計(jì)算。大家可能有的了解比如這種LTR模型來(lái)做一些排序的計(jì)算,當(dāng)然也會(huì)有一些針對(duì)用戶策略,包括用戶意圖的一些策略來(lái)打分。最終返回用戶一個(gè)豐富的結(jié)果集。
其他相關(guān)技術(shù)點(diǎn)
前面我基本介紹了360搜索的核心模塊以及關(guān)鍵技術(shù)。當(dāng)然搜索還涉及很多其他的技術(shù)點(diǎn),比如:
以上就是360搜索引擎架構(gòu)的整體設(shè)計(jì)以及關(guān)鍵技術(shù)。
關(guān)于360技術(shù)
360技術(shù)是360技術(shù)團(tuán)隊(duì)打造的技術(shù)分享公眾號(hào),每天推送技術(shù)干貨內(nèi)容
更多技術(shù)信息歡迎關(guān)注“360技術(shù)”微信公眾號(hào)