無源之水太雨,無本之木

大家都知道"巧婦難為無米之炊",同樣對于搜索引擎而言魁蒜,沒有了輸入內(nèi)容這個“米”囊扳,“炊”自然也是無從談起吩翻。不過首先我們來看看搜索引擎作為一個系統(tǒng),它大概長什么樣子宪拥。

搜索引擎框架

這個圖展示了搜索引擎的框架仿野,其實大部分的檢索系統(tǒng)都采用類似的邏輯架構(gòu),所以我們可以把搜索引擎看作是一個超大型圖書文獻檢索系統(tǒng)她君。(插播一個八卦:百度的李彥宏在大學時候的專業(yè)是圖書館系古典文學編目脚作。)如圖,系統(tǒng)通過“數(shù)據(jù)獲取”模塊從互聯(lián)網(wǎng)上汲取網(wǎng)頁信息缔刹,然后發(fā)送給后臺“數(shù)據(jù)加工”模塊進行索引再存入數(shù)據(jù)庫球涛。在右邊面向用戶端,系統(tǒng)通過搜索框入口獲取用戶需要檢索的信息校镐,并轉(zhuǎn)發(fā)給檢索服務器亿扁,檢索服務器按照一定規(guī)則再從數(shù)據(jù)庫中抽取匹配信息返還給用戶。從頂層設計上來看鸟廓,搜索引擎不是很復雜从祝,而我們要做的就是實現(xiàn)其中每一個模塊的技術(shù)細節(jié)。

本篇的重點我將談談圖中的“數(shù)據(jù)獲取”模塊引谜,即如何處理搜索引擎的輸入源數(shù)據(jù)牍陌,也就是解決“米”的問題。對于站內(nèi)搜索引擎而言员咽,這個的問題是比較容易解決的毒涧。原因是網(wǎng)站可以直接索引站點自身的內(nèi)容或者是用戶提交的內(nèi)容,這些對于網(wǎng)站的設計者而言都是可控的贝室。比如網(wǎng)站設計者可以在每提交一個頁面到服務器前契讲,先把頁面輸入到站內(nèi)搜索引擎,等搜索引擎索引完頁面后再進行發(fā)布滑频。又比如當用戶提交的內(nèi)容需要被檢索的時候捡偏,網(wǎng)站首先將這些內(nèi)容提交給站內(nèi)搜索引擎,等搜索引擎索引完后再提交用戶的內(nèi)容到數(shù)據(jù)庫中误趴。對于如何恰當?shù)仄胶庥脩趔w驗與系統(tǒng)索引耗時之間的關系是一門有趣的藝術(shù)霹琼,不同的網(wǎng)站設計者可能有不同的看法。

從技術(shù)上來說凉当,獲取一個網(wǎng)頁是相當容易的枣申,無論你使用哪種語言作為開發(fā)工具,它們一般都會提供類似http.get()這樣的方法看杭。讀者甚至也可以直接使用socket套接字忠藤。http協(xié)議從本質(zhì)上來說,只是使用socket套接字發(fā)送的一串文本而已楼雹∧:ⅲ可以任選如下2種方式來驗證這一點:

方法1:

手工使用socket套接字在本地搭建一個server尖阔,監(jiān)聽在3000端口,偽代碼:

main()

{

???????? socket_handle=socket('0.0.0.0','3000').bind();

???????? listen(socket_handle);

???????? new_socket = accept(socket_handle, data);

???????? printf(data);

???????? return();

}

使用你的編程工具完成上述的編碼后榨咐,運行一下介却。打開瀏覽器,在地址欄里輸入"http://127.0.0.1:3000"块茁,回車齿坷,看一下server程序在屏幕上的輸出。


方法2:

如果你有l(wèi)inux操作系統(tǒng)数焊,你可以使用netcat這個神奇的命令行工具永淌。netcat也提供windows的版本,但是需要額外下載佩耳。筆者使用suse的linux遂蛀,不同的linux在參數(shù)上可能略有差別。

在linux桌面模式下調(diào)出控制臺并輸入:

