奇技指南
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ì)搜索引擎
百億級(jí)網(wǎng)頁(yè)計(jì)算關(guān)鍵技術(shù)
網(wǎng)頁(yè)索引組織模式
網(wǎng)頁(yè)檢索和相關(guān)性
首先從如何設(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í)性的開發(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è)概念。
TF:代表承載信息量,即這個(gè)word在文章中出現(xiàn)的次數(shù);
IDF:代表信息承載能力,即這個(gè)word在全網(wǎng)的出現(xiàn)次數(shù)
一個(gè)技術(shù)的模型姐呐,就是TF*IDF。但是在實(shí)際的應(yīng)用中不會(huì)只有這么簡(jiǎn)單,還會(huì)出現(xiàn)很多問(wèn)題。比如一篇文章很長(zhǎng),那么它的TF就不會(huì)太準(zhǔn)。現(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ì)做一些打壓〖缒疲基礎(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é)果集。
前面我基本介紹了360搜索的核心模塊以及關(guān)鍵技術(shù)。當(dāng)然搜索還涉及很多其他的技術(shù)點(diǎn),比如:
時(shí)效性
機(jī)群資源優(yōu)化
檢索性能
Cache系統(tǒng)
系統(tǒng)穩(wěn)定性
大數(shù)據(jù)實(shí)時(shí)計(jì)算
以上就是360搜索引擎架構(gòu)的整體設(shè)計(jì)以及關(guān)鍵技術(shù)皆刺。