折磨我幾天的問題今天終于解決了,分享一下近期solr使用的一些經驗。
本來是用nutch在爬取頁面,可是客戶需要爬取RSS,而且可以識別那些頁面是通過RSS源抓取出來的。nutch雖然自帶解析RSS的插件,但是有些RSS解析不了,也不好控制,更重要的抓取后和普通頁面就沒什么太大的區別了,不能識別不能判斷是由哪個rss源抓取出來的。因為上面原因,所以就自己用C#寫了一個配合Solr抓取RSS的工程。
一切實現好后,客戶非常滿意,我也覺得做的還不錯,可是過了一段時間后發現nutch在solrdedup時失敗了,導致nutch不能使用。下面就把rss實現的原理,和問題的產生進行介紹,解決solr和nutch這些問題不是因為非常難理解,主要是這類問題在網上很難找到。由于公司沒有外網和拷貝權限,所有的一切只能憑我的記憶寫出來了。
RSS+Solr的實現是利用webrequest讀取到rss源的xml格式的內容,直接里面post方式為solr建立索引。為了達到客戶的要求,我在solr的schame里面添加了rss和isrss字段,rss為rss源的url地址,isrss固定為ture。由于nutch沒有這2個字段,所以我們查詢rss只需 輸入 isrss:"true"就可以過濾掉不是rss出來的頁面。
實現過程中主要要注意下面幾點
1.rss源并不是后綴為xml的文件,有些就是普通頁面response出來的,而且有些是需要登錄權限的
2.rss目前主要有2種格式,普遍的xml結構為rss/channel/item ,另外一種就是我們博客園rss的結構feed/entry。
里面的標簽是固定的,可以通過不同的標簽找到solr里面filed需要的值
3.id,digest,tstamp三個欄位是必須要的。
上面提到nutch 運行到solrdedup時就報錯,開始我以為是solr里面新加的2個字段,嘗試為nutch也新增2個字段,而且還利用nutch的靜態欄位插件和額外欄位插件,但是沒有用,最后我發現把solr的數據清除后居然nutch可以正常運行,我在google里面也查了很多,但是基本沒什么幫助,還以為是solr cache的原因。今天剛好有點空,所以我找到了nutch的報錯文件solrdeleteduplicates.java,研究發現里面nutch去除重復是從solr直接取了id,digest,tstamp字段,沒有判斷是否為空就直接使用了。
但是我寫的程序里面digest和tsamp是沒有添加的,果然添加完這2個欄位,把所有沒有這2個欄位的數據全部補完整,nutch又可以正常運行了
4.digest是網頁的32位哈希值,用來nutch去除重復時進行比較差異
5.solr是可以直接通過請求url對內容進行新增,修改,刪除,其中修改的格式與新增一樣
主要核心為:xx.xx.xx.xx/solr/update?stream.body=<add><doc><field name="xx">xx</filed></doc><add>&stream.contentType=text/xm;charset=utf-8&commit=true
如果內容有ur格式和html格式需要對其進行轉碼
6,solr的時間是GMT格式的時間,所以不要弄錯,而且rss里面的GMT格式有些是不對的,我就遇到了很多,星期不對都會引起solr index失敗。
現在信息都還是比較齊全,搜索還是比較方便的,但是還是有很多問題需要解決,主要是js生成頁面不能讀取,還有頁面上信息的過濾。獲取文章的主要內容,過濾導航等其他信息還是比較難的,目前我查到的別人是根據統計規律在進行過濾,比如導航條中間很多是用|分開的,內容里面的空格間隔等。每個站點的html布局風格不一樣,標簽這些很難統一,百度,谷歌也不知道是怎么實現的,或者它們其實也沒有實現。
nutch還是比較強大的,但是總覺得不好維護和修改,上次編譯一下源代碼都費了很長時間,solr的查詢也是比較高效的。 可能計劃寫一個.net版本的爬蟲和搜索,但是只是在計劃中,因為涉及到的問題太多了...
新聞熱點
疑難解答