決定在CSDN寫部落格的原因是想把自己解決過的問題、踩過的坑、總結出來的經驗記錄下來,作為程式設計之路的“筆記本”,同時也能給遇到同樣問題的人提供參考、節省時間,寫書的初衷也一樣。
說一下寫書的前因後果。中國科學院大學雁栖湖校區是很重要的一年,師資團隊無可挑剔,每次上課去的稍微晚一點,300人的大教室都沒有座位。對于計算機學院而言,大資料、機器學習、資訊檢索(搜尋引擎)、算法、人工智能是最火的幾個領域,資訊檢索課是最受歡迎的幾門課之一。最後的工程大作業是實作一個新聞搜尋,圖1是我最早完成的效果。
圖1 基于Lucene的新聞搜尋項目
後來,利用放暑假的時間,去找實習。也許是跟Elasticsearch有緣分,投的java實習生的崗位,做的是搜尋的業務,也許我的履歷上有Lucene這個小項目,Elasticsearch又是基于Lucene的,老大(中科大畢業的)給了我一份文檔去學習Elasticsearch。這份文檔是清華的一個學長做的Elasticsearch技術調研,其中很多基礎性的東西都寫在文檔裡了,有資訊檢索的理論、有Lucene基礎,又有前輩總結的文檔,上手Elasticsearch很快,業務中的大部分問題也都在短時間内得到了解決。當然,這期間也有遇到過很多問題,比如一開始對Elasticsearch中的一些概念不熟悉,了解起來比較困難,還有很多API不知道如何用,國内的相關文檔也不太多,這期間我一直在Stack Overflow上和外國的大牛交流,不斷的遇到問題、提問、解決問題、總結思考,如此反複,同時也把我解決過的問題貼到部落格上面。就這樣,部落格積累的越來越多,對Elasticsearch、對搜尋的體會也不斷深入,同時公司裡的老大、同僚都給了我很多幫助和指導,進步也很快。
再後來,清華大學出版社的編輯通過部落格聯系到我,問我想不想寫一本Elasticsearch的書,把技術分享出來。
寫書的過程跟我想的完全不一樣,一開始以為部落格上有那麼多内容,整理整理很快書就完成了,事實上寫書和寫代碼完全是兩回事。寫代碼,明白需求,編寫代碼,解決問題,任務就完成了,而寫書是寫怎麼寫代碼,要讓讀者看明白,同時整個書是一個體系,要有組織有路線,寫作的過程要兼顧整體與部分。經過反複的思考,反複的修改,從理論到基礎,從基礎到項目實戰,前前後後将近一年的時間完成了初稿。就在準備付梓之時,Elasticsearch 5.X釋出了,而且變化比較大,又花了2個月的時間基于Elasticsearch 5.4把所有的内容更新了一遍。直到17年10月份,終于完稿!
資訊檢索的基本術語、核心算法。
Lucene基礎。
檔案搜尋項目。
Elasticsearch基礎。
新聞搜尋項目。
Elasticsearch和Hadoop的結合。
關于本書的閱讀指南說明如下:
第一章主要介紹資訊檢索的基本定義、術語、分詞算法、反向索引、布爾檢索模型、向量空間模型、BM25機率檢索模型。這一章的目的是為了讓讀者對資訊檢索有一個基本的認識,明白搜尋是這麼回事。關于檢索模型,不論Lucene還是ELasticsearch,相關性評分是搜尋要解決的問題,了解檢索模型非常重要,我的建議是自己動手推導數學公式,從數學上了解算法,到後面再用Lucene或Elasticsearch就能遊刃有餘。
第二章主要介紹怎麼用Lucene,學習内容主要包括分詞的實作、索引的建構、查詢的用法以及關鍵字高亮。
用Lucene仿照百度文庫實作一個檔案檢索項目。如圖2所示。
Lucene和Elasticsearch的關系,Elasticsearch的誕生過程、流行度分析、架構、核心概念、和其它資料庫的對比、安裝與啟動、中文分詞器配置、常用插件配置。
第5章主要有三塊内容:索引管理、文檔管理和映射詳解。索引管理包括索引的增、删、改、查、開、關、複制、收縮、别名,文檔管理包括文檔的增、删、更新、擷取、批量操作、版本機制和路由機制,映射詳解主要包括映射的分類、動态映射和靜态映射、字段類型、元字段、映射參數和映射模闆。其中映射配置和使用是重點,遇到過多次因為日期類型的mapping設定有誤,上億的資料導到Elasticsearch之後需要翻工修改。每一個需要使用Elasticsearch的開發者,在動手之前,把mapping中的所有字段、原字段、參數等配置資訊過一遍是最基本的要求。
第6章主要介紹搜尋機制、全文級别的查詢、詞項級别的查詢、複合查詢、嵌套查詢、位置查詢、特殊查詢、搜尋高亮的實作以及性能分析、搜尋排序和評分的相關分析。
第7章主要介紹名額聚合和桶聚合。名額聚合可以實作關系型資料庫中的統計功能,比如常用的求和、最大/小值、平均數等,桶聚合可以實作關系型資料庫中的分組功能,每個的功能都通過具體例子進行講解。
第8章介紹如何在Java項目中通過Java用戶端做二次開發。Elasticsearch提供了多種用戶端,包括Java、Javascript、Python、.NET、PHP、Ruby等常用語言,考慮到Lucene是純java編寫、基于java的項目比較多,這一章重點介紹如何使用java用戶端基于Elasticsearch做二次開發。
第9章介紹叢集的規劃、分片的規劃、分布式叢集的配置、叢集健康的監控與檢視以及常用的API。
第10章講解基于Elasticsearch整合Mysql實作新聞搜尋項目,包括資料導入、 前端搜尋框和搜尋結果頁、關鍵字高亮、搜尋分頁等關鍵步驟的實作。如圖3和圖4所示。
第11章介紹ES-Hadoop,ES-Hadoop是連通分布式搜尋引擎Elasticsearch和Hadoop大資料生态系統的橋梁。
圖2 基于Lucene的檔案檢索項目
圖3 基于Elasticsearch的新聞搜尋項目(搜尋框)
圖4 基于Elasticsearch的新聞搜尋項目(搜尋結果頁)
囿于個人知識、能力、經驗有限,歡迎讀者對本書中的任何不足和疏漏之處進行批評指正,任何意見、建議都可以在本帖下回複。
我希望閱讀本書的讀者:
對于數學理論,最好是能靜下心,拿出紙筆,從數學公式上去推導;
對于Lucene基礎,所有的代碼都應該寫一遍,例子都是環環相扣逐漸深入的;
對于檔案搜尋項目,能夠找一些格式不一樣的文檔,從0開始實作一個小的百度文庫;
對于Elasticsearch,基本的安裝、插件正确配置,所有的基礎API都應親自測一把;
對于新聞搜尋項目,從0開始一步一步去實作一個小的百度新聞搜尋;
對于ES-Hadoop,把Hadoop的安裝配置好,例子運作起來。
這也是這本書所能給你的。
最後,圖書的出版是技術路上的一個總結,希望本書能夠幫助有需要的朋友。“三人行,必有我師”,我還會一如既往的努力,一如既往的和大家交流學習。