1.什麼是Lucene?html
做爲一個開放源代碼項目,Lucene從問世以後,引起了開放源代碼社羣的巨大反響,程序員們不只使用它構建具體的全文檢索應用,並且將之集成到各類系統軟件中去,以及構建Web應用,甚至某些商業軟件也採用了Lucene做爲其內部全文檢索子系統的核心。apache軟件基金會的網站使用了Lucene做爲全文檢索的引擎,IBM的開源軟件eclipse的2.1版本中也採用了Lucene做爲幫助子系統的全文索引引擎,相應的IBM的商業軟件Web Sphere中也採用了Lucene。Lucene以其開放源代碼的特性、優異的索引結構、良好的系統架構得到了愈來愈多的應用。java
Lucene做爲一個全文檢索引擎,其具備以下突出的優勢:程序員
(1)索引文件格式獨立於應用平臺。Lucene定義了一套以8位字節爲基礎的索引文件格式,使得兼容系統或者不一樣平臺的應用可以共享創建的索引文件。web
(2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,可以針對新的文件創建小文件索引,提高索引速度。而後經過與原有索引的合併,達到優化的目的。spring
(3)優秀的面向對象的系統架構,使得對於Lucene擴展的學習難度下降,方便擴充新功能。apache
(4)設計了獨立於語言和文件格式的文本分析接口,索引器經過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只須要實現文本分析的接口。json
(5)已經默認實現了一套強大的查詢引擎,用戶無需本身編寫代碼即便系統可得到強大的查詢能力,Lucene的查詢實現中默認實現了布爾操做、模糊查詢(Fuzzy Search)、分組查詢等等。api
2.什麼是solr?服務器
爲何要solr:架構
一、solr是將整個索引操做功能封裝好了的搜索引擎系統(企業級搜索引擎產品)
二、solr能夠部署到單獨的服務器上(WEB服務),它能夠提供服務,咱們的業務系統就只要發送請求,接收響應便可,下降了業務系統的負載
三、solr部署在專門的服務器上,它的索引庫就不會受業務系統服務器存儲空間的限制
四、solr支持分佈式集羣,索引服務的容量和能力能夠線性擴展
solr的工做機制:
一、solr就是在lucene工具包的基礎之上進行了封裝,並且是以web服務的形式對外提供索引功能
二、業務系統須要使用到索引的功能(建索引,查索引)時,只要發出http請求,並將返回數據進行解析便可
Solr 是Apache下的一個頂級開源項目,採用Java開發,它是基於Lucene的全文搜索服務器。Solr提供了比Lucene更爲豐富的查詢語言,同時實現了可配置、可擴展,並對索引、搜索性能進行了優化。
Solr能夠獨立運行,運行在Jetty、Tomcat等這些Servlet容器中,Solr 索引的實現方法很簡單,用 POST 方法向 Solr 服務器發送一個描述 Field 及其內容的 XML 文檔,Solr根據xml文檔添加、刪除、更新索引 。Solr 搜索只須要發送 HTTP GET 請求,而後對 Solr 返回Xml、json等格式的查詢結果進行解析,組織頁面佈局。Solr不提供構建UI的功能,Solr提供了一個管理界面,經過管理界面能夠查詢Solr的配置和運行狀況。
3.lucene和solr的關係
solr是門戶,lucene是底層基礎,solr和lucene的關係正如hadoop和hdfs的關係。那麼solr是怎麼調用到lucene的呢?
咱們以查詢爲例,來看一下整個過程,導入過程能夠參考:
4.solr是怎麼調用到lucene?
4.1.準備工做
使用內置jetty啓動main方法。
4.2 進入Solr-admin:http://localhost:8983/solr/
建立一個new_core集合
4.3 進入http://localhost:8983/solr/#/new_core/query
選擇一個field進行查詢
4.4 入口是SolrDispatchFilter,整個流程如流程圖所示
從上面的流程圖能夠看出,solr採用filter的模式(如struts2,springmvc使用servlet模式),而後以容器的方式來封裝各類Handler,Handler負責處理各類請求,最終調用的是lucene的底層實現。
注意:solr沒有使用lucene自己的QueryParser,而是本身重寫了這個組件。
5.總結
從solr-lucene架構圖所示,solr封裝了handler來處理各類請求,底下是SearchComponent,分爲pre,process,post三階段處理,最後調用lucene的底層api。
lucene 底層經過Similarity來完成打分過程,詳細 介紹了lucene的底層文件結構,和一步步如何實現打分。
參考資料:
【1】http://www.blogjava.net/hoojo/archive/2012/09/06/387140.html