基於Nutch和Hadoop的簡易搜索引擎

最近和寢室的同學一起搭建了Hadoop的集羣,實現了一個簡易的本地搜索引擎,並且將其開源到了github上:https://github.com/ifuding/search-1047,接下來的幾篇博文將對這個項目及其代碼作一些詳細的描述。

搜索原理概述

“搜索”,簡而言之就是要分析用戶輸入然後輸出給用戶已經排好序的URL集合。一個簡單的實現所需要的排序依據主要就是文本檢索以及url的PageRank值。

PageRank

PageRank算法有很多文章對其進行講解,其模型類似一個馬爾科夫鏈。如果一個高PageRank值的網頁1指向了另一個網頁2,則可以認爲網頁2的PageRank值也會相應的變高。
假設有n個src網頁指向一個target網頁,則我們認爲:
Pr[target]=1-dampFac+dampFac*sum{Pr[src]/OutlinkNum[src]}
其中,dampFac是爲了防止死鏈和陷阱的。
所謂死鏈就是所有的url指向了一個url,但是此url沒有出鏈,則最後所有網頁的Pr會收斂到0。如果此url有指向自己的循環,則最後除了此url其它url的Pr的值都會收斂到0。
所以在公式裏面加入了阻尼因子dampFac(取爲0.85),模擬上網者的真實行爲,即你一開始可以以1-dampFac的概率隨機進入此網頁,或者以dampFac的概率從其它網頁進入這個網頁,加入這個因子也可以防止用戶無限制地瀏覽(小於1的數的n次方趨近於0)。藉此避免以上兩種錯誤的收斂情況。

文本檢索

文本檢索有專門的NLP分析方法,在本項目中暫時採用簡單的文本匹配和計數技術。

Nutch爬蟲

Nutch的開發就是爲了搜索引擎,Hadoop最開始只是Nutch的一個子項目。
在此次的項目中我們沒有過多地關注Nutch的部分,只是使用了Nutch爬取的一部分輸出,準確的說是url的鏈接信息“linkdb”和網頁文本信息“parse_text”。因爲它們都是MapFile的文件格式,爲了更方便地作爲Mapper的輸入我們需要對以上文件做一些必要的轉換和腳本處理。

Hadoop

Hadoop實現了分佈式文件系統HDFS以及基於Mapreduce的分佈式計算。
當你在Linux下安裝好Hadoop,以僞分佈式打開Hadoop後,利用jps查看可以看到如下6個進程,除了Jps其它5個就是Hadoop守護進程:

14779 DataNode
15322 NodeManager
14657 NameNode
15194 ResourceManager
17656 Jps
14979 SecondaryNameNode

其中NameNode,SecondaryNameNode以及DataNode就是負責HDFS的進程,NameNode保存文件的分片索引,管理所有的文件目錄,SecondaryNameNode是它的副本。DataNode只保存分片的文件,並且有分片文件的節點纔會執行Mapper和Reducer。
而ResourceManager和NodeManger就是控制job和Task的。運行一次Mapreduce就是一次job,而job又分很多次Task來執行。每個task又分爲map task和reduce task。
詳細的講解以及Mapreduce job的運行機制可參考《Hadoop權威指南》。

有了以上基礎知識,可按照以下步驟具體實現:

  1. 安裝好Nuch和Hadoop(沒有Linux基礎的同學,說起來都是淚)
  2. 利用Hadoop運行樣例程序,可參考:http://blog.csdn.net/dingzuoer/article/details/44725869
  3. 利用Nutch爬取網頁,生成需要的linkdb和parse_text。
  4. 接下來就需要爲了實現PageRank作一些必要的文本預處理,可參考我下一篇博文具體分析。。。
發佈了99 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章