??? netcat -l -p 3000

然后打開瀏覽器干厚,在地址欄里輸入"http://127.0.0.1:3000"李滴,回車,看一下server程序在屏幕上的輸出蛮瞄。

如果你嘗試了上面任何一種方式悬嗓,會在控制臺上看到一個http的請求頭,一般它會是這樣的:


我不在這里過多地討論http協(xié)議的細節(jié)裕坊,讀者可以直接使用firefox或者chrome自帶的web開發(fā)者工具來看看瀏覽器發(fā)送到其他網(wǎng)站的實際報文頭。由于大部分現(xiàn)代的編程語言都會提供http協(xié)議的庫或者方法燕酷,我們就直接忽略它的具體實現(xiàn)籍凝,而把更多的精力放到更重要的內(nèi)容上,比如下載前系統(tǒng)要做些什么準備工作或者下載完成后系統(tǒng)接著該干些什么苗缩,諸如此類的饵蒂。

通常我們需要提供一些url種子鏈接作為搜索引擎的初始下載目標,之后要做的就是從下載到的網(wǎng)頁中解析出有價值的鏈接繼續(xù)新的下載酱讶,同時對有價值的文本并做進一步的索引處理退盯。這里主要涉及到如下幾個需要解決的問題:

1:互聯(lián)網(wǎng)上的網(wǎng)站數(shù)以千萬計,搜索引擎在搜索網(wǎng)站時泻肯,是應該以深度優(yōu)先呢渊迁,還是以廣度優(yōu)先?換句話說灶挟,是應該把一個網(wǎng)站的內(nèi)容全部檢索完后再進入下一個網(wǎng)站琉朽,還是應該盡量檢索不同的網(wǎng)站,在這個基礎上再考慮檢索深度的問題稚铣。

2:網(wǎng)站上的網(wǎng)頁箱叁,特別是中文網(wǎng)站上的網(wǎng)頁墅垮,除了包含自身的主題信息外,常常還含有大量的廣告信息耕漱,這些廣告對于用戶來說是毫無意義的算色。比如一個關于兒童皮膚問題的網(wǎng)頁上可能含有女性服裝的廣告,如果系統(tǒng)不能區(qū)分這個網(wǎng)頁是關于討論兒童皮膚的問題螟够,在用戶檢索女性服飾時灾梦,就會出現(xiàn)不相關的兒童皮膚問題的網(wǎng)頁鏈接。如何剔除網(wǎng)頁垃圾信息齐鲤,獲取有用的主題信息斥废,是一個好的搜索引擎必須考慮的事情。

3:當我們打算提供中文搜索服務時给郊,需要額外面對一個英語世界中不存在的問題牡肉,或者說英語的世界里這個問題是可以被忽略的,它就是“中文分詞”淆九。英語中語義是按單個字來表示的统锤,一個字表示一個意思,那么很自然地可以在系統(tǒng)中按單個字進行拆分索引炭庙。而中文常常是使用多個字的組合來表示一個意思饲窿,單個字本身并不能代表這個詞組的意思。比如“中文”這個詞組指的是中國人使用的文字或者語言焕蹄。單個字“中”和“文”逾雄,分別對應地理方位的正中間和文章,他們與“中文”的含義相去甚遠腻脏。所以我們在做搜索引擎的時候鸦泳,需要考慮如何來實現(xiàn)按詞組來構(gòu)建語義的中文分詞系統(tǒng)。

4:我們從網(wǎng)頁中獲取url鏈接時永品,難免會遇到已經(jīng)獲取過的鏈接做鹰,如果系統(tǒng)不能辨識這些冗余鏈接地址,就會造成重復勞動鼎姐,不僅浪費計算資源钾麸,最差情況下,系統(tǒng)會陷入無限循環(huán)處理同一個資源集合的深淵中炕桨。當鏈接地址上億級的時候饭尝,發(fā)現(xiàn)重復鏈接就變成了一個挑戰(zhàn)。

