宣傳語
·首次揭示商業級搜尋引擎實現秘密。
·業內知名開發團隊傾情奉獻。
·引領Lucene開發技術升級。
內 容 簡 介
《自己動手寫搜尋引擎》是獵兔企業搜尋開發團隊的軟體產品研發和項目實踐的經驗匯總。本書主要包括爬蟲、自然語言處理和搜尋實現部分。爬虫部分介紹了網頁遍歷方法和從網頁提取主要內容的方法。
本書是獵兔企業搜尋開發團隊的軟體產品研發和項目實踐的經驗匯總。本書全方位展現出一個商用級別的Lucene搜尋解決方案,主要包括爬蟲、自然語言處理和搜尋實現部分。
爬虫部分介紹了網頁遍歷方法和從網頁提取主要內容的方法。
自然語言處理部分包括了中文分詞從理論到實現以及在搜尋引擎中的實用等細節。
其他自然語言處理的經典問題與實現包括:文檔排重、文本分類、自動聚類、語法解析樹、拼寫檢查、拼音轉換等理論與實現方法。
在實現搜尋方面,本書用簡單的例子介紹了完整的搜尋實現過程,覆蓋了從索引庫的設計和索引庫與資料庫的同步到搜尋用戶界面設計與實現。搜尋用戶界面包括實現布爾邏輯查詢、按區間範圍查詢、搜尋結果按日期排序等。本書還進一步介紹了搜尋排序的最佳化方法。
最後以基於Lucene的搜尋伺服器Solr為例,展示了Lucene的最新套用方法。
前 言
15 在中國,隨著網際網路從城市到農村的普及,搜尋引擎對日常生活產生越來越大的影響。例如,筆者自己一般每天就有15個左右的問題需要求助於搜尋引擎。從04年開始筆者也從資料庫相關軟體開發轉入搜尋引擎相關開發工作。
Google 20世紀末,在美國國家科學基金會的支持下,史丹福大學的兩個學生在他們的教授指導下開始了一個數字圖書館項目。後來,他們創建了Google公司,開創了通過網際網路搜尋技術共享人類信息的新紀元。Google通過網路廣告取得了巨大的商業回報,到現在仍然是世界500強企業中贏利能力最強的公司之一。NASDAQ證券交易市場的最高股價是Google公司的股票。搜尋引擎開發成為一項極有含金量的技術。
Web開始寫作《自己動手寫搜尋引擎》這本書以前,已經有一些介紹搜尋理論或者搜尋開發工具的圖書,但是往往表現出來的是純粹的理論推導和公式定理,或者僅僅是現成開源軟體的介紹、分析和使用,並沒有介紹其理論依據。有的讀者是數學專業的博士,對於相關的數學模型一看就明白,但對於算法實現可能仍然缺少經驗。有的讀者是培訓學校畢業的學生,可能對Web開發框架和軟體工具的使用很熟悉,但缺少理論基礎和深入創新的能力。本書的一個特點在於前面是原理介紹,接著是具體的代碼實現。不僅講解抽象的知識,更重要的是把知識轉化成具體軟體套用的過程也展示出來。
Lucene 《自己動手寫搜尋引擎》是獵兔企業搜尋開發團隊的軟體產品研發和項目實踐的經驗匯總。感謝Lucene,它把搜尋引擎開發工作變成了廣大程式設計師都能夠參與的遊戲。所以本書選用Lucene來全方位展現一個商用級別的搜尋解決方案。中文分詞當前仍然是實現中文搜尋的熱門話題之一。本書重點介紹了中文分詞的相關理論和代碼實現,以及在搜尋引擎中實用中文分詞等細節。本書用簡單的例子介紹了搜尋引擎完整的實現過程,同時也沒有忽略一些經典的算法實現。
該書適合需要具體實現搜尋引擎的程式設計師使用,對於自然語言處理等相關研究人員也有一定參考價值,同時獵兔搜尋團隊也已經開發出以本書為基礎的專門培訓課程。本書附帶光碟中的代碼經過了詳細的注釋。為了幫助初學者更容易地了解程式的功能,經過筆者的精心整理後,每個主要變數和每行主要的執行程式都加上了注釋,前後對比圖如下所示。
3年 筆者花了3年時間編寫本書,但限於時間和水平,其中很多內容筆者仍然正在改寫中,希望讀者不吝賜教,使本書在重印時內容能更全面。如果條件允許,筆者也很願意探索一些非比尋常的方式來介紹技術。
API 筆者把寫書的過程看成是筆者自身和作者所組建的技術團隊修煉和提高的過程。筆者相信技術高手並非天生,而是來源於對卓越品質的追求和自我的不斷提升。起點低不是問題,筆者所在的搜尋開發團隊就包括一些高中學歷的程式設計師,不願意學習和深入鑽研問題才是最大的問題。從企業知識管理的角度,這本書也是有益的。團隊里每次有新人進來,我們都先把相關文檔發給他們,這樣內部交流技術就多了一些基礎,不用每次都從Lucene最基本的API等這些基本知識開始介紹。
搜尋 從學習的過程來看,有人會問:“你沒有去過**公司,怎么知道開發搜尋引擎?”筆者沒有去過大的搜尋公司,所以只能從公開的論文、資料和代碼等開始學習。感謝搜尋引擎技術本身的發展,這方面的學習材料越來越容易通過搜尋獲得。筆者沒有在課堂上學習過自然語言處理等方面的課程,剛開始做中文分詞的時候,吳春堯博士問:“你知不知道語言模型?”筆者當時對這些概念一無所知。但是通過了解中文分詞程式每一行代碼的作用,閱讀相關的論文,終於了解了其中一些常用的數學方法。
Solr 從開發過程來看,首先由客戶或者其他開發人員提出問題,解決問題,重新審查整個過程並尋找更好的解決方法。比如實現搜尋結果中分類統計,最開始用QueryFilter方法可以實現基本的功能,後來Solr的作者實現了一個更快的DocSetHitCollector方法,如果用查表法來改進這個DocSetHitCollector方法可以達到比Solr官方版本更快的計算速度。搜尋軟體開發的過程借用日本產品研發大師稻盛和夫的話與大家共勉——“對產品的現場,重新進行審視、體察、貼心、傾聽。這樣的話,就可以聽見神靈的聲音。現場產品傳來喃喃細語告知我們解決問題的訣竅——這樣試試如何?”
準確 從成書過程來看,這本書也找過一些內部的開發人員請他們挑問題使得本書的表達更準確。最後,電子工業出版社的胡辛征老師對本書提出了很多具體而必要的建議,江立老師反覆做了細緻的修訂工作,他們豐富的經驗和認真負責的態度使得本書從粗糙的講稿變成了書本的形式。
感謝 最後筆者衷心感謝家人、關心我的老師和朋友們、創業夥伴、搜尋培訓班的學員以及選擇獵兔搜尋軟體的客戶多年來的支持。第一次開辦搜尋培訓班時,由於講稿本身準備得不夠充分,學員有諸多的反饋意見。經過不斷的修改後,新學員的負面反饋越來越少。他們的意見也在時刻提醒筆者要保持謙虛的態度。獵兔搜尋的客戶對於完善搜尋技術提供了重要的支持,客戶公司包括:天下互聯公司、北京電視台、港澳資訊公司、三星鵬泰公司、中國自動化網、中國工控網、中國機電貿易網、易車網、敦煌網、G寶盤、訊息樹網站等。
目 錄
第1章 遍歷搜尋引擎技術 1
1.1 1
1.1.1 準備工作環境(10分鐘) 1
1.1.2 編寫代碼(15分鐘) 3
1.1.3 發布運行(5分鐘) 5
1.2 Google神話 9
1.3 體驗搜尋引擎 9
1.4 搜尋語法 10
1.5 你也可以做搜尋引擎 13
1.6 搜尋引擎基本技術 14
1.6.1 網路蜘蛛 14
1.6.2 全文索引結構 14
1.6.3 Lucene全文檢索引擎 15
1.6.4 Nutch網路搜尋軟體 16
1.6.5 用戶界面 17
1.7 商業搜尋引擎技術介紹 19
1.7.1 通用搜尋 19
1.7.2 垂直搜尋 20
1.7.3 站內搜尋 21
1.7.4 桌面搜尋 23
1.8 本章小結 24
第2章 獲得海量數據 25
2.1 自己的網路蜘蛛 25
2.1.1 抓取網頁 25
2.1.2 網路蜘蛛遍歷與實現 26
2.1.3 改進網路蜘蛛 30
2.1.4 MP3抓取 34
2.1.5 RSS抓取 36
2.1.6 圖片抓取 38
2.1.7 垂直行業抓取 39
2.2 抓取資料庫中的內容 42
2.2.1 建立數據視圖 42
2.2.2 JDBC資料庫連線 43
2.2.3 增量抓取 45
2.3 抓取本地硬碟上的檔案 47
2.4 本章小結 49
第3章 提取文檔中的文本內容 50
3.1 從HTML檔案中提取文本 50
3.1.1 HtmlParser介紹 53
3.1.2 結構化信息提取 63
3.1.3 查看網頁的DOM結構 68
3.1.4 正文提取的工具NekoHTML 71
3.1.5 網頁去噪 73
3.1.6 網頁結構相似度計算 76
3.1.7 網站風格樹去除文檔噪聲 80
3.1.8 正文提取 92
3.2 從非HTML檔案中提取文本 98
3.2.1 TEXT檔案 98
3.2.2 PDF檔案 98
3.2.3 Word檔案 105
3.2.4 RTF檔案 106
3.2.5 Excel檔案 107
3.2.6 PowerPoint檔案 108
3.3 流媒體內容提取 109
3.3.1 音頻流內容提取 109
3.3.2 視頻流內容提取 111
3.4 抓取限制應對方法 113
3.5 本章小結 114
第4章 中文分詞 115
4.1 Lucene中的中文分詞 115
4.2 Lietu中文分詞的使用 116
4.3 中文分詞的原理 117
4.4 查找詞典算法 118
4.5 最大機率分詞方法 123
4.6 新詞發現 127
4.7 詞性標註 129
4.8 本章小結 139
第5章 自然語言處理 140
5.1 語法解析樹 140
5.2 文檔排重 141
5.3 中文關鍵字提取 142
5.3.1 關鍵字提取的基本方法 142
5.3.2 從網頁中提取關鍵字 145
5.4 相關搜尋 145
5.5 拼寫檢查 148
5.5.1 英文拼寫檢查 148
5.5.2 中文拼寫檢查 149
5.6 自動摘要 153
5.6.1 自動摘要技術 153
5.6.2 自動摘要的設計 154
5.6.3 Lucene中的動態摘要 162
5.7 自動分類 163
5.7.1 Classifier4J 164
5.7.2 自動分類的接口定義 165
5.7.3 自動分類的SVM方法實現 166
5.7.4 多級分類 167
5.8 自動聚類 170
5.8.1 聚類的定義 170
5.8.2 K均值聚類方法 170
5.8.3 K均值實現 173
5.9 拼音轉換 179
5.10 語義搜尋 180
5.11 跨語言搜尋 186
5.12 本章小結 188
第6章 創建索引庫 189
6.1 設計索引庫結構 190
6.1.1 理解Lucene的索引庫結構 190
6.1.2 設計一個簡單的索引庫 192
6.2 創建和維護索引庫 193
6.2.1 創建索引庫 193
6.2.2 向索引庫中添加索引文檔 194
6.2.3 刪除索引庫中的索引文檔 196
6.2.4 更新索引庫中的索引文檔 197
6.2.5 索引的合併 197
6.2.6 索引的定時更新 197
6.2.7 索引的備份和恢復 198
6.2.8 修復索引 199
6.3 讀寫並發控制 200
6.4 最佳化使用Lucene 200
6.4.1 索引最佳化 201
6.4.2 查詢最佳化 202
6.4.3 實現時間加權排序 206
6.4.4 實現字詞混合索引 207
6.4.5 定製Similarity 214
6.4.6 定製Tokenizer 215
6.5 查詢大容量索引 217
6.6 本章小結 218
第7章 用戶界面設計與實現 219
7.1 Lucene搜尋接口(search代碼) 219
7.2 搜尋頁面設計 221
7.2.1 用於顯示搜尋結果的taglib 221
7.2.2 用於搜尋結果分頁的taglib 223
7.2.3 設計一個簡單的搜尋頁面 225
7.3 實現搜尋接口 227
7.3.1 布爾搜尋 227
7.3.2 指定範圍搜尋 228
7.3.3 搜尋結果排序 233
7.3.4 搜尋頁面的索引快取與更新 234
7.4 實現關鍵字高亮顯示 236
7.5 實現分類統計視圖 239
7.6 實現相似文檔搜尋 244
7.7 實現AJAX自動完成 246
7.7.1 總體結構 247
7.7.2 伺服器端處理 247
7.7.3 瀏覽器端處理 249
7.7.4 伺服器端改進 250
7.7.5 部署總結 261
7.8 jQuery實現的自動完成 262
7.9 集成其他功能 267
7.9.1 拼寫檢查 267
7.9.2 分類統計 267
7.9.3 相關搜尋 271
7.9.4 再次查找 274
7.9.5 搜尋日誌 275
7.10 搜尋日誌分析 276
7.11 本章小結 280
第8章 其他高級主題 281
8.1 使用Solr實現分散式搜尋 281
8.1.1 Solr伺服器端的配置與中文支持 282
8.1.2 把數據放進Solr 287
8.1.3 刪除數據 289
8.1.4 客戶端搜尋界面 290
8.1.5 Solr索引庫的查找 292
8.1.6 索引分發 294
8.1.7 Solr搜尋最佳化 298
8.1.8 Solr中字詞混合索引 302
8.1.9 相關檢索 304
8.1.10 搜尋結果去重 307
8.1.11 分散式搜尋 311
8.1.12 SolrJ查詢分析器 315
8.1.13 擴展SolrJ 325
8.1.14 擴展Solr 327
8.1.15 Solr的.NET客戶端 333
8.1.16 Solr的PHP客戶端 334
8.2 圖像的OCR識別 336
8.3 競價排名 343
8.4 Web圖分析 344
8.5 使用並行程式分析數據 350
8.6 RSS搜尋 351
8.7 本章小結 353
參考資料 354