360搜索:支撐百億級(jí)網(wǎng)頁(yè)搜索引擎的架構(gòu)筛圆!

奇技指南
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)褒搔。

image

目前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è)模塊:

  1. 如何設(shè)計(jì)搜索引擎

  2. 百億級(jí)網(wǎng)頁(yè)計(jì)算關(guān)鍵技術(shù)

  3. 網(wǎng)頁(yè)索引組織模式

  4. 網(wǎng)頁(yè)檢索和相關(guān)性

首先從如何設(shè)計(jì)一個(gè)搜索引擎講起趣倾。

基礎(chǔ)檢索

一個(gè)用戶請(qǐng)求過(guò)來(lái)之后誊酌,整個(gè)搜索引擎的工作流程大致如下:

image

首先用切詞組件做分詞碧浊,把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)單的介紹记舆。

image

什么是正排索引御蒲?我們從互聯(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è)搜索引擎鞍泉,它的檢索模型是什么樣的咖驮?

image

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é)目氏堤。

image
image

如果說(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è)核心模塊疤剑。

image

離線建庫(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)的流程。

image

首先我們先從官網(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è)索引組織模式慕爬,也就是正排索引和倒排索引是怎么組織的澡罚。

正排索引

image

我們要用正排索引留搔,首先要考慮的第一個(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ò)偏移很容易找到它的屬性蕾哟。

倒排索引

image

倒排索引我們也需要考慮兩個(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ì)算是怎么做的酗洒?

image

求交是檢索一個(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)

image

什么是基礎(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ì)算

image

所謂緊密度計(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ù)皆刺。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浓瞪,老刑警劉巖英岭,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈莺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事示绊∨惹希” “怎么了墨坚?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鞍时,是天一觀的道長(zhǎng)笙僚。 經(jīng)常有香客問(wèn)我栋猖,道長(zhǎng)全陨,這世上最難降的妖魔是什么枢舶? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任颅拦,我火速辦了婚禮绍移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己弧蝇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布删顶。 她就那樣靜靜地躺著录粱,像睡著了一般脂凶。 火紅的嫁衣襯著肌膚如雪嘶居。 梳的紋絲不亂的頭發(fā)上佑吝,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天是尔,我揣著相機(jī)與錄音痕囱,去河邊找鬼弦悉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛充边,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼畔柔!你這毒婦竟也來(lái)了玄捕?” 一聲冷哼從身側(cè)響起福也,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忧风,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后英遭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贤斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝙砌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剃执,靈堂內(nèi)的尸體忽然破棺而出遣耍,到底是詐尸還是另有隱情难审,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站架曹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厕宗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混稽,春花似錦、人聲如沸烛卧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)充尉。三九已至驼侠,卻和暖如春笋熬,著一層夾襖步出監(jiān)牢的瞬間糖耸,已是汗流浹背审丘。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捶枢,地道東北人握截。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烂叔,于是被迫代替她去往敵國(guó)和親谨胞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在這兒工作第五年牢裳,簡(jiǎn)單說(shuō)一下,我的工作是叶沛,在我們城市一所大學(xué)餐廳做著一個(gè)窗口蒲讯,生意一般,每月收入養(yǎng)車養(yǎng)自己后灰署,...
    木一依閱讀 246評(píng)論 2 1
  • 你曾對(duì)我的身體著迷 天天冒著被拍死的危險(xiǎn) 和我肌膚相親 血脈相連 我卻對(duì)你深惡痛絕 面對(duì)痛癢難忍的痕跡 便想和你 ...
    千尹閱讀 3,118評(píng)論 81 93
  • 好久沒(méi)這么沉浸下來(lái)寫300字了判帮,日更的那些日子,不管多累溉箕,都還是要啰嗦幾句脊另,算是一些說(shuō)給自己的話,有些激勵(lì)...
    小小亂語(yǔ)閱讀 333評(píng)論 0 2