Nutch+Lucene搜尋引擎開發實踐
網路拓撲
圖 1 網路拓撲圖
安裝Java JDK
首先檢視系統是否已經安裝了其他版本的JDK,如果有,先要把其他版本的JDK解除安裝。
用root使用者登入系統。
# rpm-qa|grep gcj
顯示內容其中包含下面兩行資訊
# java-1.6.0-openjdk-1.6.0.0-1.57.1.11.9.el6_4.i686
#java-1.7.0-openjdk-1.7.0.9-2.3.8.0.el6_4.i686
解除安裝
#yum -y remove java-1.6.0-openjdk
#yum -y remove java-1.7.0-openjdk
去官網http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html下載 jdk-7u60-linux-i586.tar.gz。
在/usr目錄下建立java目錄。
#mkdir java
把jdk-7u60-linux-i586.tar.gz解壓到/usr/java。
#tar-zvxf jdk-7u60-linux-i586.tar.gz -C /usr/java
新增環境變數:
# vi /etc/profile
進入插入模式,在最後一行新增
JAVA_HOME=/usr/java/jdk1.7.0_60
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
wq儲存退出。
輸入命令
#source /etc/profile
使環境變數在當前ssh客戶端生效。
測試:
#echo $JAVA_HOME 測試環境變數配置是否生效
#java -version 檢視java版本資訊
#java
#javac 如果這兩個命令都能打印出資訊,說明安裝成功了。
部署tomcat
到官網http://tomcat.apache.org/download-70.cgi ,下載apache-tomcat-7.0.54.tar.gz。
把apache-tomcat-7.0.54.tar.gz解壓到/usr/local。
# tar zxvf apache-tomcat-7.0.54.tar.gz -C/usr/local
# cd /usr/local/
# mv apache-tomcat-7.0.54 tomcat
這時,還不能從外部訪問tomcat,需要在linux預設防護牆上開啟8080埠。
#vi /etc/sysconfig/iptables
進入插入模式,新增
-AINPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
wq儲存退出。
重新啟動防火牆。
#service iptables restart
啟動tomcat 。
# /usr/local/tomcat/bin/startup.sh
在使用者端瀏覽器中輸入http://10.1.1.95:8080/,可以看到Tomcat歡迎介面!說明部署成功。
部署Nutch
由於我們不需要在分散式環境下部署Nutch,我們選用較早版本的nutch-0.9。下載nutch-0.9.tar.gz,解壓到/usr/local。
# tar zxvf nutch-0.9.tar.gz -C /usr/local
部署nutch搜尋頁面:
把/usr/local/tomcat/webapps/ROOT資料夾重新命名為ROOT_BACK。
#cd/usr/local/tomcat/webapps/
#mvROOT ROOT_BACK
複製nutch根目錄下的nutch-0.9.war到/usr/local/tomcat/webapps/。
#cp/usr/local/nutch-0.9/nutch-0.9.war /usr/local/tomcat/webapps/
啟動tomcat。
#/usr/local/tomcat/bin/startup.sh
Tomcat成功啟動後,我們發現/usr/local/tomcat/webapps/資料夾下多了一個nutch-0.9的資料夾。把nutch-0.9重新命名為ROOT。
#mvnutch-0.9 ROOT
重新啟動tomcat。
#/usr/local/tomcat/bin/shutdown.sh
#/usr/local/tomcat/bin/startup.sh
在使用者端瀏覽器中訪問http://10.1.1.95:8080/。得到結果頁面如圖 1所示。說明搜尋頁面部署成功。
圖 2 Nutch預設搜尋入口頁
資料抓取和內容檢索
進入nutch根目錄。
#cd/usr/local/nutch-0.9
新建檔案multiurls.txt。
#vimultiurls.txt
輸入
http://sports.sina.com.cn/
http://sports.sohu.com/
http://sports.qq.com/
http://sports.cntv.cn/
http://sports.ifeng.com/
http://sports.163.com/
http://sports.uusee.com/
http://www.titan24.com/
wq儲存退出。
修改craw-urlfilter.txt,允許下載任意站點。
#vi /usr/local/ nutch-0.9/conf/craw-urlfilter.txt
把原有的過濾過則註釋掉,改為接受任意的url。
# accept hosts in MY.DOMAIN.NAME
##+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/
+^
wq儲存退出。
進入nutch目錄,啟動下載任務。
#cd /usr/local/nutch-0.9
#bin/nutch crawl multiurls.txt –dirsports –depth 10 –topN 100 –threads 16
引數含義說明如下:
-dir 指定存放爬行結果的目錄,本次抓取結果資料存放到sports目錄中;
-depth 表明需要抓取的頁面深度,本次抓取深度為10層;
-topN 表明只抓取前N個url,本次抓取為取每一層的前100個頁面;
-threads 指定Crawl採取下載的執行緒數,本次指定16個執行緒進行下載。
下載任務開始執行,如圖 2。等待5分鐘左右,下載任務執行完畢,如圖 3。
圖 3 啟動下載任務
圖 4 下載任務結束
根據下載過程可以看出nutch爬取網頁並建立索引庫的過程如下:
1) 插入器(Injector)向網頁資料庫新增起始根URL;
2) 按照要求抓取的層數,用生成器(Generator)生成待下載任務;
3) 呼叫獲取器(Fetcher),按照指定執行緒數實際下載相應頁面;
4) 呼叫頁面分析器(ParseSegment),分析下載內容;
5) 呼叫網頁資料庫管理工具(CrawlDb),把二級連結新增到庫中等待下載;
6) 呼叫連結分析工具(LinkDb),建立反向連結;
7) 呼叫索引器(Indexer),利用網頁資料庫、連結資料庫和具體下載的頁面內容,建立當前資料索引;
8) 呼叫重複資料刪除器(DeleteDuplicates),刪除重複資料;
9) 呼叫索引合併器(IndexMerger),把資料合併到歷史索引庫中。
修改nutch目錄下的nutch-site.xml檔案,增加索引目錄屬性指定檢索器讀取資料的目錄。
#vi/usr/local/nutch-0.9/conf/nutch-site.xml
在<configuration></configuration>之間新增
<property>
<name>http.agent.name</name>
<value>sports.com</value>
<description>sports.com</description>
</property>
<property>
<name>searcher.dir</name>
<value>/usr/local/nutch-0.9/sports</value>
<description></description>
</property>
wq儲存退出。
在終端命令視窗下測試檢索。
#cd/usr/local/nutch-0.9
#bin/nutchorg.apache.nutch.searcher.NutchBean 巴西
檢索結果如圖 5所示,共找到213條相關結果。
使用Readdb工具摘要描述
#bin/nutch readdb sports/crawldb –stats
得到摘要資訊如圖 6所示,共有15917條連結,成功下載了601個頁面。
經過上面步驟,搜尋引擎的檢索準備工作已經完成了。接下來把檢索結果部署到tomcat伺服器,使使用者可以在瀏覽器中檢索。過程如下:
修改tomcat/webapps/ROOT/WEB-INF/classes資料夾下的nutch-site.xml檔案,指定檢索路徑屬性引數值。
#vi/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/nutch-site.xml
在<configuration></configuration>之間新增
<property>
<name>http.agent.name</name>
<value>sports.com</value>
<description>sports.com</description>
</property>
<property>
<name>searcher.dir</name>
<value>/usr/local/nutch-0.9/sports</value>
<description></description>
</property>
重新啟動tomcat(如果未啟動則直接啟動)。
#/usr/local/tomcat/bin/shutdown.sh
#/usr/local/tomcat/bin/startup.sh
圖 5 在終端命令視窗下執行檢索命令
圖 6 使用Readdb獲取摘要描述
在使用者端瀏覽器中訪問http://10.1.1.95:8080/。檢索“世界盃”,報錯:Attributevalue is quoted with " which must be escaped when used within the value。是因為tomcat版本升級後(6.0以上),對雙引號的處理機制引起的,如果出現雙引號包含雙引號的情況,就可能會出現這個錯誤。解決辦法是修改conf/catalina.properties檔案。
#vi/usr/local/tomcat/conf/catalina.properties
在最後新增
org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
wq儲存退出。
再次檢索,出現中文亂碼,解決辦法是修改conf/server.xml檔案。
#vi/usr/local/tomcat/conf/server.xml
找到Connector標籤,新增屬性URIEncoding="UTF-8"。
wq儲存退出。
重新啟動tomcat,就可以在使用者端進行搜尋了。檢索“巴西 世界盃”,得到結果如圖 7所示。
圖 7 在使用者端搜尋的結果
參考文獻
[1]. 王學鬆,Lucene+Nutch搜尋引擎開發,人民郵電出版社,2008.