資深程序員筆記:solr調用lucene底層實現倒排索引全流程解析

資深程序員筆記:solr調用lucene底層實現倒排索引全流程解析

1.什麼是Lucene?

作為一個開放源代碼項目,Lucene從問世之後,引發了開放源代碼社群的巨大反響,程序員們不僅使用它構建具體的全文檢索應用,而且將之集成到各種系統軟件中去,以及構建Web應用,甚至某些商業軟件也採用了Lucene作為其內部全文檢索子系統的核心。apache軟件基金會的網站使用了Lucene作為全文檢索的引擎,IBM的開源軟件eclipse的2.1版本中也採用了Lucene作為幫助子系統的全文索引引擎,相應的IBM的商業軟件Web Sphere中也採用了Lucene。Lucene以其開放源代碼的特性、優異的索引結構、良好的系統架構獲得了越來越多的應用。

Lucene作為一個全文檢索引擎,其具有如下突出的優點:

(1)索引文件格式獨立於應用平臺。Lucene定義了一套以8位字節為基礎的索引文件格式,使得兼容系統或者不同平臺的應用能夠共享建立的索引文件。

(2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然後通過與原有索引的合併,達到優化的目的。

(3)優秀的面向對象的系統架構,使得對於Lucene擴展的學習難度降低,方便擴充新功能。

(4)設計了獨立於語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只需要實現文本分析的接口。

(5)已經默認實現了一套強大的查詢引擎,用戶無需自己編寫代碼即使系統可獲得強大的查詢能力,Lucene的查詢實現中默認實現了布爾操作、模糊查詢(Fuzzy Search)、分組查詢等等。

2.什麼是solr?

為什麼要solr:

1、solr是將整個索引操作功能封裝好了的搜索引擎系統(企業級搜索引擎產品)

2、solr可以部署到單獨的服務器上(WEB服務),它可以提供服務,我們的業務系統就只要發送請求,接收響應即可,降低了業務系統的負載

3、solr部署在專門的服務器上,它的索引庫就不會受業務系統服務器存儲空間的限制

4、solr支持分佈式集群,索引服務的容量和能力可以線性擴展

solr的工作機制:

1、solr就是在lucene工具包的基礎之上進行了封裝,而且是以web服務的形式對外提供索引功能

2、業務系統需要使用到索引的功能(建索引,查索引)時,只要發出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是底層基礎,solr和lucene的關係正如hadoop和hdfs的關係。那麼solr是怎麼調用到lucene的呢?

我們以查詢為例,來看一下整個過程,導入過程可以參考:

solr源碼分析之數據導入DataImporter追溯

4.solr是怎麼調用到lucene?

4.1.準備工作

lucene-solr本地調試方法

使用內置jetty啟動main方法。

4.2 進入Solr-admin:http://localhost:8983/solr/

創建一個new_core集合

4.3 進入http://localhost:8983/solr/#/new_core/query

選擇一個field進行查詢

資深程序員筆記:solr調用lucene底層實現倒排索引全流程解析

4.4 入口是SolrDispatchFilter,整個流程如流程圖所示

資深程序員筆記:solr調用lucene底層實現倒排索引全流程解析

從上面的流程圖可以看出,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的底層文件結構,和一步步如何實現打分。


分享到:


相關文章: