背景
我用lucene3.6,為php語言搭建的平台提供一套搜尋服務,但是lucene隻是個提供索引操作的庫,需要一個web-service來提供給java外的語言,使之可以通過http方式發送搜尋請求并得到如json, xml格式的查詢結果集資料。而solr是一個二次包裝了lucene庫的搜尋服務容器,相容lucene的api,可以在jetty或者tomcat這樣的容器裡以web服務的方式啟動并提供一套自己的索引建立,更新,删除,查詢接口,以及更進階更全面的接口服務。
關于solr
solr版本随着lucene版本的更新而相容更新,目前已經釋出4.0,我使用的是3.6版本。在配置中文分詞庫以及使用solrj來通路solr服務的時候,也因為版本比較新,遇到了一些問題,我會在下面詳細說明。我初步感受,solr和lucene有以下一些差別:
solr的索引建立主要有通過xml檔案讀取需要建索引的資料、通過solrj用api來adddocument,此外還有讀取cvs檔案,擷取post來的json資料以及直接從資料庫讀(dih)。來講講主要的索引建立方法。其實通過solrj用api裡的類和函數來建索引是類似于lucene的做法的,差别是兩者的api長的不一樣。但凡使用過lucene的人,就會覺得solrj的關鍵類和使用方法還是一目了然,比如下面這樣:
下載下傳solr後,在 {solr.home}/example/exampledocs 内會有一些xml,就是通過第一種建索引的方式用xml檔案導入資料。比如下面這樣:
這兩者都有個共同的問題,關于不同filed的分詞,store,analyze是怎麼處理的?
solr有兩個重要的配置檔案:scheme.xml和solrconfig.xml
scheme.xml主要配置:
每個fieldtype來自哪個類,是solr自帶的主要類型,還是你自己要加入的類,比如中文分詞的類,各舉一個例子:
上面第二個配置是我加的中文分詞,使用的是ikanalyzer,版本是2012u6,最新的版本。配置了filedtype之後,要在scheme.xml裡配置将要建立的索引字段的類型和資訊:
這樣應該解釋清楚了。至于,solrconfig.xml,主要是一些系統依賴,緩存配置,各種http的requesthandler的請求處理類等。
總結,就是solr的索引配置主要在xml裡,甚至資料也可以寫成xml,然後在cmd裡添加資料檔案,這就是封裝了lucene的結果,比lucene更高層一點,而我認為這樣的配置不怎麼友善,我的選擇是把自己用lucene建出來的索引塊直接丢到solr索引目錄裡,并在scheme.xml裡添加好字段,包括配置好中文分詞工具,因為solr和lucene是相容的,而包裝到來的效果就是api不夠底層。
再舉幾個小的方面,其實也可以說是solr比lucene進步的地方。lucene源碼裡,core包之外的随後整合的附加功能包highlighting在solr裡是已經配置完整,并且solr的搜尋url裡可以整合排序和高亮等要求,給幾個例子(hl是highlighting縮寫):
solr其實就是把lucene包裝之後,變成了一個web的服務,放在容器裡run起來後,可以通過http通路,作為一個中間件的服務存在。如果你自己做,也就是把lucene開發好之後寫一些servlet的東西,也放在tomcat,jetty裡面跑,然後接受url,做相應的response。solr的搜尋請求和資料導入方式比較多樣,适合不同開發者選用友善的特性适應需求,在solr
tutorial裡可以看到。
solr的安裝和配置
網上有很多資料,solr3.6版本的配置也沒有什麼特别的。下載下傳解壓之後,可以選擇直接進入 {solr.home}/example 目錄,用 java -jar start.jar在8983端口啟動服務,是在jetty容器裡啟動的,在 {solr.home}/example 子目錄下已經為你部署好了jetty,jsp的jar包以及環境配置。你也可以啟動自己的tomcat,把solr.war放到tomcat的webapp目錄下,注意的是需要在 {tomcat.home}/conf/catalina/localhost
下手動加一個solr.xml檔案,作用是指向你的{solr.home}路徑,讓tomcat找到你要啟動的web服務。比如我的:
啟動solr後,通過浏覽器就可以通路到你的solr服務,具體别的自己慢慢研究吧。
由于版本而導緻的問題并解決方案
首先是中文分詞器。我使用的是ikanalyzer2012_u6版本,ik,庖丁和mmseg是主流的三個支援lucene的分詞庫。但是中文分詞庫注定悲劇的地方在于總要跟着國外開源軟體的更新走,一旦lucene,solr更新了,某些基礎類改變或者接口變動,分詞器可能就不再支援了。iktokenizerfactory繼承自solr的basetokenizerfactory,但是basetokenizerfactory在solr3.6之後版本已經不存在了,如果你按照以前的配置方式在scheme裡配置:
啟動solr後報錯提示basetokenizerfactory類是找不到了的。是以隻能這樣配置:
再者是solrj版本。我的solr是3.6版本,我在ide裡使用的solrj是3.6.0版本的。通過maven的pom.xml裡的dependencis查找solrj,并自動擷取相關包之後,還是會出現問題。原因是httpsolrserver類還依賴别的包。那就是httpcomponents的httpclient和httpmime包,應該4.1後的版本是可以的,我依賴的是4.1.3。總之最後的pom.xml裡的配置是這樣的:
最後會依賴到下面這些jar包:
有了solr服務,有了中文分詞,有了solrj,搭建自己的solr搜尋服務平台就沒什麼問題了。最後給出一些相關基礎資料,友善使用solr:
solrj: http://wiki.apache.org/solr/solrj
solr tutorial: http://lucene.apache.org/solr/api-3_6_1/doc-files/tutorial.html
solr中文網:http://www.solrcn.com