這幾個問題我會在后面專門的專題中進行講述谋作,現(xiàn)在假設這些問題都已經(jīng)解決了芋肠。我們來看看“數(shù)據(jù)獲取”模塊的實際實現(xiàn)。

數(shù)據(jù)獲取模塊

“HTTP進程調(diào)度”占據(jù)整個模塊的心臟地位遵蚜,它負責從“URL池管理器”處獲取有效URL鏈接帖池,然后調(diào)度起一個“http通信”進程去互聯(lián)網(wǎng)上拿URL對應的網(wǎng)頁奈惑,之后再把下載到的網(wǎng)頁發(fā)送給“網(wǎng)頁解析器”∷冢“網(wǎng)頁解析器”的主要工作是抽取網(wǎng)頁中的有效文字信息和有效URL鏈接地址肴甸,并分別發(fā)送給下一級的“數(shù)據(jù)加工”模塊和“URL池管理器”∏舭停“URL池管理器”解決我們前面提到的問題1和問題4原在。“網(wǎng)頁解析器”則是解決問題2彤叉。問題3則是留給下一級的“數(shù)據(jù)加工”去處理了庶柿。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秽浇,隨后出現(xiàn)的幾起案子浮庐,更是在濱河造成了極大的恐慌,老刑警劉巖柬焕,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件审残,死亡現(xiàn)場離奇詭異,居然都是意外死亡斑举,警方通過查閱死者的電腦和手機搅轿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富玷,“玉大人璧坟,你說我怎么就攤上這事∈昱常” “怎么了沸柔?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铲敛。 經(jīng)常有香客問我,道長会钝,這世上最難降的妖魔是什么伐蒋? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮迁酸,結(jié)果婚禮上先鱼,老公的妹妹穿的比我還像新娘。我一直安慰自己奸鬓,他們只是感情好焙畔,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著串远,像睡著了一般宏多。 火紅的嫁衣襯著肌膚如雪儿惫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天伸但,我揣著相機與錄音肾请,去河邊找鬼。 笑死更胖,一個胖子當著我的面吹牛铛铁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播却妨,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饵逐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彪标?” 一聲冷哼從身側(cè)響起倍权,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捐下,沒想到半個月后账锹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡坷襟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年奸柬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴程。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓奕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档叔,到底是詐尸還是另有隱情桌粉,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布衙四,位于F島的核電站铃肯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏传蹈。R本人自食惡果不足惜押逼,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惦界。 院中可真熱鬧挑格,春花似錦、人聲如沸沾歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挫望,卻和暖如春立润,著一層夾襖步出監(jiān)牢的瞬間袍患,已是汗流浹背币绩。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工玉掸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亿柑,地道東北人帚桩。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓捻悯,卻偏偏與公主長得像男旗,于是被迫代替她去往敵國和親球散。 傳聞我的和親對象是個殘疾皇子巨缘,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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

  • 搜索引擎優(yōu)化(Search engine optimization添忘,簡稱SEO),指為了提升網(wǎng)頁在搜索引擎自然搜索...
    翻滾吧海闊天空閱讀 4,004評論 5 14
  • Solr&ElasticSearch原理及應用 一若锁、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,285評論 1 17
  • 是風搁骑, 零落了秋的蕭瑟。 是夜又固, 渲染了晝的繁華仲器。 逝去的, 何止青春仰冠, 何止歲月乏冀! 還有那 璀璨的夕陽, 明媚的...
    王舍之閱讀 137評論 0 1
  • 沒有來大學之前洋只,憧憬過很多次自己的大學辆沦,可是這個大學生活模樣是沒有想到的,沒有想到自己改變這么多识虚。 一切的...
    this西瓜閱讀 378評論 0 1
  • 時過境遷。 轉(zhuǎn)眼間肛循,我已是高三的學子蛛株。 中秋佳節(jié)回鄉(xiāng)探望,獨自憑欄育拨,放眼過去,青蔥翠綠依舊欢摄。卻唯獨少了你那溫和的笑...
    vivid12607閱讀 305評論 0 0