計劃研究一下搜索search,而後寫個學習過程系列博客。開動以前先說說學習搜索的目的:不是想開發個什麼搜索引擎,而是想用現成的搜索引擎在傳統信息系統中引進搜索的概念和方法。對我來講,傳統的管理系統legacy i.t system已經走到了盡頭。根本緣由是信息在量上的爆發增加,傳統數據管理方式已經沒法兼顧了。在我看來,除了交易管理,傳統的關係數據庫方式在業務管理的其它方面,特別是業務相關的數據分析、決策支持等確定是力不從心了,這些從持續多年我所經歷的數據庫紅色鎖標記就頗有說服力了。無能否認,必須想辦法在大數據、分佈式計算方面尋找合適的解決方案。前兩年已經完成了一系列分佈式計算、分佈式數據庫,分佈式流處理等博客,足夠構建一個分佈式大數據平臺來實現對海量數據的存儲、處理了。剩下最重要的問題是如何使用平臺上的這些數據,即如何能輕鬆又高效的使用大數據,不然前面一切努力將化爲烏有。如今最迫切的需求(我認爲的)就是如何對這些大數據進行高效的分析、關聯,組合而後產生全面、精準的業務決策或者系統使用的支持數據。也就是說能夠經過搜索把大數據平臺上的數據按照業務管理要求的信息內容、表現形式提供給前端系統。前端
首先解釋一下:傳統業務管理系統裏的查詢(查找)與搜索有較大區別。傳統系統採用查詢方式來篩選系統裏符合條件的交易記錄。之因此提到交易記錄是由於傳統系統中數據的強格式化,連帶查詢條件的設置也較僵化、缺少靈活性。因爲查詢結果是經過對查詢條件的高度匹配產生的,每每須要查詢者充分了解業務特性才能準確的表述需求造成條件,這也是大多數操做者沒法具有的能力,形成查詢工具的實用性大打折扣。java
搜索search除條件匹配式的查找外最重要的是具有了關聯relevance的特性。首先,搜索是基於大數據文件數據庫的,對格式沒有硬性要求,操做者可自由、靈活的表達搜索條件。再者搜索具有信息關聯能力,能根據搜索條件除符合條件的文件外,還能把知足搜索條件中表述的關聯,如:文字關聯、意思關聯、信息關聯等應用在目標文件的匹配上,產生一個以關聯度排序的結果文件清單。換句話說就是好的1搜索方案還能夠猜度操做者的搜索目的,提供建議目標結果。如此大大下降了對使用者操做水平的要求,最終任何用戶廣泛均可以輕鬆使用搜索來獲取符合專業要求的搜索結果。mongodb
考慮了一下市面上的幾個開源搜索引擎,最終選擇了elasticsearch。除了搜索功能外,elasticsearch仍是一個分佈式的數據庫。固然,咱們不會採用elasticsearch的數據庫存取功能,由於已經選擇了mongodb做爲大數據平臺數據庫。因此,最終的系統結構是一個mongodb+elasticsearch的搜索平臺:mongodb存儲原始業務數據,elasticsearch負責對這些業務數據進行索引構建。數據庫
從結構上說:elasticsearch的操做能夠分爲後臺批次型的索引構建(indexing)及前端實時的索引管理及搜索,包括對索引的CRUD,這些是經過elasticsearch提供的api來實現的。如上所述,elasticsearch也是某種數據庫管理系統,提供了多種語言的客戶端驅動,包括java。但後面咱們會用elastic4s:一個開源的scala elasticsearch客戶端,根據各類業務搜索場景,調用elasticsearch的各類api來實現行業專用的搜索功能。api