Apache nutch1.5 & Apache solr3.6
第1章引言
1.1nutch和solr
Nutch 是一個開源的、Java 實現的搜尋引擎。它提供了我們執行自己的搜尋引擎所需的全部工具。
Solr 擁有像 web-services API 的獨立的企業級搜尋伺服器。用 XML 通過 HTTP 向它新增文件(稱為做索引),通過 HTTP 查詢返回 XML 結果。
1.2研究nutch 的原因
可能有的朋友會有疑問,我們有google,有百度,為何還需要建立自己的搜尋引擎呢?這裡我列出3 點原因:
- 透明度:nutch 是開放原始碼的,因此任何人都可以檢視他的排序演算法是如何工作的。
商業的搜尋引擎排序演算法都是保密的,我們無法知道為什麼搜尋出來的排序結果是如何算出來的。更進一步,一些搜尋引擎允許競價排名,比如百度,這樣的索引結果並不是和站點內容相關的。因此nutch 對學術搜尋和政府類站點的搜尋來說,是個好選擇,因為一個公平的排序結果是非常重要的。
- 對搜尋引擎的理解:我們並沒有google 的原始碼,因此學習搜尋引擎Nutch 是個不錯的選擇。瞭解一個大型分散式的搜尋引擎如何工作是一件讓人很受益的事情。在寫Nutch 的過程中,從學院派和工業派借鑑了很多知識:比如,Nutch 的核心部分目前已經被重新用Map Reduce 實現了。Map Reduce 是一個分散式的處理模型,最先是從Google 實驗室提出來的。並且Nutch 也吸引了很多研究者,他們非常樂於嘗試新的搜尋演算法,因為對Nutch 來說,這是非常容易實現擴充套件的。
- 擴充套件性:你是不是不喜歡其他的搜尋引擎展現結果的方式呢?那就用Nutch 寫你自己的搜尋引擎吧。Nutch 是非常靈活的:他可以被很好的客戶訂製並整合到你的應用程式中,使用Nutch 的外掛機制,Nutch可以作為一個搜尋不同資訊載體的搜尋平臺。當然,最簡單的就是整合Nutch 到你的站點,為你的使用者提供搜尋服務。
1.3nutch 的目標
nutch 致力於讓每個人能很容易, 同時花費很少就可以配置世界一流的Web 搜尋引擎. 為了完成這一巨集偉的目標, nutch 必須能夠做到:
• 每個月取幾十億網頁
• 為這些網頁維護一個索引
• 對索引檔案進行每秒上千次的搜尋
• 提供高質量的搜尋結果
• 以最小的成本運作
這將是一個巨大的挑戰。
1.4nutch VS lucene
簡單的說:
Lucene 不是完整的應用程式,而是一個用於實現全文檢索的軟體庫。
Nutch 是一個應用程式,可以以Lucene 為基礎實現搜尋引擎應用。
Lucene 為Nutch 提供了文字索引和搜尋的API。一個常見的問題是;我應
該使用Lucene 還是Nutch?最簡單的回答是:如果你不需要抓取資料的話,應該使用Lucene。常見的應用場合是:你有資料來源,需要為這些資料提供一個搜尋頁面。
在這種情況下,最好的方式是直接從資料庫中取出資料並用Lucene API 建立索引。
第2章安裝與配置
- 安裝環境: Ubuntu 12.04 LTS
- 所安裝軟體: JDK 1.6.0_29
apache-nutch-1.5-bin.tar.gz
solr3.6
IKAnalyzer3.2.3
tomcat7.0
- 我將軟體預設安裝在當前使用者的主資料夾下(/使用者)
- 下載網址:
jdk: http://www.oracle.com/technetwork/java/javase/downloads/index.html
nutch : http://www.apache.org/dyn/closer.cgi/nutch/
solr:http://mirror.bjtu.edu.cn/apache/lucene/solr/3.6.0/
IKAnalyzer:http://code.google.com/p/ik-analyzer/
tomcat : http://tomcat.apache.org/download-70.cgi#7.0.27
2.1安裝和配置JDK,Tomcat
網上很多例子了。
2.2安裝和配置nutch
到使用者主目錄:
cd ~
建立資料夾:
mkdir nutch
將檔案拷貝到~/hadoop/nutch目錄,解壓縮:
tar -zxvf apache-nutch-1.5-bin.tar.gz
如果沒用許可權,可以使用chmod和chown授權
驗證一下,執行
bin/nutch
2.3安裝和配置solr
到使用者主目錄:
cd ~
進入hadoop目錄,拷貝apache-solr-3.6.0.tgz,解壓縮:
tar -zxvf apache-solr-3.6.0.tgz
1)拷貝[solr_home]/dist/apache-solr-3.6.0.war的檔案到tomcat/webapps目錄下,並且改名solr.war
2)將[solr_home]example 下的solr 目錄拷貝到任意位置,我是放在:~/tomcat7/solr下
3)在tomcat目錄下的confCatalinalocalhost 目錄中(如果沒有則手工建立該目錄)建立solr.xml檔案,檔案內容如下: <Context docBase="[tomat_home]/webapps/solr.war" debug="0" crossContext="true" > <Environment name="solr/home" type="java.lang.String" value="[tomcat_home]/solr" override="true" /> </Context>
4)修改tomcat的server.xml檔案,找到<Connector port="8080" … 項(假設tomcat監聽8080埠),新增編碼方式,修改後如下<Connector port="8080" URIEncoding="UTF-8"
5)啟動tomcat,輸入http://localhost:8080/solr/,出現歡迎介面則表示配置成功
2.4配置1KAnalyzer到solr
拷貝IKAnalyzer2012.jar到webapps中的solr的lib目錄下
配置專案中文分詞:
編輯[tomat_home]/solr/conf/schema.xml,在<Types>下新增以下內容:
<!--add 1kanalyzer configuration-->
<fieldType name="text" class="solr.TextField" >
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"
protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"
protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
然後在<fields>下新增:
<field name="name1" type="text" indexed="true" stored="true" required="true" />
重新啟動tomcat,進入
http://localhost:8080/solr/admin/analysis.jsp
輸入“中華人民共和國”,點選analyze,得到結果如下:
第3章nutch實驗
Nutch 的爬蟲有兩種方式
• 爬行企業內部網(Intranet crawling)。針對少數網站進行,用crawl 命令。
• 爬行整個網際網路。使用低層的inject, generate, fetch 和updatedb 命令,
具有更強的可控制性。
3.1爬取163
進入[nutch_home]
編輯conf/nutch-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>http.agent.name</name>
<value>myagent</value>
<description>HTTP 'User-Agent' request header. MUST NOT be empty -
please set this to a single word uniquely related to your organization.
NOTE: You should also check other related properties:
http.robots.agents
http.agent.description
http.agent.url
http.agent.email
http.agent.version
and set their values appropriately.
</description>
</property>
<property>
<name>http.agent.description</name>
<value></value>
<description>Further description of our bot- this text is used in
the User-Agent header. It appears in parenthesis after the agent name.
</description>
</property>
<property>
<name>http.agent.url</name>
<value></value>
<description>A URL to advertise in the User-Agent header. This will
appear in parenthesis after the agent name. Custom dictates that this
should be a URL of a page explaining the purpose and behavior of this
crawler.
</description>
</property>
<property>
<name>http.agent.email</name>
<value></value>
<description>An email address to advertise in the HTTP 'From' request
header and User-Agent header. A good practice is to mangle this address (e.g. 'info at example dot com') to avoid spamming.
</description>
</property>
</configuration>
建立目錄urls,並建立檔案seed.txt,加入
http://www.163.com
編輯conf/regex-urlfilter.txt
修改以下部分:
# accept anything else
+^http://([a-z0-9]*.)*www.163.com/
執行爬取命令:
bin/nutch crawl urls -dir crawl -depth 3 -topN 5
- urls 是存放163 網址的資料夾目錄
- -dir crawl.demo 是抓取的頁面的存放目錄
- -depth 指爬行的深度,這裡處於測試的目的,選擇深度為2 ,完
全爬行一般可設定為10 左右
- -threads 指定併發的程序這是設定為4
- -topN 指在每層的深度上所要抓取的最大的頁面數,
完全抓取可設定為1 萬到100 萬,這取決於網站資源數量
爬取資源並且新增索引:
bin/nutch crawl urls -solr http://localhost:8080/solr/ -depth 3 -topN 5
執行結果如下:
3.2solrj訪問solr
3.2.1solr基礎
因為 Solr 包裝並擴充套件了 Lucene,所以它們使用很多相同的術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程式中的索引。
在 Solr 和 Lucene 中,使用一個或多個 Document 來構建索引。Document 包括一個或多個 Field。Field 包括名稱、內容以及告訴 Solr 如何處理內容的元資料。例如,Field 可以包含字串、數字、布林值或者日期,也可以包含你想新增的任何型別,只需用在solr的配置檔案中進行相應的配置即可。Field 可以使用大量的選項來描述,這些選項告訴 Solr 在索引和搜尋期間如何處理內容。現在,檢視一下表 1 中列出的重要屬性的子集:
屬性名稱 |
描述 |
---|---|
Indexed |
Indexed Field 可以進行搜尋和排序。你還可以在 indexed Field 上執行 Solr 分析過程,此過程可修改內容以改進或更改結果。 |
Stored |
stored Field 內容儲存在索引中。這對於檢索和醒目顯示內容很有用,但對於實際搜尋則不是必需的。例如,很多應用程式儲存指向內容位置的指標而不是儲存實際的檔案內容。 |
3.2.2solr索引操作
在 Solr 中,通過向部署在 servlet 容器中的 Solr Web 應用程式傳送 HTTP 請求來啟動索引和搜尋。Solr 接受請求,確定要使用的適當 SolrRequestHandler,然後處理請求。通過 HTTP 以同樣的方式返回響應。預設配置返回 Solr 的標準 XML 響應。你也可以配置 Solr 的備用響應格式,如json、csv格式的文字。
索引就是接受輸入元資料(資料格式在schema.xml中進行配置)並將它們傳遞給 Solr,從而在 HTTP Post XML 訊息中進行索引的過程。你可以向 Solr 索引 servlet 傳遞四個不同的索引請求:
add/update 允許您向 Solr 新增文件或更新文件。直到提交後才能搜尋到這些新增和更新。
commit 告訴 Solr,應該使上次提交以來所做的所有更改都可以搜尋到。
optimize 重構 Lucene 的檔案以改進搜尋效能。索引完成後執行一下優化通常比較好。如果更新比較頻繁,則應該在使用率較低的時候安排優化。一個索引無需優化也可以正常地執行。優化是一個耗時較多的過程。
delete 可以通過 id 或查詢來指定。按 id 刪除將刪除具有指定 id 的文件;按查詢刪除將刪除查詢返回的所有文件。
Lucene中操作索引也有這幾個步驟,但是沒有更新。Lucene更新是先刪除,然後新增索引。因為更新索引在一定情況下,效率沒有先刪除後新增的效率好。
3.2.3solr搜尋
新增文件後,就可以搜尋這些文件了。Solr 接受 HTTP GET 和 HTTP POST 查詢訊息。收到的查詢由相應的 SolrRequestHandler 進行處理。
solr查詢引數描述:
引數 |
描述 |
示例 |
---|---|---|
q |
Solr 中用來搜尋的查詢。有關該語法的完整描述,請參閱 參考資料。可以通過追加一個分號和已索引且未進行斷詞的欄位(下面會進行解釋)的名稱來包含排序資訊。預設的排序是 score desc,指按記分降序排序。 |
q=myField:Java AND otherField:developerWorks; date asc此查詢搜尋指定的兩個欄位,並根據一個日期欄位對結果進行排序。 |
start |
將初始偏移量指定到結果集中。可用於對結果進行分頁。預設值為 0。 |
start=15 返回從第 15 個結果開始的結果。 |
rows |
返回文件的最大數目。預設值為 10。 |
rows=25,返回25個結果集 |
fq |
提供一個可選的篩選器查詢。查詢結果被限制為僅搜尋篩選器查詢返回的結果。篩選過的查詢由 Solr 進行快取。它們對提高複雜查詢的速度非常有用。 |
任何可以用 q 引數傳遞的有效查詢,排序資訊除外。 |
hl |
當 hl=true 時,在查詢響應中醒目顯示片段。預設為 false。參看醒目顯示引數(見 參考資料)。 |
hl=true |
fl |
作為逗號分隔的列表指定文件結果中應返回的 Field 集。預設為 “*”,指所有的欄位。“score” 指還應返回記分。 |
*,score |
sort |
排序,對查詢結果進行排序,參考 |
sort=date asc,price desc |
3.2.4solr模式
上面有提到schema.xml這個配置,這個配置可以在你下載solr包的安裝解壓目錄的apache-solr-3.6.0examplesolrconf中找到,它就是solr模式關聯的檔案。開啟這個配置檔案,你會發現有詳細的註釋。
模式組織主要分為三個重要配置
types 部分是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是新增到索引中的xml檔案屬性中的型別,如int、text、date等
fileds是你新增到索引檔案中出現的屬性名稱,而宣告型別就需要用到上面的types
其他配置有
uniqueKey 唯一鍵,這裡配置的是上面出現的fileds,一般是id、url等不重複的。在更新、刪除的時候可以用到。
defaultSearchField預設搜尋屬性,如q=solr就是預設的搜尋那個欄位
solrQueryParser查詢轉換模式,是並且還是或者(and/or)
3.2.5索引配置
Solr 效能因素,來了解與各種更改相關的效能權衡。
表 1 概括了可控制 Solr 索引處理的各種因素:
因素 |
描述 |
---|---|
useCompoundFile |
通過將很多 Lucene 內部檔案整合到單一一個檔案來減少使用中的檔案的數量。這可有助於減少 Solr 使用的檔案控制代碼數目,代價是降低了效能。除非是應用程式用完了檔案控制代碼,否則 false 的預設值應該就已經足夠。 |
mergeFactor |
決定低水平的 Lucene 段被合併的頻率。較小的值(最小為 2)使用的記憶體較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的記憶體。 |
maxBufferedDocs |
在合併記憶體中文件和建立新段之前,定義所需索引的最小文件數。段 是用來儲存索引資訊的 Lucene 檔案。較大的值可使索引時間變快但會犧牲較多的記憶體。 |
maxMergeDocs |
控制可由 Solr 合併的 Document 的最大數。較小的值 (< 10,000) 最適合於具有大量更新的應用程式。 |
maxFieldLength |
對於給定的 Document,控制可新增到 Field 的最大條目數,進而截斷該文件。如果文件可能會很大,就需要增加這個數值。然而,若將這個值設定得過高會導致記憶體不足錯誤。 |
unlockOnStartup |
unlockOnStartup 告知 Solr 忽略在多執行緒環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不正確的關機或其他錯誤而一直處於鎖定,這就妨礙了新增和更新。將其設定為 true 可以禁用啟動鎖定,進而允許進行新增和更新。 |
3.2.6查詢處理配置
<maxBooleanClauses> 標記定義了可組合在一起形成一個查詢的子句數量的上限。對於大多數應用程式而言,預設的 1024 就應該已經足夠;然而,如果應用程式大量使用了萬用字元或範圍查詢,增加這個限值將能避免當值超出時,丟擲TooManyClausesException。
若應用程式預期只會檢索 Document 上少數幾個 Field,那麼可以將 <enableLazyFieldLoading> 屬性設定為 true。懶散載入的一個常見場景大都發生在應用程式返回和顯示一系列搜尋結果的時候,使用者常常會單擊其中的一個來檢視儲存在此索引中的原始文件。初始的 顯示常常只需要顯示很短的一段資訊。若考慮到檢索大型 Document 的代價,除非必需,否則就應該避免載入整個文件。
<query> 部分負責定義與在 Solr 中發生的事件相關的幾個選項。Searcher 的 Java 類來處理 Query 例項。要改進這一設計和顯著提高效能,把這些新的 Searcher 聯機以便為現場使用者提供查詢服務之前,先對它們進行 “熱身”。<query> 部分中的 <listener> 選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定例項化新搜尋程式或第一個搜尋程式時應該執行哪些查詢。如果應用程式期望請求某些特定的查詢,那麼在建立新搜尋程式或第一 個搜尋程式時就應該反註釋這些部分並執行適當的查詢。
solrconfig.xml 檔案的剩餘部分,除 <admin> 之外,涵蓋了與 快取、複製 和 擴充套件或定製 Solr 有關的專案。admin 部分讓您可以定製管理介面。有關配置 admin 節的更多資訊,請參看solrconfig.xml 檔案中的註釋。
3.2.7監視、記錄和統計資料
用於監視、記錄和統計資料的 Solr 管理選項
選單名 |
URL |
描述 |
---|---|---|
Statistics |
http://localhost:8080/solr/admin/stats.jsp |
Statistics 管理頁提供了與 Solr 效能相關的很多有用的統計資料。這些資料包括: 關於何時載入索引以及索引中有多少文件的資訊。 關於用來服務查詢的 SolrRequestHandler 的有用資訊。 涵蓋索引過程的資料,包括新增、刪除、提交等的數量。 快取實現和 hit/miss/eviction 資訊 |
Info |
http://localhost:8080/solr/admin/registry.jsp |
有關正在執行的 Solr 的版本以及在當前實現中進行查詢、更新和快取所使用的類的詳細資訊。此外,還包括檔案存於 Solr subversion 儲存庫的何處的資訊以及對該檔案功能的一個簡要描述。 |
Distribution |
http://localhost:8080/solr/admin/distributiondump.jsp |
顯示與索引發布和複製有關的資訊。更多資訊,請參見 “釋出和複製” 一節。 |
Ping |
http://localhost:8080/solr/admin/ping |
向伺服器發出 ping 請求,包括在 solrconfig.xml 檔案的 admin 部分定義的請求。 |
Logging |
http://localhost:8080/solr/admin/logging.jsp |
讓您可以動態更改當前應用程式的日誌記錄等級。更改日誌記錄等級對於除錯在執行過程中可能出現的問題非常有用。 |
properties |
http: //localhost:8080/solr/admin/get-properties.jsp |
顯示當前系統正在使用的所有 Java 系統屬性。Solr 支援通過命令列的系統屬性替換。有關實現此特性的更多資訊,請參見 solrconfig.xml 檔案。 |
Thread dump |
http://localhost:8080/solr/admin/threaddump.jsp |
thread dump 選項顯示了在 JVM 中執行的所有執行緒的堆疊跟蹤資訊。 |
3.2.8智慧快取
智慧快取是讓 Solr 得以成為引人矚目的搜尋伺服器的一個關鍵效能特徵。Solr 提供了四種不同的快取型別,所有四種類型都可在 solrconfig.xml 的 <query> 部分中配置。solrconfig.xml 檔案中所用的標記名列出了這些快取型別:
快取標記名 |
描述 |
能否自熱 |
---|---|---|
filterCache |
通過儲存一個匹配給定查詢的文件 id 的無序集,過濾器讓 Solr 能夠有效提高查詢的效能。快取這些過濾器意味著對 Solr 的重複呼叫可以導致結果集的快速查詢。更常見的場景是快取一個過濾器,然後再發起後續的精煉查詢,這種查詢能使用過濾器來限制要搜尋的文件數。 |
可以 |
queryResultCache |
為查詢、排序條件和所請求文件的數量快取文件 id 的有序 集合。 |
可以 |
documentCache |
快取 Lucene Document,使用內部 Lucene 文件 id(以便不與 Solr 惟一 id 相混淆)。由於 Lucene 的內部 Document id 可以因索引操作而更改,這種快取不能自熱。 |
不可以 |
Named caches |
命名快取是使用者定義的快取,可被 Solr 定製外掛 所使用。 |
可以,如果實現了 org.apache.solr.search.CacheRegenerator 的話。 |
每個快取宣告都接受最多四個屬性:
class 是快取實現的 Java 名。
size 是最大的條目數。
initialSize 是快取的初始大小。
autoWarmCount 是取自舊快取以預熱新快取的條目數。如果條目很多,就意味著快取的 hit 會更多,只不過需要花更長的預熱時間。